diff --git a/Implem.CodeDefiner/Implem.CodeDefiner.csproj b/Implem.CodeDefiner/Implem.CodeDefiner.csproj index 18e0cc203..f1f5827a8 100644 --- a/Implem.CodeDefiner/Implem.CodeDefiner.csproj +++ b/Implem.CodeDefiner/Implem.CodeDefiner.csproj @@ -3,11 +3,12 @@ Exe net8.0 - Copyright © Implem Inc 2014 - 2024 + $([System.DateTime]::Now.Year.ToString()) + Copyright © Implem Inc 2014 - $(Year) 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.4.11.0 - 1.4.11.0 - 1.4.11.0 + 1.4.12.0 + 1.4.12.0 + 1.4.12.0 Linux diff --git a/Implem.DefinitionAccessor/Def.cs b/Implem.DefinitionAccessor/Def.cs index 6ee81ea82..f44cacbe2 100644 --- a/Implem.DefinitionAccessor/Def.cs +++ b/Implem.DefinitionAccessor/Def.cs @@ -819,6 +819,7 @@ public static void SetCodeDefinition() case "Model_Utilities_Export": Code.Model_Utilities_Export = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_Utilities_Export, definitionRow, CodeXls); break; case "Model_Utilities_ExportCrosstab": Code.Model_Utilities_ExportCrosstab = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_Utilities_ExportCrosstab, definitionRow, CodeXls); break; case "Model_Utilities_FieldCases": Code.Model_Utilities_FieldCases = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_Utilities_FieldCases, definitionRow, CodeXls); break; + case "Model_Utilities_FieldCases_RawValue": Code.Model_Utilities_FieldCases_RawValue = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_Utilities_FieldCases_RawValue, definitionRow, CodeXls); break; case "Model_Utilities_FieldResponse": Code.Model_Utilities_FieldResponse = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_Utilities_FieldResponse, definitionRow, CodeXls); break; case "Model_Utilities_FieldResponse_ColumnCases": Code.Model_Utilities_FieldResponse_ColumnCases = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_Utilities_FieldResponse_ColumnCases, definitionRow, CodeXls); break; case "Model_Utilities_FieldResponse_ToResponsel": Code.Model_Utilities_FieldResponse_ToResponsel = definitionRow[1].ToString().NoSpace(definitionRow["NoSpace"].ToBool()); SetCodeTable(CodeTable.Model_Utilities_FieldResponse_ToResponsel, definitionRow, CodeXls); break; @@ -7348,6 +7349,7 @@ public class CodeColumn2nd public string Model_Utilities_Export; public string Model_Utilities_ExportCrosstab; public string Model_Utilities_FieldCases; + public string Model_Utilities_FieldCases_RawValue; public string Model_Utilities_FieldResponse; public string Model_Utilities_FieldResponse_ColumnCases; public string Model_Utilities_FieldResponse_ToResponsel; @@ -8195,6 +8197,7 @@ public class CodeTable public CodeDefinition Model_Utilities_Export = new CodeDefinition(); public CodeDefinition Model_Utilities_ExportCrosstab = new CodeDefinition(); public CodeDefinition Model_Utilities_FieldCases = new CodeDefinition(); + public CodeDefinition Model_Utilities_FieldCases_RawValue = new CodeDefinition(); public CodeDefinition Model_Utilities_FieldResponse = new CodeDefinition(); public CodeDefinition Model_Utilities_FieldResponse_ColumnCases = new CodeDefinition(); public CodeDefinition Model_Utilities_FieldResponse_ToResponsel = new CodeDefinition(); diff --git a/Implem.DefinitionAccessor/Implem.DefinitionAccessor.csproj b/Implem.DefinitionAccessor/Implem.DefinitionAccessor.csproj index a26c9ed00..e65d5411d 100644 --- a/Implem.DefinitionAccessor/Implem.DefinitionAccessor.csproj +++ b/Implem.DefinitionAccessor/Implem.DefinitionAccessor.csproj @@ -2,10 +2,11 @@ net8.0 - Copyright © Implem Inc 2014 - 2024 - 1.4.11.0 - 1.4.11.0 - 1.4.11.0 + $([System.DateTime]::Now.Year.ToString()) + Copyright © Implem Inc 2014 - $(Year) + 1.4.12.0 + 1.4.12.0 + 1.4.12.0 disable diff --git a/Implem.DisplayAccessor/Implem.DisplayAccessor.csproj b/Implem.DisplayAccessor/Implem.DisplayAccessor.csproj index cf69e9997..4065671ac 100644 --- a/Implem.DisplayAccessor/Implem.DisplayAccessor.csproj +++ b/Implem.DisplayAccessor/Implem.DisplayAccessor.csproj @@ -2,10 +2,11 @@ net8.0 - Copyright © Implem Inc 2014 - 2024 - 1.4.11.0 - 1.4.11.0 - 1.4.11.0 + $([System.DateTime]::Now.Year.ToString()) + Copyright © Implem Inc 2014 - $(Year) + 1.4.12.0 + 1.4.12.0 + 1.4.12.0 disable diff --git a/Implem.Factory/Implem.Factory.csproj b/Implem.Factory/Implem.Factory.csproj index 1d833e990..bc82c2ae1 100644 --- a/Implem.Factory/Implem.Factory.csproj +++ b/Implem.Factory/Implem.Factory.csproj @@ -2,10 +2,11 @@ net8.0 - Copyright © Implem Inc 2014 - 2024 - 1.4.11.0 - 1.4.11.0 - 1.4.11.0 + $([System.DateTime]::Now.Year.ToString()) + Copyright © Implem Inc 2014 - $(Year) + 1.4.12.0 + 1.4.12.0 + 1.4.12.0 disable diff --git a/Implem.Libraries/Implem.Libraries.csproj b/Implem.Libraries/Implem.Libraries.csproj index 5784cf2db..0bc908a64 100644 --- a/Implem.Libraries/Implem.Libraries.csproj +++ b/Implem.Libraries/Implem.Libraries.csproj @@ -2,10 +2,11 @@ net8.0 - Copyright © Implem Inc 2014 - 2024 - 1.4.11.0 - 1.4.11.0 - 1.4.11.0 + $([System.DateTime]::Now.Year.ToString()) + Copyright © Implem Inc 2014 - $(Year) + 1.4.12.0 + 1.4.12.0 + 1.4.12.0 disable diff --git a/Implem.Libraries/Utilities/Strings.cs b/Implem.Libraries/Utilities/Strings.cs index 1e35fd0db..2342ae13a 100644 --- a/Implem.Libraries/Utilities/Strings.cs +++ b/Implem.Libraries/Utilities/Strings.cs @@ -12,10 +12,14 @@ public static string MaxLength(this string self, int maxLength) : self ?? string.Empty; } - public static bool IsNullOrEmpty(this string self) - { - return string.IsNullOrEmpty(self); - } + public static bool IsNullOrEmpty(this string self) + => string.IsNullOrEmpty(self); + + public static bool IsNullOrWhiteSpace(this string self) + => string.IsNullOrWhiteSpace(self); + + public static bool IsNoValidCharacters(this string self) + => self.IsNullOrEmpty() || self.IsNullOrWhiteSpace(); public static string IsNotEmpty(this string self, string trueStr = null) { @@ -49,7 +53,7 @@ public static string ToLowerFirstChar(this string self) : strTemp; } - public static string ToUpperFirstChar(this string self) + public static string ToUpperFirstChar(this string self) { return !self.IsNullOrEmpty() ? self.Length == 1 @@ -106,11 +110,11 @@ public static string EnclosedString(string self) { switch (self[count]) { - case '(': - openCount++; - started = true; + case '(': + openCount++; + started = true; break; - case ')': + case ')': openCount--; if (started && openCount == 0) { diff --git a/Implem.ParameterAccessor/Implem.ParameterAccessor.csproj b/Implem.ParameterAccessor/Implem.ParameterAccessor.csproj index 3b181498d..70f664d0c 100644 --- a/Implem.ParameterAccessor/Implem.ParameterAccessor.csproj +++ b/Implem.ParameterAccessor/Implem.ParameterAccessor.csproj @@ -2,10 +2,11 @@ net8.0 - Copyright © Implem Inc 2014 - 2024 - 1.4.11.0 - 1.4.11.0 - 1.4.11.0 + $([System.DateTime]::Now.Year.ToString()) + Copyright © Implem Inc 2014 - $(Year) + 1.4.12.0 + 1.4.12.0 + 1.4.12.0 disable diff --git a/Implem.ParameterAccessor/Parts/General.cs b/Implem.ParameterAccessor/Parts/General.cs index a1f61bca0..fe975ea98 100644 --- a/Implem.ParameterAccessor/Parts/General.cs +++ b/Implem.ParameterAccessor/Parts/General.cs @@ -1,109 +1,118 @@ using System; +using System.ComponentModel; namespace Implem.ParameterAccessor.Parts { public class General { - public string HtmlHeadKeywords; - public string HtmlHeadDescription; - public string HtmlHeadViewport; - public string HtmlLogoText; - public string HtmlPortalUrl; - public string HtmlApplicationBuildingGuideUrl; - public string HtmlUserManualUrl; - public string HtmlBlogUrl; - public string HtmlSupportUrl; - public string HtmlContactUrl; - public string HtmlAGPLUrl; - public string HtmlEnterPriseEditionUrl; - public string HtmlCasesUrl; - public string HtmlUrlPrefix; - public bool DisplayLogoText; - public bool DisableAutoComplete; - public int SiteMenuHotSpan; - public bool AnchorTargetBlank; - public int LimitWarning1; - public int LimitWarning2; - public int LimitWarning3; - public int DeleteTempOldThan; - public int DeleteHistoriesOldThan; - public int NearCompletionTimeBeforeDays; - public int NearCompletionTimeBeforeDaysMin; - public int NearCompletionTimeBeforeDaysMax; - public int NearCompletionTimeAfterDays; - public int NearCompletionTimeAfterDaysMin; - public int NearCompletionTimeAfterDaysMax; - public int GridPageSize; - public int GridPageSizeMin; - public int GridPageSizeMax; - public bool AllowViewReset; - public int ExportOutputColumnMax; - public string ImportEncoding; - public bool UpdatableImport; - public bool AllowStandardExport; - public int ImportMax; - public int ViewerSwitchingType; - public bool UseNegativeFilters; - public bool AllowCopy; - public bool AllowReferenceCopy; - public string CharToAddWhenCopying; - public int UpdateResponseType; - public string SolutionBackupPath; - public string SolutionBackupExcludeDirectories; - public int SizeToUseTextArea; - public int CompletionCode; - public int CommentDisplayLimitHistories; - public int CommentDisplayLimit; - public int WorkValueHeight; - public int WorkValueTextTop; - public int ProgressRateWidth; - public int ProgressRateItemHeight; - public int ProgressRateTextTop; - public int CalendarBegin; - public int CalendarEnd; - public int CalendarLimit; - public int CalendarYLimit; - public int DefaultCalendarType; - public int CrosstabBegin; - public int CrosstabEnd; - public int CrosstabXLimit; - public int CrosstabYLimit; - public int GanttLimit; - public int GanttPeriodMin; - public int GanttPeriodMax; - public int BurnDownLimit; - public int TimeSeriesLimit; - public int AnalyPartPeriodValueMin; - public int AnalyPartPeriodValueMax; - public int KambanLimit; - public int KambanXLimit; - public int KambanYLimit; - public int KambanMinColumns; - public int KambanMaxColumns; - public int KambanColumns; - public int ImageLibPageSize; - public int ImageLibPageSizeMin; - public int ImageLibPageSizeMax; - public int ImageSizeRegular; - public int ImageSizeThumbnail; - public int ImageSizeIcon; - public int ImageSizeLogo; - public int DropDownSearchPageSize; - public int SwitchTargetsLimit; - public int SeparateMin; - public int SeparateMax; - public int FirstDayOfWeek; - public int FirstMonth; - public int DateFilterMinSpan; - public int DateFilterMaxSpan; - public DateTime MinTime; - public DateTime MaxTime; - public int DateTimeStep; - public bool HideCurrentTimeIcon; - public bool HideCurrentUserIcon; - public bool HideCurrentDeptIcon; - public bool EnableLightBox; - public bool EnableCodeEditor; - public int GroupsDepthMax; - public int BulkUpsertMax; + public string HtmlHeadKeywords { get; set; } + public string HtmlHeadDescription { get; set; } + public string HtmlHeadViewport { get; set; } + public string HtmlLogoText { get; set; } + public string HtmlPortalUrl { get; set; } + public string HtmlApplicationBuildingGuideUrl { get; set; } + public string HtmlUserManualUrl { get; set; } + public string HtmlBlogUrl { get; set; } + public string HtmlSupportUrl { get; set; } + public string HtmlContactUrl { get; set; } + public string HtmlAGPLUrl { get; set; } + public string HtmlEnterPriseEditionUrl { get; set; } + public string HtmlCasesUrl { get; set; } + public string HtmlUrlPrefix { get; set; } + public bool DisplayLogoText { get; set; } + public bool DisableAutoComplete { get; set; } + public int SiteMenuHotSpan { get; set; } + public bool AnchorTargetBlank { get; set; } + public int LimitWarning1 { get; set; } + public int LimitWarning2 { get; set; } + public int LimitWarning3 { get; set; } + public int DeleteTempOldThan { get; set; } + public int DeleteHistoriesOldThan { get; set; } + public int NearCompletionTimeBeforeDays { get; set; } + public int NearCompletionTimeBeforeDaysMin { get; set; } + public int NearCompletionTimeBeforeDaysMax { get; set; } + public int NearCompletionTimeAfterDays { get; set; } + public int NearCompletionTimeAfterDaysMin { get; set; } + public int NearCompletionTimeAfterDaysMax { get; set; } + public int GridPageSize { get; set; } + public int GridPageSizeMin { get; set; } + public int GridPageSizeMax { get; set; } + public bool AllowViewReset { get; set; } + public int ExportOutputColumnMax { get; set; } + public string ImportEncoding { get; set; } + public bool UpdatableImport { get; set; } + public bool AllowStandardExport { get; set; } + public int ImportMax { get; set; } + public int ViewerSwitchingType { get; set; } + public bool UseNegativeFilters { get; set; } + public bool AllowCopy { get; set; } + public bool AllowReferenceCopy { get; set; } + public string CharToAddWhenCopying { get; set; } + [DefaultValue(@"(? script.WhenloadingSiteSettings == true, - condition: "WhenloadingSiteSettings"); + condition: ServerScriptConditions.WhenloadingSiteSettings); SetServerScriptModelColumns(context: context, ss: ss, scriptValues: scriptValues); @@ -755,7 +755,7 @@ namespace Implem.Pleasanter.Models itemModel: null, view: view, where: script => script.BeforeOpeningPage == true, - condition: "BeforeOpeningPage"); + condition: ServerScriptConditions.BeforeOpeningPage); if (scriptValues != null) { SetServerScriptModelColumns(context: context, @@ -829,7 +829,7 @@ namespace Implem.Pleasanter.Models itemModel: this, view: null, where: script => script.WhenloadingRecord == true, - condition: "WhenloadingRecord"); + condition: ServerScriptConditions.WhenloadingRecord); if (scriptValues != null) { ServerScriptModelRow = scriptValues; @@ -846,7 +846,7 @@ namespace Implem.Pleasanter.Models itemModel: this, view: null, where: script => script.BeforeFormula == true, - condition: "BeforeFormula"); + condition: ServerScriptConditions.BeforeFormula); } public override void SetByAfterFormulaServerScript(Context context, SiteSettings ss) @@ -858,7 +858,7 @@ namespace Implem.Pleasanter.Models itemModel: this, view: null, where: script => script.AfterFormula == true, - condition: "AfterFormula"); + condition: ServerScriptConditions.AfterFormula); } public void SetByAfterUpdateServerScript( @@ -872,7 +872,7 @@ namespace Implem.Pleasanter.Models itemModel: this, view: null, where: script => script.AfterUpdate == true, - condition: "AfterUpdate"); + condition: ServerScriptConditions.AfterUpdate); } public void SetByBeforeUpdateServerScript( @@ -886,7 +886,7 @@ namespace Implem.Pleasanter.Models itemModel: this, view: null, where: script => script.BeforeUpdate == true, - condition: "BeforeUpdate"); + condition: ServerScriptConditions.BeforeUpdate); } public void SetByAfterCreateServerScript( @@ -900,7 +900,7 @@ namespace Implem.Pleasanter.Models itemModel: this, view: null, where: script => script.AfterCreate == true, - condition: "AfterCreate"); + condition: ServerScriptConditions.AfterCreate); } public void SetByBeforeCreateServerScript( @@ -914,7 +914,7 @@ namespace Implem.Pleasanter.Models itemModel: this, view: null, where: script => script.BeforeCreate == true, - condition: "BeforeCreate"); + condition: ServerScriptConditions.BeforeCreate); } public void SetByAfterDeleteServerScript( @@ -928,7 +928,7 @@ namespace Implem.Pleasanter.Models itemModel: this, view: null, where: script => script.AfterDelete == true, - condition: "AfterDelete"); + condition: ServerScriptConditions.AfterDelete); } public void SetByBeforeDeleteServerScript( @@ -942,7 +942,7 @@ namespace Implem.Pleasanter.Models itemModel: this, view: null, where: script => script.BeforeDelete == true, - condition: "BeforeDelete"); + condition: ServerScriptConditions.BeforeDelete); } public override ServerScriptModelRow SetByBeforeOpeningRowServerScript( @@ -957,7 +957,7 @@ namespace Implem.Pleasanter.Models itemModel: this, view: view, where: script => script.BeforeOpeningRow == true, - condition: "BeforeOpeningRow"); + condition: ServerScriptConditions.BeforeOpeningRow); if (scriptValues != null) { SetServerScriptModelColumns(context: context, @@ -981,7 +981,7 @@ namespace Implem.Pleasanter.Models itemModel: this, view: view, where: script => script.BeforeOpeningPage == true, - condition: "BeforeOpeningPage"); + condition: ServerScriptConditions.BeforeOpeningPage); if (scriptValues != null) { SetServerScriptModelColumns( diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/HtmlLinks_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/HtmlLinks_Body.txt index c31f30afd..ee65634c7 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/HtmlLinks_Body.txt +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/HtmlLinks_Body.txt @@ -200,7 +200,8 @@ namespace Implem.Pleasanter.Libraries.HtmlParts linkId: id, sourceId: link.SourceId, text: link.SiteTitle, - tabIndex: tabIndex)); + tabIndex: tabIndex, + notReturnParentRecord: link.NotReturnParentRecord ?? false)); } hb.LinkTable( context: context, diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByFormula_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByFormula_Body.txt index 8809c9234..70158095c 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByFormula_Body.txt +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SetByFormula_Body.txt @@ -130,7 +130,7 @@ private string ExecFormulaExtended( context: context, method: nameof(SetByFormula), message: $"Formula error {value}", - sysLogType: SysLogModel.SysLogTypes.Execption); + sysLogType: SysLogModel.SysLogTypes.Exception); break; } if (outputFormulaLogs == true) diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SwitchItemsOtherMethods_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SwitchItemsOtherMethods_Body.txt index b309d681e..b6fd6a64a 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SwitchItemsOtherMethods_Body.txt +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_SwitchItemsOtherMethods_Body.txt @@ -12,10 +12,16 @@ public string SynchronizeSummaries(Context context) { SetSite(context: context); var selected = context.Forms.IntList("EditSummary"); + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return Messages.ImportLock(context: context).ToJson(); + } var result = SiteUtilities.SynchronizeSummaries( context: context, siteModel: Site, - selected: selected); + selected: selected, + watchdog: () => exclusiveObj.Refresh()); if (result.Type == Error.Types.None) { return Messages.ResponseSynchronizationCompleted(context: context).ToJson(); @@ -44,10 +50,19 @@ public ContentResultInheritance SynchronizeSummariesByApi(Context context) sysLogsStatus: 400, sysLogsDescription: Debugs.GetSysLogsDescription())); } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return ApiResults.Get(new ApiResponse( + id: context.Id, + statusCode: 429, + message: Messages.ImportLock(context: context).Text)); + } var result = SiteUtilities.SynchronizeSummaries( context: context, siteModel: Site, - selected: selected); + selected: selected, + watchdog: () => exclusiveObj.Refresh()); if (result.Type == Error.Types.SelectTargets) { return ApiResults.Success( diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkDeleteByApi_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkDeleteByApi_Body.txt index 917af4716..999b9adea 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkDeleteByApi_Body.txt +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkDeleteByApi_Body.txt @@ -20,6 +20,14 @@ { return ApiResults.Get(ApiResponses.BadRequest(context: context)); } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return ApiResults.Get(new ApiResponse( + id: context.Id, + statusCode: 429, + message: Messages.ImportLock(context: context).Text)); + } var view = recordSelector.View ?? Views.GetBySession( context: context, ss: ss); @@ -48,11 +56,14 @@ context: context, errorData: invalid); } + exclusiveObj.Refresh(); var count = BulkDelete( context: context, ss: ss, where: where, - param: param); + param: param, + watchdog: () => exclusiveObj.Refresh()); + exclusiveObj.Refresh(); Summaries.Synchronize( context: context, ss: ss); @@ -113,6 +124,11 @@ public static long BulkDeleteByServerScript( { return 0; } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return 0; + } var view = recordSelector.View ?? Views.GetBySession( context: context, ss: ss); @@ -139,11 +155,13 @@ public static long BulkDeleteByServerScript( default: return 0; } + exclusiveObj.Refresh(); var count = BulkDelete( context: context, ss: ss, where: where, - param: param); + param: param, + watchdog: () => exclusiveObj.Refresh()); Summaries.Synchronize( context: context, ss: ss); diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkDelete_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkDelete_Body.txt index 9a5d8ab9a..8c02daea3 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkDelete_Body.txt +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkDelete_Body.txt @@ -33,11 +33,18 @@ case Error.Types.None: break; default: return invalid.MessageJson(context: context); } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return Error.Types.ImportLock.MessageJson(context: context); + } var count = BulkDelete( context: context, ss: ss, where: where, - param: param); + param: param, + watchdog: () => exclusiveObj.Refresh()); + exclusiveObj.Refresh(); Summaries.Synchronize(context: context, ss: ss); var data = new string[] { @@ -64,6 +71,7 @@ body: body.ToString()); } }); + exclusiveObj.Refresh(); return GridRows( context: context, ss: ss, @@ -82,7 +90,8 @@ public static int BulkDelete( Context context, SiteSettings ss, SqlWhereCollection where, - SqlParamCollection param) + SqlParamCollection param, + Action watchdog = null) { var sub = Rds.Select#TableName#( column: Rds.#TableName#Column().#ModelName#Id(), @@ -146,6 +155,7 @@ public static int BulkDelete( statements.OnBulkDeletedExtendedSqls( context: context, siteId: ss.SiteId); + watchdog?.Invoke(); var ids = Rds.ExecuteTable( context: context, statements: Rds.SelectBinaries( @@ -156,6 +166,7 @@ public static int BulkDelete( .AsEnumerable() .Select(dataRow => dataRow.Long("ReferenceId")) .ToList(); + watchdog?.Invoke(); var affectedRows = Repository.ExecuteScalar_response( context: context, transactional: true, diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkUpdate_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkUpdate_Body.txt index 80faa3527..a71bf0626 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkUpdate_Body.txt +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkUpdate_Body.txt @@ -136,11 +136,17 @@ public static string BulkUpdate(Context context, SiteSettings ss) case Error.Types.None: break; default: return invalid.MessageJson(context: context); } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return Error.Types.ImportLock.MessageJson(context: context); + } var count = BulkUpdate( context: context, ss: ss, columns: columns, - where: where); + where: where, + watchdog: () => exclusiveObj.Refresh()); var data = new string[] { ss.Title, @@ -186,13 +192,15 @@ private static int BulkUpdate( Context context, SiteSettings ss, List columns, - SqlWhereCollection where) + SqlWhereCollection where, + Action watchdog = null) { var onBulkUpdatingExtendedStatements = new List().OnBulkUpdatingExtendedSqls( context: context, siteId: ss.SiteId); if (onBulkUpdatingExtendedStatements.Count > 0) { + watchdog?.Invoke(); Repository.ExecuteNonQuery( context: context, transactional: true, @@ -210,6 +218,7 @@ private static int BulkUpdate( }), where: where).ForEach(#modelName#Model => { + watchdog?.Invoke(); #modelName#Model.SetByForm( context: context, ss: ss, @@ -232,6 +241,7 @@ private static int BulkUpdate( siteId: ss.SiteId); if (onBulkUpdatedExtendedStatements.Count > 0) { + watchdog?.Invoke(); Repository.ExecuteNonQuery( context: context, transactional: true, diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkUpsertByApi_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkUpsertByApi_Body.txt index 226f5289c..48a5a273b 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkUpsertByApi_Body.txt +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_BulkUpsertByApi_Body.txt @@ -23,6 +23,14 @@ context: context, data: Parameters.General.BulkUpsertMax.ToString()).Text)); } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return ApiResults.Get(new ApiResponse( + id: context.Id, + statusCode: 429, + message: Messages.ImportLock(context: context).Text)); + } var recodeCount = 0; var insertCount = 0; var updateCount = 0; @@ -30,6 +38,7 @@ foreach (var #modelName#ApiModel in list.Data) { recodeCount++; + exclusiveObj.Refresh(); var view = api.View ?? new View(); api.Keys?.ForEach(columnName => { @@ -133,6 +142,7 @@ insertCount++; } } + exclusiveObj.Refresh(); if (error.Type != Error.Types.None) { var errMessage = error.Data?.Any() == true diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreateByApi_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreateByApi_Body.txt index e891501e4..97ef0cf82 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreateByApi_Body.txt +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_CreateByApi_Body.txt @@ -15,6 +15,10 @@ { context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); } + if(HasInvalidValueAsApiDataAtCreate(#modelName#ApiModel)) + { + context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); + } var #modelName#Model = new #ModelName#Model( context: context, ss: ss, @@ -76,6 +80,10 @@ public static bool CreateByServerScript(Context context, SiteSettings ss, object { context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); } + if(HasInvalidValueAsApiDataAtCreate(#modelName#ApiModel)) + { + context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); + } var #modelName#Model = new #ModelName#Model( context: context, ss: ss, @@ -116,4 +124,26 @@ public static bool CreateByServerScript(Context context, SiteSettings ss, object default: return false; } +} + +private static bool HasInvalidValueAsApiDataAtCreate(#ModelName#ApiModel model) +{ + if (model is null) + return false; + + foreach (var o in model.AttachmentsHash) + { + foreach (var attachment in o.Value) + { + if (attachment.Deleted ?? false) + continue; + + if (attachment.Name.IsNullOrEmpty()) + return true; + + if (attachment.Base64 is null && attachment.Base64Binary is null) + return true; + } + } + return false; } \ 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 1f9d20146..7a33bc2d2 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 @@ -463,6 +463,10 @@ public static HtmlBuilder Field( context: context, ss: ss, column: column); + var rawValue = #modelName#Model.ControlRawValue( + context: context, + ss: ss, + column: column); if (value != null) { value += #modelName#Model.NumUnit( @@ -482,6 +486,7 @@ public static HtmlBuilder Field( ?.ServerScriptModelRow ?.Columns.Get(column.ColumnName), value: value, + rawValue: rawValue, @@ -839,6 +844,61 @@ public static string ControlValue( } } +public static object ControlRawValue( + this #ModelName#Model #modelName#Model, + Context context, + SiteSettings ss, + Column column) +{ + switch (column.Name) + { + + + + default: + switch (Def.ExtendedColumnTypes.Get(column?.Name ?? string.Empty)) + { + case "Class": + return #modelName#Model.GetClass(columnName: column.Name) + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Num": + return #modelName#Model.GetNum(columnName: column.Name) + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Date": + return #modelName#Model.GetDate(columnName: column.Name) + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Description": + return #modelName#Model.GetDescription(columnName: column.Name) + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Check": + return #modelName#Model.GetCheck(columnName: column.Name) + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Attachments": + return #modelName#Model.GetAttachments(columnName: column.Name) + .ToApiValue( + context: context, + ss: ss, + column: column); + default: return null; + } + } +} + private static HtmlBuilder MainCommandExtensions( this HtmlBuilder hb, Context context, diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Export_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Export_Body.txt index 57fea4356..3c9bbb037 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Export_Body.txt +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Export_Body.txt @@ -182,6 +182,14 @@ public static ContentResultInheritance ExportByApi( { return ApiResults.Get(ApiResponses.BadRequest(context: context)); } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return ApiResults.Get(new ApiResponse( + id: context.Id, + statusCode: 429, + message: Messages.ImportLock(context: context).Text)); + } var export = api.Export ?? ss.GetExport( context: context, id: api.ExportId); diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_FieldCases_RawValue.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_FieldCases_RawValue.json new file mode 100644 index 000000000..567c54c1c --- /dev/null +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_FieldCases_RawValue.json @@ -0,0 +1,9 @@ +{ + "Id": "Model_Utilities_FieldCases_RawValue", + "RepeatType": "Column", + "Indent": "4", + "Separator": "\\r\\n", + "EditorColumn": "1", + "Exclude": "CreatedTime,UpdatedTime,Timestamp,Comments", + "ExcludeTypeName": "image" +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_FieldCases_RawValue_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_FieldCases_RawValue_Body.txt new file mode 100644 index 000000000..05a23dd90 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_FieldCases_RawValue_Body.txt @@ -0,0 +1,6 @@ +case "#ColumnName#": + return #modelName#Model.#ColumnName# + .ToApiValue( + context: context, + ss: ss, + column: column); \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Import_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Import_Body.txt index 29a9d84f0..88d423086 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Import_Body.txt +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_Import_Body.txt @@ -13,6 +13,11 @@ case Error.Types.None: break; default: return invalid.MessageJson(context: context); } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return Error.Types.ImportLock.MessageJson(context: context); + } var res = new ResponseCollection(context: context); Csv csv; try @@ -25,6 +30,7 @@ { return Messages.ResponseFailedReadFile(context: context).ToJson(); } + exclusiveObj.Refresh(); var count = csv.Rows.Count(); if (Parameters.General.ImportMax > 0 && Parameters.General.ImportMax < count) { @@ -74,6 +80,7 @@ .ToDictionary(o => o.Index, o => o.Row); foreach (var data in csvRows) { + exclusiveObj.Refresh(); var #modelName#Model = new #ModelName#Model( context: context, ss: ss); @@ -125,6 +132,7 @@ var updateCount = 0; foreach (var data in #modelName#Hash) { + exclusiveObj.Refresh(); var #modelName#Model = data.Value; if (#modelName#Model.AccessStatus == Databases.AccessStatuses.Selected) @@ -268,6 +276,14 @@ public static ContentResultInheritance ImportByApi( { return null; } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return ApiResults.Get(new ApiResponse( + id: context.Id, + statusCode: 429, + message: Messages.ImportLock(context: context).Text)); + } var invalid = #ModelName#Validators.OnImporting( context: context, ss: ss, @@ -360,6 +376,7 @@ public static ContentResultInheritance ImportByApi( .ToDictionary(o => o.Index, o => o.Row); foreach (var data in csvRows) { + exclusiveObj.Refresh(); var #modelName#Model = new #ModelName#Model( context: context, ss: ss); @@ -419,6 +436,7 @@ public static ContentResultInheritance ImportByApi( var updateCount = 0; foreach (var data in #modelName#Hash) { + exclusiveObj.Refresh(); var #modelName#Model = data.Value; if (#modelName#Model.AccessStatus == Databases.AccessStatuses.Selected) { @@ -526,6 +544,7 @@ public static ContentResultInheritance ImportByApi( insertCount++; } } + exclusiveObj.Refresh(); ImportUtilities.SetOnImportedExtendedSqls(context, ss); ss.Notifications.ForEach(notification => { diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_PhysicalBulkDeleteByApi_Items_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_PhysicalBulkDeleteByApi_Items_Body.txt index 11ce1ba5b..9a9c763e4 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_PhysicalBulkDeleteByApi_Items_Body.txt +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_PhysicalBulkDeleteByApi_Items_Body.txt @@ -97,6 +97,11 @@ public static long PhysicalBulkDeleteByServerScript( { return 0; } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return 0; + } var view = recordSelector.View ?? Views.GetBySession( context: context, ss: ss); diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateByApi_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateByApi_Body.txt index 8b144e1e1..b7b1563f2 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateByApi_Body.txt +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Utilities_UpdateByApi_Body.txt @@ -13,6 +13,10 @@ { context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); } + if(HasInvalidValueAsApiDataAtUpdate(#modelName#ApiModel)) + { + context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); + } var #modelName#Model = new #ModelName#Model( context: context, ss: ss, @@ -84,6 +88,10 @@ public static bool UpdateByServerScript( { context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); } + if(HasInvalidValueAsApiDataAtUpdate(#modelName#ApiModel)) + { + context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); + } var #modelName#Model = new #ModelName#Model( context: context, ss: ss, @@ -134,4 +142,25 @@ public static bool UpdateByServerScript( default: return false; } -} \ No newline at end of file +} + private static bool HasInvalidValueAsApiDataAtUpdate(#ModelName#ApiModel model) + { + if (model is null) + return false; + + foreach (var o in model.AttachmentsHash) + { + foreach (var attachment in o.Value) + { + if (attachment.Deleted ?? false) + continue; + + if (attachment.Name.IsNullOrEmpty()) + return true; + + if (attachment.Base64 is null && attachment.Base64Binary is null) + return true; + } + } + return false; + } \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Validator_OnAttachingMethod_Body.txt b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Validator_OnAttachingMethod_Body.txt index 6a26dc30c..091d35897 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Validator_OnAttachingMethod_Body.txt +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Code/Model_Validator_OnAttachingMethod_Body.txt @@ -25,35 +25,35 @@ return new ErrorData( context: context, type: Error.Types.OverLimitSize, - data: column.LimitSize.ToInt().ToString(), + data: column.LimitSize.ToString(), sysLogsStatus: 400, sysLogsDescription: Debugs.GetSysLogsDescription()); case Error.Types.OverTotalLimitSize: return new ErrorData( context: context, type: Error.Types.OverTotalLimitSize, - data: column.TotalLimitSize.ToInt().ToString(), + data: column.TotalLimitSize.ToString(), sysLogsStatus: 400, sysLogsDescription: Debugs.GetSysLogsDescription()); case Error.Types.OverLocalFolderLimitSize: return new ErrorData( context: context, type: Error.Types.OverLocalFolderLimitSize, - data: column.LocalFolderLimitSize.ToInt().ToString(), + data: column.LocalFolderLimitSize.ToString(), sysLogsStatus: 400, sysLogsDescription: Debugs.GetSysLogsDescription()); case Error.Types.OverLocalFolderTotalLimitSize: return new ErrorData( context: context, type: Error.Types.OverLocalFolderTotalLimitSize, - data: column.LocalFolderTotalLimitSize.ToInt().ToString(), + data: column.LocalFolderTotalLimitSize.ToString(), sysLogsStatus: 400, sysLogsDescription: Debugs.GetSysLogsDescription()); case Error.Types.OverTenantStorageSize: return new ErrorData( context: context, type: Error.Types.OverTenantStorageSize, - data: context.ContractSettings.StorageSize.ToInt().ToString(), + data: context.ContractSettings.StorageSize.ToString(), sysLogsStatus: 400, sysLogsDescription: Debugs.GetSysLogsDescription()); } diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Column/SysLogs_SysLogType.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Column/SysLogs_SysLogType.json index a7e3e32e6..694757935 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Column/SysLogs_SysLogType.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Column/SysLogs_SysLogType.json @@ -23,7 +23,7 @@ "EnumColumn": "1", "UpdateAccessControl": "ManageService", "ControlType": "ChoicesText", - "ChoicesText": "10,Info\n50,Warning\n60,UserError\n80,SystemError\n90,Execption", + "ChoicesText": "10,Info\n50,Warning\n60,UserError\n80,SystemError\n90,Exception", "LabelText_en": "Log type", "LabelText_zh": "日志类型", "LabelText_de": "Protokolltyp", diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Template/Template80_SiteSettingsTemplate.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Template/Template80_SiteSettingsTemplate.json index a8ec34b25..77464cd8e 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Template/Template80_SiteSettingsTemplate.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Template/Template80_SiteSettingsTemplate.json @@ -3,7 +3,7 @@ "ReferenceType": "Results", "GridView": 1, "GridColumns": [ - "IssueId", + "ResultId", "Title", "ClassB", "ClassA", @@ -20,7 +20,7 @@ "UpdatedTime" ], "EditorColumns": [ - "IssueId", + "ResultId", "Ver", "Title", "DateA", @@ -39,7 +39,7 @@ "Comments" ], "LinkColumns": [ - "IssueId", + "ResultId", "Title", "DateA", "DateB", diff --git a/Implem.Pleasanter/App_Data/Definitions/Definition_Template/Template90_SiteSettingsTemplate.json b/Implem.Pleasanter/App_Data/Definitions/Definition_Template/Template90_SiteSettingsTemplate.json index f81395a4a..abe461d64 100644 --- a/Implem.Pleasanter/App_Data/Definitions/Definition_Template/Template90_SiteSettingsTemplate.json +++ b/Implem.Pleasanter/App_Data/Definitions/Definition_Template/Template90_SiteSettingsTemplate.json @@ -1,43 +1,61 @@ { - "Version": 1.011, + "Version": 1.017, "ReferenceType": "Issues", "GridView": 1, "GridColumns": [ "IssueId", - "TitleBody", - "Comments", - "StartTime", + "Title", + "ClassC", "CompletionTime", "ClassA", "ClassB", - "ClassC", "Status", "Manager", "Owner", "Updator", "UpdatedTime" ], - "EditorColumns": [ - "IssueId", - "Ver", - "Title", - "Body", - "DescriptionA", - "StartTime", - "CompletionTime", - "ClassA", - "ClassB", - "ClassC", - "Status", - "Manager", - "Owner", - "AttachmentsA", - "Comments" + "EditorColumnHash": { + "General": [ + "IssueId", + "Ver", + "_Section-1", + "Title", + "ClassC", + "Manager", + "ClassB", + "DateA", + "CompletionTime", + "ClassA", + "Body", + "AttachmentsA", + "_Section-2", + "Status", + "Owner", + "DateB", + "DescriptionA", + "AttachmentsB", + "Comments" + ] + }, + "SectionLatestId": 2, + "Sections": [ + { + "Id": 1, + "LabelText": "問合せ", + "AllowExpand": false, + "Expand": true + }, + { + "Id": 2, + "LabelText": "回答", + "AllowExpand": false, + "Expand": true + } ], "LinkColumns": [ "IssueId", "Title", - "StartTime", "CompletionTime", "Status", "Owner", @@ -48,7 +66,6 @@ "Ver", "Title", "Comments", - "StartTime", "CompletionTime", "Status", "Owner", @@ -58,7 +75,7 @@ "Columns": [ { "ColumnName": "AttachmentsA", - "LabelText": "添付資料" + "LabelText": "添付ファイル(問い合わせ用)" }, { "ColumnName": "ClassA", @@ -72,11 +89,12 @@ }, { "ColumnName": "Manager", - "LabelText": "依頼者" + "LabelText": "問合せ担当者" }, { "ColumnName": "Owner", - "LabelText": "対応者" + "LabelText": "回答者", + "DefaultInput": "" }, { "ColumnName": "ClassB", @@ -85,26 +103,33 @@ }, { "ColumnName": "ClassC", - "LabelText": "システム", - "ChoicesText": "システム1\nシステム2\nシステム3\nシステム4\nシステム5" + "LabelText": "対象機器", + "ChoicesText": "機器1\n機器2\n機器3\n機器4\n機器5" }, { "ColumnName": "DescriptionA", - "LabelText": "回答" + "LabelText": "回答内容" }, { "ColumnName": "Body", - "LabelText": "問合せ" + "LabelText": "問合せ内容" }, { - "ColumnName": "StartTime", - "GridFormat": "Ymdahm", - "EditorFormat": "Ymdhm" + "ColumnName": "CompletionTime", + "LabelText": "回答希望日" }, { - "ColumnName": "CompletionTime", - "GridFormat": "Ymdahm", - "EditorFormat": "Ymdhm" + "ColumnName": "DateA", + "LabelText": "問合せ日", + "DefaultInput": "0" + }, + { + "ColumnName": "DateB", + "LabelText": "回答日" + }, + { + "ColumnName": "AttachmentsB", + "LabelText": "添付ファイル(回答用)" } ], "Aggregations": [ @@ -144,9 +169,12 @@ { "Id": 1, "Name": "標準", - "CrosstabGroupByX": "StartTime", - "CrosstabGroupByY": "ClassC", - "KambanGroupByY": "Owner" + "CrosstabGroupByX": "ClassB", + "CrosstabGroupByY": "ClassA", + "CrosstabAggregateType": "Count", + "KambanGroupByX": "ClassB", + "KambanGroupByY": "ClassA", + "KambanAggregateType": "Count" } ], "EnableGantt": false, diff --git a/Implem.Pleasanter/App_Data/Displays/DemoMailBody.json b/Implem.Pleasanter/App_Data/Displays/DemoMailBody.json index ea8e69080..ce4adf613 100644 --- a/Implem.Pleasanter/App_Data/Displays/DemoMailBody.json +++ b/Implem.Pleasanter/App_Data/Displays/DemoMailBody.json @@ -11,7 +11,7 @@ }, { "Language": "ja", - "Body": "デモ環境ご利用へのお申し込みありがとうございます。\r\n\r\n下記のURLにアクセスし、ID/PWでログインしてください。\r\n\r\n{0}\r\n\r\n管理者ID\r\n{1}\r\n\r\n一般ユーザID(19IDご利用いただけます)\r\n{2}\r\n\r\nデモ環境は{3}日間ご利用いただけます。\r\n\r\nデモサイトは事前の告知なくメンテンスを実施する場合がありますので予めご了承ください。" + "Body": "デモ環境ご利用へのお申し込みありがとうございます。\r\n\r\n下記のURLにアクセスし、ID/PWでログインしてください。\r\n\r\n{0}\r\n\r\n管理者ID\r\n{1}\r\n\r\n一般ユーザID(19IDご利用いただけます)\r\n{2}\r\n\r\nデモ環境は{3}日間ご利用いただけます。\r\n\r\nデモサイトは事前の告知なくメンテナンスを実施する場合がありますので予めご了承ください。" }, { "Language": "de", diff --git a/Implem.Pleasanter/App_Data/Displays/ExpandLinkPath.json b/Implem.Pleasanter/App_Data/Displays/ExpandLinkPath.json new file mode 100644 index 000000000..4405198a6 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/ExpandLinkPath.json @@ -0,0 +1,33 @@ +{ + "Id": "ExpandLinkPath", + "Type": 110, + "Languages": [ + { + "Body": "Include same site with different link paths" + }, + { + "Language": "zh", + "Body": "包含具有不同链接路径的同一站点" + }, + { + "Language": "ja", + "Body": "リンクの経路が異なる同一サイトを含める" + }, + { + "Language": "de", + "Body": "Gleiche Seite mit unterschiedlichen Linkpfaden einbeziehen" + }, + { + "Language": "ko", + "Body": "다른 링크 경로가 있는 동일 사이트 포함" + }, + { + "Language": "es", + "Body": "Incluir el mismo sitio con diferentes rutas de enlace" + }, + { + "Language": "vn", + "Body": "Bao gồm cùng một trang web với các đường dẫn liên kết khác nhau" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/Functionalize.json b/Implem.Pleasanter/App_Data/Displays/Functionalize.json new file mode 100644 index 000000000..ec85fafd9 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/Functionalize.json @@ -0,0 +1,33 @@ +{ + "Id": "Functionalize", + "Type": 110, + "Languages": [ + { + "Body": "Functionalize" + }, + { + "Language": "zh", + "Body": "功能化" + }, + { + "Language": "ja", + "Body": "関数化" + }, + { + "Language": "de", + "Body": "Funktionalisieren" + }, + { + "Language": "ko", + "Body": "기능화하다" + }, + { + "Language": "es", + "Body": "Funcionalizar" + }, + { + "Language": "vn", + "Body": "Chức năng hóa" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/ImportLock.json b/Implem.Pleasanter/App_Data/Displays/ImportLock.json new file mode 100644 index 000000000..0d88cae2c --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/ImportLock.json @@ -0,0 +1,33 @@ +{ + "Id": "ImportLock", + "Type": 240, + "Languages": [ + { + "Body": "Another task is being processed, please execute it later." + }, + { + "Language": "zh-CN", + "Body": "另一个任务正在处理中,请稍后执行。" + }, + { + "Language": "ja", + "Body": "別のタスクが処理中です。後で実行してください。" + }, + { + "Language": "de", + "Body": "Eine andere Aufgabe wird gerade bearbeitet. Bitte führen Sie sie später aus." + }, + { + "Language": "ko", + "Body": "다른 작업을 처리 중입니다. 나중에 실행하세요." + }, + { + "Language": "es", + "Body": "Se está procesando otra tarea; ejecútela más tarde." + }, + { + "Language": "vi", + "Body": "Một tác vụ khác đang được xử lý, vui lòng thực hiện nó sau." + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/InvalidPath.json b/Implem.Pleasanter/App_Data/Displays/InvalidPath.json new file mode 100644 index 000000000..83c83ee48 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/InvalidPath.json @@ -0,0 +1,33 @@ +{ + "Id": "InvalidPath", + "Type": 240, + "Languages": [ + { + "Body": "Invalid path specification. [{0}]" + }, + { + "Language": "zh-CN", + "Body": "路径规范无效。 [{0}]" + }, + { + "Language": "ja", + "Body": "無効なパス指定です。[{0}]" + }, + { + "Language": "de", + "Body": "Ungültige Pfadangabe. [{0}]" + }, + { + "Language": "ko", + "Body": "잘못된 경로 지정입니다.[{0}]" + }, + { + "Language": "es", + "Body": "Especificación de ruta no válida. [{0}]" + }, + { + "Language": "vi", + "Body": "Đặc tả đường dẫn không hợp lệ. [{0}]" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/ToDisableAll.json b/Implem.Pleasanter/App_Data/Displays/ToDisableAll.json new file mode 100644 index 000000000..46dd6e4a3 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/ToDisableAll.json @@ -0,0 +1,33 @@ +{ + "Id": "ToDisableAll", + "Type": 110, + "Languages": [ + { + "Body": "To disable all" + }, + { + "Language": "zh", + "Body": "要禁用所有功能" + }, + { + "Language": "ja", + "Body": "全て無効" + }, + { + "Language": "de", + "Body": "Um alle zu deaktivieren" + }, + { + "Language": "ko", + "Body": "모두 비활성화하려면" + }, + { + "Language": "es", + "Body": "Para desactivar todo" + }, + { + "Language": "vn", + "Body": "Để vô hiệu hóa tất cả" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/ToEnableAll.json b/Implem.Pleasanter/App_Data/Displays/ToEnableAll.json new file mode 100644 index 000000000..a155c54b2 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/ToEnableAll.json @@ -0,0 +1,33 @@ +{ + "Id": "ToEnableAll", + "Type": 110, + "Languages": [ + { + "Body": "To enable all" + }, + { + "Language": "zh", + "Body": "启用所有功能" + }, + { + "Language": "ja", + "Body": "全て有効" + }, + { + "Language": "de", + "Body": "Um alle zu aktivieren" + }, + { + "Language": "ko", + "Body": "모두 사용하려면" + }, + { + "Language": "es", + "Body": "Para activar todo" + }, + { + "Language": "vn", + "Body": "Để kích hoạt tất cả" + } + ] +} \ No newline at end of file diff --git a/Implem.Pleasanter/App_Data/Displays/TryCatch.json b/Implem.Pleasanter/App_Data/Displays/TryCatch.json new file mode 100644 index 000000000..e2ebbb4d6 --- /dev/null +++ b/Implem.Pleasanter/App_Data/Displays/TryCatch.json @@ -0,0 +1,9 @@ +{ + "Id": "TryCatch", + "Type": 110, + "Languages": [ + { + "Body": "TryCatch" + } + ] +} \ 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 f4a9297ca..52ebe3c31 100644 --- a/Implem.Pleasanter/App_Data/Parameters/General.json +++ b/Implem.Pleasanter/App_Data/Parameters/General.json @@ -41,6 +41,9 @@ "AllowCopy": true, "AllowReferenceCopy": false, "CharToAddWhenCopying": " - コピー", + "ChoiceSplitRegexPattern": "(? - net8.0 - Copyright © Implem Inc 2014 - 2024 + $([System.DateTime]::Now.Year.ToString()) + Copyright © Implem Inc 2014 - $(Year) Business application platform Implem.Pleasanter - 1.4.11.0 - 1.4.11.0 - 1.4.11.0 + 1.4.12.0 + 1.4.12.0 + 1.4.12.0 disable Linux ..\docker-compose.dcproj - + NU1605;1701;1702 diff --git a/Implem.Pleasanter/Libraries/BackgroundServices/BackgroundServerScriptJob.cs b/Implem.Pleasanter/Libraries/BackgroundServices/BackgroundServerScriptJob.cs index 52069892a..e9ab60410 100644 --- a/Implem.Pleasanter/Libraries/BackgroundServices/BackgroundServerScriptJob.cs +++ b/Implem.Pleasanter/Libraries/BackgroundServices/BackgroundServerScriptJob.cs @@ -69,7 +69,7 @@ await Task.Run(() => itemModel: null, view: null, scripts: scripts.ToArray(), - condition: "BackgroundServerScript", + condition: ServerScriptModel.ServerScriptConditions.BackgroundServerScript, debug: paramScripts != null && targetScript.Debug); log.Finish(context: sqlContext); } diff --git a/Implem.Pleasanter/Libraries/DataSources/Smtp.cs b/Implem.Pleasanter/Libraries/DataSources/Smtp.cs index 125171299..b7cb1fc02 100644 --- a/Implem.Pleasanter/Libraries/DataSources/Smtp.cs +++ b/Implem.Pleasanter/Libraries/DataSources/Smtp.cs @@ -144,7 +144,7 @@ private Encoding GetEncodingOrDefault(Context context, string encoding) method: nameof(GetEncodingOrDefault), message: $"{encoding} is not supported Encoding. Falling back to UTF-8.", errStackTrace: $"Supported Encodings are { Encoding.GetEncodings().Select(o => o.Name).Join(",") }.", - sysLogType: SysLogModel.SysLogTypes.Execption); + sysLogType: SysLogModel.SysLogTypes.Exception); return Encoding.UTF8; } return Encoding.GetEncoding(encodingInfo.Name); diff --git a/Implem.Pleasanter/Libraries/DataTypes/Attachment.cs b/Implem.Pleasanter/Libraries/DataTypes/Attachment.cs index 24248b46f..65fb95777 100644 --- a/Implem.Pleasanter/Libraries/DataTypes/Attachment.cs +++ b/Implem.Pleasanter/Libraries/DataTypes/Attachment.cs @@ -37,31 +37,34 @@ public Attachment() [OnDeserialized] private void OnDeserialized(StreamingContext streamingContext) { - if (!Base64.IsNullOrEmpty() || !Base64Binary.IsNullOrEmpty()) + if (Guid is not null && Deleted == true) + return; + + if (Base64 is null && Base64Binary is null) + return; + + var bin = GetBin(); + Guid = Strings.NewGuid(); + Size = bin.Length; + Extension = Path.GetExtension(Name ?? FileName); + ContentType = Strings.CoalesceEmpty(ContentType, "text/plain"); + Added = true; + if (Files.ValidateFileName(Name ?? FileName)) { - var bin = GetBin(); - Guid = Strings.NewGuid(); - Size = bin.Length; - Extension = Path.GetExtension(Name ?? FileName); - ContentType = Strings.CoalesceEmpty(ContentType, "text/plain"); - Added = true; - if (Files.ValidateFileName(Name ?? FileName)) - { - Files.Write(bin, Path.Combine(Directories.Temp(), Guid, Name ?? FileName)); - } - else - { - var context = new Context( - sessionStatus: false, - sessionData: false, - item: false, - setPermissions: false); - new SysLogModel( - context: context, - method: $"{nameof(Attachment)}.{nameof(OnDeserialized)}", - message: $"Invalid File Name: '{Name ?? FileName}'", - sysLogType: SysLogModel.SysLogTypes.Info); - } + Files.Write(bin, Path.Combine(Directories.Temp(), Guid, Name ?? FileName)); + } + else + { + var context = new Context( + sessionStatus: false, + sessionData: false, + item: false, + setPermissions: false); + new SysLogModel( + context: context, + method: $"{nameof(Attachment)}.{nameof(OnDeserialized)}", + message: $"Invalid File Name: '{Name ?? FileName}'", + sysLogType: SysLogModel.SysLogTypes.Info); } } @@ -366,9 +369,9 @@ static string GetAlgorithmParam() public byte[] GetBin(Context context = null) { var bin = Base64 ?? Base64Binary; - return bin.IsNullOrEmpty() - ? Files.Bytes(Path.Combine(Directories.Temp(), Guid, Name ?? FileName)) - : System.Convert.FromBase64String(bin); + if(bin is null) + return Files.Bytes(Path.Combine(Directories.Temp(), Guid, Name ?? FileName)); + return System.Convert.FromBase64String(bin); } public bool IsStoreLocalFolder(Column column) diff --git a/Implem.Pleasanter/Libraries/General/Error.cs b/Implem.Pleasanter/Libraries/General/Error.cs index baa642dc2..cad307967 100644 --- a/Implem.Pleasanter/Libraries/General/Error.cs +++ b/Implem.Pleasanter/Libraries/General/Error.cs @@ -45,6 +45,7 @@ public enum Types HasNotChangeColumnPermission, HasNotPermission, ImportInvalidUserIdAndLoginId, + ImportLock, ImportMax, InCircleInvalidToken, IncorrectCurrentPassword, @@ -61,6 +62,7 @@ public enum Types InvalidJsonData, InvalidMemberKey, InvalidMemberType, + InvalidPath, InvalidRequest, InvalidSsoCode, invalidUpsertKey, @@ -274,6 +276,10 @@ public static Message Message(this Types type, Context context, params string[] return Messages.ImportInvalidUserIdAndLoginId( context: context, data: data); + case Types.ImportLock: + return Messages.ImportLock( + context: context, + data: data); case Types.ImportMax: return Messages.ImportMax( context: context, @@ -338,6 +344,10 @@ public static Message Message(this Types type, Context context, params string[] return Messages.InvalidMemberType( context: context, data: data); + case Types.InvalidPath: + return Messages.InvalidPath( + context: context, + data: data); case Types.InvalidRequest: return Messages.InvalidRequest( context: context, diff --git a/Implem.Pleasanter/Libraries/HtmlParts/HtmlControls.cs b/Implem.Pleasanter/Libraries/HtmlParts/HtmlControls.cs index e5d376e44..09efe5cfb 100644 --- a/Implem.Pleasanter/Libraries/HtmlParts/HtmlControls.cs +++ b/Implem.Pleasanter/Libraries/HtmlParts/HtmlControls.cs @@ -43,6 +43,7 @@ public static HtmlBuilder TextBox( string validateRegexErrorMessage = null, string action = null, string method = null, + string dataValue = null, Dictionary attributes = null, bool _using = true) { @@ -78,6 +79,7 @@ public static HtmlBuilder TextBox( : "control-textbox anchor hidden", controlCss)) .Type("text") .Value(text) + .DataValue(dataValue) .Placeholder(placeholder) .Disabled(disabled) .DataAlwaysSend(alwaysSend) @@ -574,6 +576,10 @@ public static HtmlBuilder Spinner( .Value(value != null ? value.ToString() : string.Empty) + .Add("data-raw", + value != null + ? value.ToString() + : string.Empty) .DataMin(min, _using: min != -1) .DataMax(max, _using: max != -1) .DataStep(step, _using: step != -1) diff --git a/Implem.Pleasanter/Libraries/HtmlParts/HtmlDropDownSearches.cs b/Implem.Pleasanter/Libraries/HtmlParts/HtmlDropDownSearches.cs index 057068992..b0328e843 100644 --- a/Implem.Pleasanter/Libraries/HtmlParts/HtmlDropDownSearches.cs +++ b/Implem.Pleasanter/Libraries/HtmlParts/HtmlDropDownSearches.cs @@ -112,6 +112,12 @@ public static HtmlBuilder DropDownSearchDialogBody(this HtmlBuilder hb, Context alwaysDataValue: true, commandOptionAction: () => hb .Div(css: "command-right", action: () => hb + .Button( + controlId: "ToDisableAllDropDownSearchResults", + controlCss: "button-icon", + text: Displays.ToDisableAll(context: context), + onClick: "$p.moveAllColumns(event, $(this),'DropDownSearch',false,false,'Results');", + icon: "ui-icon-circle-triangle-e") .Button( controlId: "ToDisableDropDownSearchResults", controlCss: "button-icon", @@ -138,6 +144,12 @@ public static HtmlBuilder DropDownSearchDialogBody(this HtmlBuilder hb, Context controlCss: "button-icon", onClick: "$p.moveColumns(event, $(this),'DropDownSearch',false,false,'Results');", icon: "ui-icon-circle-triangle-w") + .Button( + controlId: "ToEnableAllDropDownSearchResults", + controlCss: "button-icon", + text: Displays.ToEnableAll(context: context), + onClick: "$p.moveAllColumns(event, $(this),'DropDownSearch',false,false,'Results');", + icon: "ui-icon-circle-triangle-w") .TextBox( controlId: "DropDownSearchText", controlCss: " auto-postback always-send w150", diff --git a/Implem.Pleasanter/Libraries/HtmlParts/HtmlFields.cs b/Implem.Pleasanter/Libraries/HtmlParts/HtmlFields.cs index 7a8ec0839..f7a8b4da2 100644 --- a/Implem.Pleasanter/Libraries/HtmlParts/HtmlFields.cs +++ b/Implem.Pleasanter/Libraries/HtmlParts/HtmlFields.cs @@ -78,6 +78,7 @@ public static HtmlBuilder Field( Column column, ServerScriptModelColumn serverScriptModelColumn = null, string value = null, + object rawValue = null, StatusControl.ControlConstraintsTypes controlConstraintsType = StatusControl.ControlConstraintsTypes.None, Permissions.ColumnPermissionTypes columnPermissionType = Permissions.ColumnPermissionTypes.Update, string fieldCss = null, @@ -154,6 +155,7 @@ public static HtmlBuilder Field( column.LabelText), labelRaw: serverScriptModelColumn?.LabelRaw, value: value, + rawValue: rawValue, optionCollection: EditChoices( context: context, ss: ss, @@ -202,11 +204,11 @@ private static string FieldCss( ? " hidden" : string.Empty) + (column.TextAlign switch - { - SiteSettings.TextAlignTypes.Right => " right-align", - SiteSettings.TextAlignTypes.Center => " center-align", - _ => string.Empty - }) + { + SiteSettings.TextAlignTypes.Right => " right-align", + SiteSettings.TextAlignTypes.Center => " center-align", + _ => string.Empty + }) + (!extendedFieldCss.IsNullOrEmpty() ? " " + extendedFieldCss : string.Empty); @@ -231,11 +233,11 @@ private static string ControlCss( ? " control-auto-postback" : string.Empty) + (column.TextAlign switch - { - SiteSettings.TextAlignTypes.Right => " right-align", - SiteSettings.TextAlignTypes.Center => " center-align", - _ => string.Empty - }) + { + SiteSettings.TextAlignTypes.Right => " right-align", + SiteSettings.TextAlignTypes.Center => " center-align", + _ => string.Empty + }) + (!extendedControlCss.IsNullOrEmpty() ? " " + extendedControlCss : string.Empty); @@ -384,6 +386,7 @@ public static HtmlBuilder ViewExtensionField( placeholder: Strings.CoalesceEmpty(column.InputGuide, column.LabelText), labelRaw: null, value: value, + rawValue: null, optionCollection: EditChoices( context: context, ss: ss, @@ -425,6 +428,7 @@ private static HtmlBuilder SwitchField( string placeholder, string labelRaw, string value, + object rawValue, Dictionary optionCollection, bool mobile, bool controlOnly, @@ -515,6 +519,9 @@ private static HtmlBuilder SwitchField( extendedHtmlBetweenLabelAndControl: extendedHtmlBetweenLabelAndControl, extendedHtmlAfterControl: extendedHtmlAfterControl); default: + var dataRaw = column.TypeName.CsTypeSummary() == Types.CsNumeric + ? rawValue?.ToString() ?? (column.Nullable == true ? "" : "0") + : null; return hb.FieldText( fieldId: controlId + "Field", controlId: controlId, @@ -540,6 +547,7 @@ private static HtmlBuilder SwitchField( dataValue: column.HasChoices() ? value : null, + dataRaw: dataRaw, openAnchorNewTab: column.OpenAnchorNewTab == true, anchorFormat: column.Anchor == true ? column.AnchorFormat @@ -737,6 +745,11 @@ private static HtmlBuilder SwitchField( placeholder: placeholder, labelRaw: labelRaw, controlOnly: controlOnly, + attributes: new Dictionary() + { + ["data-raw"] = rawValue?.ToString() + ?? (column.Nullable == true ? "" : "0") + }, unit: column.Unit, text: value, alwaysSend: alwaysSend, @@ -1149,6 +1162,7 @@ public static HtmlBuilder FieldText( bool controlOnly = false, string text = null, string dataValue = null, + string dataRaw = null, bool alwaysSend = false, bool openAnchorNewTab = false, string anchorFormat = null, @@ -1177,6 +1191,7 @@ public static HtmlBuilder FieldText( .Id(controlId) .Class(Css.Class("control-text", controlCss)) .DataValue(dataValue) + .Add("data-raw", dataRaw, _using: dataRaw != null) .DataReadOnly(true) .DataAlwaysSend(alwaysSend), action: () => @@ -1215,6 +1230,7 @@ public static HtmlBuilder FieldTextBox( string labelTitle = null, string labelIcon = null, bool controlOnly = false, + string dataValue = null, string unit = null, string text = null, string format = null, @@ -1289,6 +1305,7 @@ public static HtmlBuilder FieldTextBox( validateRegexErrorMessage: validateRegexErrorMessage, action: action, method: method, + dataValue: dataValue, dataLang: dataLang, attributes: attributes); if (textType == HtmlTypes.TextTypes.Password) diff --git a/Implem.Pleasanter/Libraries/HtmlParts/HtmlLinks.cs b/Implem.Pleasanter/Libraries/HtmlParts/HtmlLinks.cs index 67860a9e1..070089800 100644 --- a/Implem.Pleasanter/Libraries/HtmlParts/HtmlLinks.cs +++ b/Implem.Pleasanter/Libraries/HtmlParts/HtmlLinks.cs @@ -200,7 +200,8 @@ private static HtmlBuilder Link( linkId: id, sourceId: link.SourceId, text: link.SiteTitle, - tabIndex: tabIndex)); + tabIndex: tabIndex, + notReturnParentRecord: link.NotReturnParentRecord ?? false)); } hb.LinkTable( context: context, diff --git a/Implem.Pleasanter/Libraries/Models/DropDowns.cs b/Implem.Pleasanter/Libraries/Models/DropDowns.cs index 309f53022..b9233754f 100644 --- a/Implem.Pleasanter/Libraries/Models/DropDowns.cs +++ b/Implem.Pleasanter/Libraries/Models/DropDowns.cs @@ -538,12 +538,15 @@ private static Column SearchDropDownColumn( } else { + var currentSs = ss.Destinations?.ContainsKey(link.SiteId) == true + ? ss + : column.SiteSettings; column.SetChoiceHash( context: context, - ss: ss, + ss: currentSs, link: link, searchText: searchText, - parentColumn: ss.GetColumn( + parentColumn: currentSs.GetColumn( context: context, columnName: parentClass), parentIds: parentIds, diff --git a/Implem.Pleasanter/Libraries/Models/GridData.cs b/Implem.Pleasanter/Libraries/Models/GridData.cs index a8a91f96f..a40fa32e3 100644 --- a/Implem.Pleasanter/Libraries/Models/GridData.cs +++ b/Implem.Pleasanter/Libraries/Models/GridData.cs @@ -63,14 +63,21 @@ private void Get( int pageSize = 0, bool count = true) { + var gridColumns = ss.GetGridColumns( + context: context, + view: view, + includedColumns: true); + if (!gridColumns.Any(o => o.ColumnName == "Ver")) + { + gridColumns.Add(ss.GetColumn( + context: context, + columnName: "Ver")); + } column = column ?? ColumnUtilities.SqlColumnCollection( context: context, ss: ss, view: view, - columns: ss.GetGridColumns( - context: context, - view: view, - includedColumns: true)); + columns: gridColumns); where = view.Where( context: context, ss: ss, diff --git a/Implem.Pleasanter/Libraries/Responses/Displays.cs b/Implem.Pleasanter/Libraries/Responses/Displays.cs index 4783a74e7..0a2db7963 100644 --- a/Implem.Pleasanter/Libraries/Responses/Displays.cs +++ b/Implem.Pleasanter/Libraries/Responses/Displays.cs @@ -3789,6 +3789,16 @@ public static string Expand( data: data); } + public static string ExpandLinkPath( + Context context, + params string[] data) + { + return Get( + context: context, + id: "ExpandLinkPath", + data: data); + } + public static string Expired( Context context, params string[] data) @@ -4379,6 +4389,16 @@ public static string FullTextTypes( data: data); } + public static string Functionalize( + Context context, + params string[] data) + { + return Get( + context: context, + id: "Functionalize", + data: data); + } + public static string Future( Context context, params string[] data) @@ -4999,6 +5019,16 @@ public static string ImportKey( data: data); } + public static string ImportLock( + Context context, + params string[] data) + { + return Get( + context: context, + id: "ImportLock", + data: data); + } + public static string ImportMax( Context context, params string[] data) @@ -5399,6 +5429,16 @@ public static string InvalidMemberType( data: data); } + public static string InvalidPath( + Context context, + params string[] data) + { + return Get( + context: context, + id: "InvalidPath", + data: data); + } + public static string InvalidRequest( Context context, params string[] data) @@ -9999,6 +10039,16 @@ public static string ToDisable( data: data); } + public static string ToDisableAll( + Context context, + params string[] data) + { + return Get( + context: context, + id: "ToDisableAll", + data: data); + } + public static string ToEnable( Context context, params string[] data) @@ -10009,6 +10059,16 @@ public static string ToEnable( data: data); } + public static string ToEnableAll( + Context context, + params string[] data) + { + return Get( + context: context, + id: "ToEnableAll", + data: data); + } + public static string ToEven( Context context, params string[] data) @@ -10139,6 +10199,16 @@ public static string Truncate( data: data); } + public static string TryCatch( + Context context, + params string[] data) + { + return Get( + context: context, + id: "TryCatch", + data: data); + } + public static string Tuesday( Context context, params string[] data) diff --git a/Implem.Pleasanter/Libraries/Responses/Messages.cs b/Implem.Pleasanter/Libraries/Responses/Messages.cs index 6cf30df02..369f9eaf6 100644 --- a/Implem.Pleasanter/Libraries/Responses/Messages.cs +++ b/Implem.Pleasanter/Libraries/Responses/Messages.cs @@ -854,6 +854,16 @@ public static Message ImportInvalidUserIdAndLoginId(Context context, params stri css: "alert-error"); } + public static Message ImportLock(Context context, params string[] data) + { + return Get( + id: "ImportLock", + text: Displays.ImportLock( + context: context, + data: data), + css: "alert-error"); + } + public static Message ImportMax(Context context, params string[] data) { return Get( @@ -1034,6 +1044,16 @@ public static Message InvalidMemberType(Context context, params string[] data) css: "alert-error"); } + public static Message InvalidPath(Context context, params string[] data) + { + return Get( + id: "InvalidPath", + text: Displays.InvalidPath( + context: context, + data: data), + css: "alert-error"); + } + public static Message InvalidRequest(Context context, params string[] data) { return Get( @@ -2706,6 +2726,17 @@ public static ResponseCollection ResponseImportInvalidUserIdAndLoginId( target: target); } + public static ResponseCollection ResponseImportLock( + Context context, string target = null, params string[] data) + { + return ResponseMessage( + context: context, + message: ImportLock( + context: context, + data: data), + target: target); + } + public static ResponseCollection ResponseImportMax( Context context, string target = null, params string[] data) { @@ -2904,6 +2935,17 @@ public static ResponseCollection ResponseInvalidMemberType( target: target); } + public static ResponseCollection ResponseInvalidPath( + Context context, string target = null, params string[] data) + { + return ResponseMessage( + context: context, + message: InvalidPath( + context: context, + data: data), + target: target); + } + public static ResponseCollection ResponseInvalidRequest( Context context, string target = null, params string[] data) { diff --git a/Implem.Pleasanter/Libraries/Responses/ResponseViewModes.cs b/Implem.Pleasanter/Libraries/Responses/ResponseViewModes.cs index 86c970305..4485856be 100644 --- a/Implem.Pleasanter/Libraries/Responses/ResponseViewModes.cs +++ b/Implem.Pleasanter/Libraries/Responses/ResponseViewModes.cs @@ -78,13 +78,13 @@ public static ResponseCollection ViewMode( serverScriptModelRow: serverScriptModelRow)) .Val("#EditOnGrid", editOnGrid.ToOneOrZeroString()) .SetMemory("formChanged", false, _using: !editOnGrid) - .Invoke(invoke) - .Message(message) - .LoadScroll(loadScroll) .ClearFormData( context: context, ss: ss, editOnGrid: editOnGrid) + .Invoke(invoke) + .Message(message) + .LoadScroll(loadScroll) .FilterField( context: context, ss: ss, diff --git a/Implem.Pleasanter/Libraries/ServerScripts/ServerScriptCsv.cs b/Implem.Pleasanter/Libraries/ServerScripts/ServerScriptCsv.cs new file mode 100644 index 000000000..8f5223ee7 --- /dev/null +++ b/Implem.Pleasanter/Libraries/ServerScripts/ServerScriptCsv.cs @@ -0,0 +1,89 @@ +using Microsoft.ClearScript.V8; +using Microsoft.ClearScript; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System; +using System.Linq; + +namespace Implem.Pleasanter.Libraries.ServerScripts +{ + public class ServerScriptCsv + { + public string Csv2Text( + ScriptObject callback, + IList csv) + { + try + { + var csvConfiguration = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.CurrentCulture) + { + HasHeaderRecord = false + }; + using var writer = new StringWriter(); + using var csvHelper = new CsvHelper.CsvWriter(writer, csvConfiguration); + foreach (var record in csv) + { + foreach (var value in record as IEnumerable) + { + csvHelper.WriteField(value.ToString()); + } + csvHelper.NextRecord(); + } + return writer.ToString(); + } + catch (Exception e) + { + callback.InvokeAsFunction( + "Exception", + $"{e.GetType().Name}@{e.Message}"); + return null; + } + } + + public dynamic Text2Csv( + ScriptObject callback, + string text) + { + try + { + var allAry = new List(); + var csvConfiguration = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.CurrentCulture) + { + HasHeaderRecord = false + }; + using var reader = new StringReader(text); + using var data = new CsvHelper.CsvReader(reader, csvConfiguration); + while (data.Read()) + { + allAry.Add(V8ScriptEngine.Current.Script.Array.from(data.Parser.Record.ToArray())); + } + return V8ScriptEngine.Current.Script.Array.from(allAry); + } + catch (Exception e) + { + callback.InvokeAsFunction( + "Exception", + $"{e.GetType().Name}@{e.Message}"); + return null; + } + } + + public string Script() + { + return """ + $ps.CSV = + { + str2csv: function(text) + { + return $ps._utils._f0((cb) => _csv_cs.Text2Csv(cb, text)); + }, + csv2str: function(csv) + { + return $ps._utils._f0((cb) => _csv_cs.Csv2Text(cb, csv)); + }, + } + """; + } + } +} diff --git a/Implem.Pleasanter/Libraries/ServerScripts/ServerScriptFile.cs b/Implem.Pleasanter/Libraries/ServerScripts/ServerScriptFile.cs new file mode 100644 index 000000000..d60b21d3e --- /dev/null +++ b/Implem.Pleasanter/Libraries/ServerScripts/ServerScriptFile.cs @@ -0,0 +1,367 @@ +using Implem.DefinitionAccessor; +using Implem.Pleasanter.Libraries.Requests; +using Implem.Pleasanter.Libraries.Responses; +using Implem.Pleasanter.Models; +using Microsoft.ClearScript; +using Microsoft.ClearScript.V8; +using System; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; + +namespace Implem.Pleasanter.Libraries.ServerScripts +{ + public class ServerScriptFile + { + private readonly Context Context; + + public ServerScriptFile(Context context) + { + Context = context; + } + + public string ReadAllText( + ScriptObject callback, + string section, + string path, + string encode) + { + string ret = null; + CallbackHandler( + log: $"$ps.file.readAllText(\"*\",\"{path}\",\"{encode}\")", + callback: callback, + code: () => + { + var fullPath = NormalizePath( + section: section, + path: path); + if (!File.Exists(fullPath)) return; + if (Parameters.Script.ServerScriptFileSizeMax >= 0) + { + var info = new FileInfo(fullPath); + if (info.Length >= Parameters.Script.ServerScriptFileSizeMax * 1024 * 1024) + { + throw new Exception( + Messages.OverLimitSize( + context: Context, + Parameters.Script.ServerScriptFileSizeMax.ToString()) + .Text); + } + } + ret = File.ReadAllText(fullPath, GetEncoding(encode: encode)); + }); + return ret; + } + + public bool WriteAllText( + ScriptObject callback, + string section, + string path, + string data, + string encode) + { + var ret = false; + CallbackHandler( + log: $"$ps.file.writeAllText(\"*\",\"{path}\",(data),\"{encode}\")", + callback: callback, + code: () => + { + var fullPath = NormalizePath( + section: section, + path: path); + var dir = Path.GetDirectoryName(fullPath); + if (!Directory.Exists(dir)) Directory.CreateDirectory(dir); + File.WriteAllText(fullPath, data, GetEncoding(encode: encode)); + ret = true; + }); + return ret; + } + + public dynamic GetFileList( + ScriptObject callback, + string section, + string path) + { + var ret = new string[0]; + CallbackHandler( + log: $"$ps.file.getFileList(\"*\",\"{path}\")", + callback: callback, + code: () => + { + var fullPath = NormalizePath( + section: section, + path: path); + if (!Directory.Exists(fullPath)) return; + ret = Directory.GetFiles(fullPath).Select(x => Path.GetFileName(x)).ToArray(); + }); + return V8ScriptEngine.Current.Script.Array.from(ret); + } + + public dynamic GetDirectoryList( + ScriptObject callback, + string section, + string path) + { + var ret = new string[0]; + CallbackHandler( + log: $"$ps.file.getDirectoryList(\"*\",\"{path}\")", + callback: callback, + code: () => + { + var fullPath = NormalizePath( + section: section, + path: path); + if (!Directory.Exists(fullPath)) return; + ret = Directory.GetDirectories(fullPath).Select(x => Path.GetFileName(x)).ToArray(); + }); + return V8ScriptEngine.Current.Script.Array.from(ret); + } + + public bool RemoveFile( + ScriptObject callback, + string section, + string path) + { + var ret = false; + CallbackHandler( + log: $"$ps.file.removeFile(\"*\",\"{path}\")", + callback: callback, + code: () => + { + var fullPath = NormalizePath( + section: section, + path: path); + if (!File.Exists(fullPath)) return; + File.Delete(fullPath); + ret = true; + }); + return ret; + } + + public bool MoveFile( + ScriptObject callback, + string section, + string oldPath, + string newPath) + { + var ret = false; + CallbackHandler( + log: $"$ps.file.moveFile(\"*\",\"{oldPath}\",\"{newPath}\")", + callback: callback, + code: () => + { + var oldName = NormalizePath( + section: section, + path: oldPath); + var newName = NormalizePath( + section: section, + path: newPath); + if (!File.Exists(oldName) || File.Exists(newName)) return; + var basePath = Path.GetDirectoryName(newName); + if (!Directory.Exists(basePath)) Directory.CreateDirectory(basePath); + File.Move(oldName, newName); + ret = true; + }); + return ret; + } + + public bool CreateDirectory( + ScriptObject callback, + string section, + string path) + { + var ret = false; + CallbackHandler( + log: $"$ps.file.createDirectory(\"*\",\"{path}\")", + callback: callback, + code: () => + { + var fullPath = NormalizePath( + section: section, + path: path); + if (!Directory.Exists(fullPath)) Directory.CreateDirectory(fullPath); + ret = true; + }); + return ret; + } + + public bool RemoveDirectory( + ScriptObject callback, + string section, + string path) + { + var ret = false; + CallbackHandler( + log: $"$ps.file.removeDirectory(\"*\",\"{path}\")", + callback: callback, + code: () => + { + var fullPath = NormalizePath( + section: section, + path: path); + if (Directory.Exists(fullPath)) Directory.Delete(fullPath, true); + ret = true; + }); + return ret; + } + + public bool MoveDirectory( + ScriptObject callback, + string section, + string oldPath, + string newPath) + { + var ret = false; + CallbackHandler( + log: $"$ps.file.moveDirectory(\"*\",\"{oldPath}\",\"{newPath}\")", + callback: callback, + code: () => + { + var oldName = NormalizePath( + section: section, + path: oldPath); + var newName = NormalizePath( + section: section, + path: newPath); + if (!Directory.Exists(oldName) || Directory.Exists(newName)) return; + var basePath = Path.GetDirectoryName(newName); + if (!Directory.Exists(basePath)) Directory.CreateDirectory(basePath); + Directory.Move(oldName, newName); + ret = true; + }); + return ret; + } + + public bool CreateSection( + ScriptObject callback, + string section) + { + return CreateDirectory( + callback: callback, + section: section, + path: null); + } + + public bool RemoveSection( + ScriptObject callback, + string section) + { + return RemoveDirectory( + callback: callback, + section: section, + path: null); + } + + private static System.Text.Encoding GetEncoding(string encode) + { + return System.Text.Encoding.GetEncoding(encode ?? "utf-8"); + } + + private string NormalizePath( + string section, + string path) + { + var rootPath = Parameters.Script.ServerScriptFilePath; + var rootPath1 = rootPath.Replace(Path.DirectorySeparatorChar, '/'); + var rootPath2 = rootPath.Replace('/', Path.DirectorySeparatorChar); + if (rootPath2 != Path.GetFullPath(rootPath2)) throw new ArgumentException(Messages.InvalidPath(Context, "basepath").Text); + var regexBase = new Regex("^([a-zA-Z]:/$|//.*|/)$"); + if (regexBase.IsMatch(rootPath1)) throw new ArgumentException(Messages.InvalidPath(Context, "basepath").Text); + var regexSection = new Regex(@"^[0-9a-zA-Z_\.\-]*$"); + if (!regexSection.IsMatch(section)) throw new ArgumentException(Messages.InvalidPath(Context, "section").Text); + var regexPath = new Regex(@"^[0-9a-zA-Z_\.\-/]*$"); + if (path != null && !regexPath.IsMatch(path)) throw new ArgumentException(Messages.InvalidPath(Context, "path").Text); + var sectionPath = Path.Combine(rootPath2, section); + var fullPath = Path.GetFullPath(Path.Combine(sectionPath, path?.Replace('/', Path.DirectorySeparatorChar) ?? "")); + if (!fullPath.StartsWith(sectionPath)) throw new ArgumentException(Messages.InvalidPath(Context, "path").Text); + return fullPath; + } + + private void CallbackHandler( + string log, + ScriptObject callback, + Action code, + Func skipException = null) + { + skipException ??= (e) => false; + var logMsg = "success:" + log; + try + { + code(); + } + catch (Exception e) + { + var rootPath = Parameters.Script.ServerScriptFilePath.Replace('/', Path.DirectorySeparatorChar); ; + var errMsg = $"{e.GetType().Name}@{e.Message.Replace(rootPath, "$(base)")}"; + if (!skipException(e)) + { + callback.InvokeAsFunction("Exception", errMsg); + logMsg = "failure:" + log + "/" + errMsg; + } + else + { + logMsg = "skip:" + log + "/" + errMsg; + } + } + new SysLogModel( + context: Context, + method: "Files", + message: logMsg, + sysLogType: SysLogModel.SysLogTypes.Info); + } + + public string Script() + { + var code = """ + $ps.file = + { + readAllText: function(section, path, encode=null) + { + return $ps._utils._f0((cb) => _file_cs.ReadAllText(cb, section, path, encode)); + }, + writeAllText: function(section, path, data, encode=null) + { + return $ps._utils._f0((cb) => _file_cs.WriteAllText(cb, section, path, data, encode)); + }, + getFileList: function(section, path) + { + return $ps._utils._f0((cb) => _file_cs.GetFileList(cb, section, path)); + }, + getDirectoryList: function(section, path) + { + return $ps._utils._f0((cb) => _file_cs.GetDirectoryList(cb, section, path)); + }, + removeFile: function(section, path) + { + return $ps._utils._f0((cb) => _file_cs.RemoveFile(cb, section, path)); + }, + moveFile: function(section, old_name, new_name) + { + return $ps._utils._f0((cb) => _file_cs.MoveFile(cb, section, old_name, new_name)); + }, + removeDirectory: function(section, path) + { + return $ps._utils._f0((cb) => _file_cs.RemoveDirectory(cb, section, path)); + }, + moveDirectory: function(section, old_name, new_name) + { + return $ps._utils._f0((cb) => _file_cs.MoveDirectory(cb, section, old_name, new_name)); + }, + createDirectory: function(section, path) + { + return $ps._utils._f0((cb) => _file_cs.CreateDirectory(cb, section, path)); + }, + removeSection: function(section) + { + return $ps._utils._f0((cb) => _file_cs.RemoveSection(cb, section)); + }, + createSection: function(section) + { + return $ps._utils._f0((cb) => _file_cs.CreateSection(cb, section)); + }, + } + """; + return code; + } + } +} diff --git a/Implem.Pleasanter/Libraries/ServerScripts/ServerScriptJsLibraries.cs b/Implem.Pleasanter/Libraries/ServerScripts/ServerScriptJsLibraries.cs index 095e669ad..b8a8460b5 100644 --- a/Implem.Pleasanter/Libraries/ServerScripts/ServerScriptJsLibraries.cs +++ b/Implem.Pleasanter/Libraries/ServerScripts/ServerScriptJsLibraries.cs @@ -2,18 +2,46 @@ { public class ServerScriptJsLibraries { + public static string ScriptInit() + { + return """ + let $ps = {}; + $ps._utils = { + _f0: (f) => + { + var err = null; + var ret = f((type, data) => {err = data}); + if (err) throw new Error(err); + return ret; + }, + }; + $ps.utilities = {}; + """; + } + public static string Scripts() { - return @" - let $p = { - JSON: { - stringify: function() { }}}; - (function() { + return """ + $ps.JSON = { + stringify: function() { }, + parse: function() { }}; + (function() { + { let js = JSON.stringify; let clr = JsonConvert.SerializeObject; - $p.JSON.stringify = (v, r, s) => js(v, r, s) || clr(v); - })() - "; + $ps.JSON.stringify = (v, r, s) => js(v, r, s) || clr(v); + } + { + let js = JSON.parse; + let clr = JsonConvert.Parse; + $ps.JSON.parse = (v, r) => js(v, r) || clr(v); + } + })(); + $p = {}; + $p.JSON = { + stringify: (v, r, s) => $ps.JSON.stringify(v, r, s) + }; + """; } } } diff --git a/Implem.Pleasanter/Libraries/ServerScripts/ServerScriptModel.cs b/Implem.Pleasanter/Libraries/ServerScripts/ServerScriptModel.cs index 8ab1aacff..757723097 100644 --- a/Implem.Pleasanter/Libraries/ServerScripts/ServerScriptModel.cs +++ b/Implem.Pleasanter/Libraries/ServerScripts/ServerScriptModel.cs @@ -30,10 +30,32 @@ public class ServerScriptModel : IDisposable public ServerScriptModelNotification Notification; public ServerScriptModelHttpClient HttpClient; public readonly ServerScriptModelUtilities Utilities; + public readonly ServerScriptModelLogs Logs; + public readonly ServerScriptFile File; + public readonly ServerScriptCsv Csv; public bool Debug; private DateTime TimeOut; private readonly List ChangeItemNames = new List(); + public enum ServerScriptConditions + { + None, + WhenViewProcessing, + WhenloadingSiteSettings, + BeforeOpeningPage, + BeforeOpeningRow, + WhenloadingRecord, + BeforeFormula, + AfterFormula, + AfterUpdate, + BeforeUpdate, + AfterCreate, + BeforeCreate, + AfterDelete, + BeforeDelete, + BackgroundServerScript + } + public ServerScriptModel( Context context, SiteSettings ss, @@ -42,7 +64,7 @@ public ServerScriptModel( IEnumerable<(string Name, object Value)> saved, IEnumerable<(string Name, ServerScriptModelColumn Value)> columns, View view, - string condition, + ServerScriptConditions condition, DateTime timeOut, bool debug, bool onTesting) @@ -111,7 +133,7 @@ public ServerScriptModel( onTesting: onTesting, scriptDepth: context.ServerScriptDepth, controlId: context.Forms.ControlId(), - condition: condition); + condition: condition.ToString()); SiteSettings = new ServerScriptModelSiteSettings( context: context, ss: ss); @@ -131,6 +153,12 @@ public ServerScriptModel( Utilities = new ServerScriptModelUtilities( context: context, ss: ss); + Logs = new ServerScriptModelLogs( + context: context, + ss: ss); + File = new ServerScriptFile( + context: context); + Csv = new ServerScriptCsv(); Debug = debug; TimeOut = timeOut; } diff --git a/Implem.Pleasanter/Libraries/ServerScripts/ServerScriptModelLogs.cs b/Implem.Pleasanter/Libraries/ServerScripts/ServerScriptModelLogs.cs new file mode 100644 index 000000000..256343209 --- /dev/null +++ b/Implem.Pleasanter/Libraries/ServerScripts/ServerScriptModelLogs.cs @@ -0,0 +1,148 @@ +using Implem.Libraries.Utilities; +using Implem.Pleasanter.Libraries.General; +using Implem.Pleasanter.Libraries.Requests; +using Implem.Pleasanter.Libraries.Settings; +using Implem.Pleasanter.Models; +using System; + +namespace Implem.Pleasanter.Libraries.ServerScripts +{ + public class ServerScriptModelLogs + { + private readonly Context Context; + private readonly SiteSettings SiteSettings; + + public ServerScriptModelLogs(Context context, SiteSettings ss) + { + Context = context; + SiteSettings = ss; + } + + public bool LogInfo( + object message, + string method = "", + bool console = true, + bool sysLogs = true) + { + var ret = Log( + message: message, + sysLogType: SysLogModel.SysLogTypes.Info, + method: method, + console: console, + sysLogs: sysLogs); + return ret; + } + + public bool LogWarning( + object message, + string method = "", + bool console = true, + bool sysLogs = true) + { + var ret = Log( + message: message, + sysLogType: SysLogModel.SysLogTypes.Warning, + method: method, + console: console, + sysLogs: sysLogs); + return ret; + } + + public bool LogUserError( + object message, + string method = "", + bool console = true, + bool sysLogs = true) + { + var ret = Log( + message: message, + sysLogType: SysLogModel.SysLogTypes.UserError, + method: method, + console: console, + sysLogs: sysLogs); + return ret; + } + + public bool LogSystemError( + object message, + string method = "", + bool console = true, + bool sysLogs = true) + { + var ret = Log( + message: message, + sysLogType: SysLogModel.SysLogTypes.SystemError, + method: method, + console: console, + sysLogs: sysLogs); + return ret; + } + + public bool LogException( + object message, + string method = "", + bool console = true, + bool sysLogs = true) + { + var ret = Log( + message: message, + sysLogType: SysLogModel.SysLogTypes.Exception, + method: method, + console: console, + sysLogs: sysLogs); + return ret; + } + + public bool Log( + int type, + object message, + string method = "", + bool console = true, + bool sysLogs = true) + { + var ret = Log( + message: message, + sysLogType: Enum.IsDefined(typeof(SysLogModel.SysLogTypes), type) + ? (SysLogModel.SysLogTypes)type + : SysLogModel.SysLogTypes.Info, + method: method, + console: console, + sysLogs: sysLogs); + return ret; + } + + private bool Log( + SysLogModel.SysLogTypes sysLogType, + object message, + string method = "", + bool console = true, + bool sysLogs = true) + { + try + { + var strMessage = message?.ToString() ?? string.Empty; + if (console) + { + var methodBody = method.IsNullOrEmpty() + ? string.Empty + : $"[{method}]"; + var body = $"({sysLogType}):{methodBody}{strMessage}"; + Context.LogBuilder.AppendLine(body); + } + if (sysLogs) + { + new SysLogModel( + context: Context, + method: method, + message: strMessage, + sysLogType: sysLogType); + } + return true; + } + catch (Exception) + { + return false; + } + } + } +} \ No newline at end of file diff --git a/Implem.Pleasanter/Libraries/ServerScripts/ServerScriptUtilities.cs b/Implem.Pleasanter/Libraries/ServerScripts/ServerScriptUtilities.cs index 49a8f9e00..05ad76a2c 100644 --- a/Implem.Pleasanter/Libraries/ServerScripts/ServerScriptUtilities.cs +++ b/Implem.Pleasanter/Libraries/ServerScripts/ServerScriptUtilities.cs @@ -687,7 +687,7 @@ private static void SetColumnFilterHash( view.Overdue = false; view.Search = string.Empty; view.ColumnFilterHash?.Clear(); - } + } columnFilterHash?.ForEach(columnFilter => { if (view.ColumnFilterHash == null) @@ -773,7 +773,8 @@ private static void SetIssueModelValues( SiteSettings ss, IssueModel issueModel, ExpandoObject data, - Dictionary columns) + Dictionary columns, + ServerScriptConditions condition) { SetValue( columnName: nameof(IssueModel.Title), @@ -890,7 +891,8 @@ private static void SetResultModelValues( SiteSettings ss, ResultModel resultModel, ExpandoObject data, - Dictionary columns) + Dictionary columns, + ServerScriptConditions condition) { SetValue( columnName: nameof(ResultModel.Title), @@ -1043,7 +1045,8 @@ public static ServerScriptModelRow SetValues( ss: ss, issueModel: issueModel, data: data.Model, - columns: valueColumnDictionary); + columns: valueColumnDictionary, + ParseServerScriptCondition(data.Context.Condition)); } break; case "Results": @@ -1054,7 +1057,8 @@ public static ServerScriptModelRow SetValues( ss: ss, resultModel: resultModel, data: data.Model, - columns: valueColumnDictionary); + columns: valueColumnDictionary, + ParseServerScriptCondition(data.Context.Condition)); } break; } @@ -1064,6 +1068,13 @@ public static ServerScriptModelRow SetValues( return scriptValues; } + private static ServerScriptConditions ParseServerScriptCondition(string s) + { + return Enum.TryParse(s, out var condition) + ? condition + : ServerScriptConditions.None; + } + public static ServerScriptModelRow Execute( Context context, SiteSettings ss, @@ -1071,7 +1082,7 @@ public static ServerScriptModelRow Execute( BaseItemModel itemModel, View view, ServerScript[] scripts, - string condition, + ServerScriptConditions condition, bool debug, bool onTesting = false) { @@ -1114,6 +1125,7 @@ public static ServerScriptModelRow Execute( try { engine.ContinuationCallback = model.ContinuationCallback; + engine.Execute(ServerScriptJsLibraries.ScriptInit(), debug: false); engine.AddHostType(typeof(Newtonsoft.Json.JsonConvert)); engine.AddHostObject("context", model.Context); engine.AddHostObject("grid", model.Grid); @@ -1136,8 +1148,21 @@ public static ServerScriptModelRow Execute( engine.AddHostObject("httpClient", model.HttpClient); } engine.AddHostObject("utilities", model.Utilities); + engine.AddHostObject("logs", model.Logs); + if (!Parameters.Script.DisableServerScriptFile) + { + engine.AddHostObject("_file_cs", model.File); + engine.Execute(model.File.Script(), debug: false); + } + engine.AddHostObject("_csv_cs", model.Csv); + engine.Execute(model.Csv.Script(), debug: false); engine.Execute(ServerScriptJsLibraries.Scripts(), debug: false); - engine.Execute(scripts.Select(o => o.Body).Join("\n"), debug: debug); + engine.Execute( + code: scripts.Select(script => + ProcessedBody( + ss: ss, + script: script)).Join("\n"), + debug: debug); } finally { @@ -1148,7 +1173,7 @@ public static ServerScriptModelRow Execute( context: context, ss: ss, model: itemModel, - view: condition == "WhenViewProcessing" + view: condition == ServerScriptConditions.WhenViewProcessing ? view : null, data: model); @@ -1156,6 +1181,26 @@ public static ServerScriptModelRow Execute( return scriptValues; } + private static string ProcessedBody(SiteSettings ss, ServerScript script) + { + var body = script.Body; + if (script.Functionalize == true) + { + body = $"(()=>{{\n{script.Body}\n}})();"; + } + if (script.TryCatch == true) + { + var description = System.Web.HttpUtility.JavaScriptStringEncode(new List() + { + script.Id.ToString(), + script.Title, + script.Name + }.Where(o => o?.Trim().IsNullOrEmpty() == false).Join("_")); + body = $"try{{\n{body}\n}}catch(e){{\nlogs.LogException('{description}\\n' + e.stack);\n}}"; + } + return body; + } + private static DateTime GetTimeOut(ServerScript[] scripts) { if (scripts.Any(o => o.TimeOut == 0)) @@ -1182,7 +1227,7 @@ public static ServerScriptModelRow Execute( BaseItemModel itemModel, View view, Func where, - string condition) + ServerScriptConditions condition) { if (!(Parameters.Script.ServerScript != false && context.ContractSettings.ServerScript != false diff --git a/Implem.Pleasanter/Libraries/Settings/BackgroundServerScript.cs b/Implem.Pleasanter/Libraries/Settings/BackgroundServerScript.cs index a61b9955e..6c6592e1a 100644 --- a/Implem.Pleasanter/Libraries/Settings/BackgroundServerScript.cs +++ b/Implem.Pleasanter/Libraries/Settings/BackgroundServerScript.cs @@ -6,7 +6,6 @@ namespace Implem.Pleasanter.Libraries.Settings { public class BackgroundServerScript : ServerScript { - public bool? Disabled; public SettingList backgoundSchedules = new SettingList(); public int UserId; public string ServerScriptSchedule1; @@ -27,6 +26,8 @@ public BackgroundServerScript( bool disabled, string body, int? timeOut, + bool? functionalize, + bool? tryCatch, IEnumerable backgoundSchedules) : base( id: id, title: title, @@ -47,9 +48,12 @@ public BackgroundServerScript( shared: shared, background: true, body: body, - timeOut: timeOut) + functionalize: functionalize, + tryCatch: tryCatch, + timeOut: timeOut, + disabled: disabled) { - Disabled = disabled; + UserId = userId; this.backgoundSchedules = backgoundSchedules.ToJson().Deserialize>(); } @@ -74,6 +78,8 @@ public void Update( bool disabled, string body, int? timeOut, + bool? functionalize, + bool? tryCatch, IEnumerable backgoundSchedules) { Update( @@ -95,8 +101,11 @@ public void Update( shared: shared, background: true, body: body, + functionalize: functionalize, + tryCatch: tryCatch, + disabled: disabled, timeOut: timeOut); - Disabled = disabled; + UserId = userId; this.backgoundSchedules = backgoundSchedules.ToJson().Deserialize>(); } diff --git a/Implem.Pleasanter/Libraries/Settings/Choice.cs b/Implem.Pleasanter/Libraries/Settings/Choice.cs index c82a56df9..50a5cbdca 100644 --- a/Implem.Pleasanter/Libraries/Settings/Choice.cs +++ b/Implem.Pleasanter/Libraries/Settings/Choice.cs @@ -1,4 +1,7 @@ -using Implem.Libraries.Utilities; +using Implem.DefinitionAccessor; +using Implem.Libraries.Utilities; +using System.Linq; +using System.Text.RegularExpressions; namespace Implem.Pleasanter.Libraries.Settings { public class Choice @@ -39,7 +42,16 @@ public Choice(string choice, bool raw = false, string value = null) } else { - var array = choice.Split(','); + var array = Regex.Split( + choice, + Parameters.General.ChoiceSplitRegexPattern + ).Select(item => + Regex.Replace( + item, + Parameters.General.ChoiceReplaceRegexPattern, + Parameters.General.ChoiceReplaceRegexReplacement + ) + ); Value = array._1st(); Text = Strings.CoalesceEmpty(array._2nd(), Value); TextMini = Strings.CoalesceEmpty(array._3rd(), Text); diff --git a/Implem.Pleasanter/Libraries/Settings/Link.cs b/Implem.Pleasanter/Libraries/Settings/Link.cs index 2146b4360..db2dfe802 100644 --- a/Implem.Pleasanter/Libraries/Settings/Link.cs +++ b/Implem.Pleasanter/Libraries/Settings/Link.cs @@ -217,6 +217,11 @@ public void SetChoiceHash( || setAllChoices || selectedValues?.Any() == true) { + if (ss.Destinations == null && search) + { + ss.SetLinkedSiteSettings(context: context, sources: false); + ss.SetPermissions(context: context, referenceId: ss.ReferenceId); + } var currentSs = ss.Destinations?.Get(SiteId); if (currentSs != null) { diff --git a/Implem.Pleasanter/Libraries/Settings/ServerScript.cs b/Implem.Pleasanter/Libraries/Settings/ServerScript.cs index 35413af77..48c733221 100644 --- a/Implem.Pleasanter/Libraries/Settings/ServerScript.cs +++ b/Implem.Pleasanter/Libraries/Settings/ServerScript.cs @@ -24,6 +24,9 @@ public class ServerScript : ISettingListItem public bool? BeforeOpeningRow; public bool? Shared; public string Body; + public bool? Functionalize; + public bool? TryCatch; + public bool? Disabled; public int? TimeOut; [NonSerialized] public bool Debug; @@ -51,8 +54,11 @@ public ServerScript( bool? beforeOpeningPage, bool? beforeOpeningRow, string body, + bool? functionalize, + bool? tryCatch, bool? shared, bool? background, + bool? disabled, int? timeOut) { Id = id.ToInt(); @@ -72,8 +78,11 @@ public ServerScript( BeforeOpeningPage = beforeOpeningPage; BeforeOpeningRow = beforeOpeningRow; Body = body; + Functionalize = functionalize; + TryCatch = tryCatch; Shared = shared; TimeOut = timeOut; + Disabled = disabled; Background = background; } @@ -96,10 +105,13 @@ public void Update( bool? shared, bool? background, string body, + bool? functionalize, + bool? tryCatch, + bool? disabled, int? timeOut) { Title = title; - if (Name != null) Name = name; + if (name != null) Name = name; if (whenloadingSiteSettings != null) WhenloadingSiteSettings = whenloadingSiteSettings; if (whenViewProcessing != null) WhenViewProcessing = whenViewProcessing; if (whenloadingRecord != null) WhenloadingRecord = whenloadingRecord; @@ -116,6 +128,9 @@ public void Update( if (shared != null) Shared = shared; if (background != null) Background = background; if (body != null) Body = body; + if (functionalize != null) Functionalize = functionalize; + if (tryCatch != null) TryCatch = tryCatch; + if (disabled != null) Disabled = disabled; if (timeOut != null) TimeOut = timeOut; } @@ -141,6 +156,9 @@ public ServerScript GetRecordingData() if (Shared == true) script.Shared = true; if (Background == true) script.Background = true; script.Body = Body; + if (Functionalize == true) script.Functionalize = true; + if (TryCatch == true) script.TryCatch = true; + if (Disabled == true) script.Disabled = true; if (TimeOut != Parameters.Script.ServerScriptTimeOut && Parameters.Script.ServerScriptTimeOutChangeable) { script.TimeOut = TimeOut; diff --git a/Implem.Pleasanter/Libraries/Settings/SiteSettings.cs b/Implem.Pleasanter/Libraries/Settings/SiteSettings.cs index 06c0f8610..15768c0e9 100644 --- a/Implem.Pleasanter/Libraries/Settings/SiteSettings.cs +++ b/Implem.Pleasanter/Libraries/Settings/SiteSettings.cs @@ -166,6 +166,7 @@ public enum CalendarTypes : int public bool? AlwaysRequestSearchCondition; public bool? DisableLinkToEdit; public bool? OpenEditInNewTab; + public bool? EnableExpandLinkPath; public int? LinkTableView; public int? FirstDayOfWeek; public int? FirstMonth; @@ -416,7 +417,8 @@ public void SetLinkedSiteSettings( Dictionary joinedSsHash = null, bool destinations = true, bool sources = true, - List previously = null) + List previously = null, + bool? enableExpandLinkPath = null) { if ((!destinations || Destinations != null) && (!sources || Sources != null)) { @@ -430,6 +432,9 @@ public void SetLinkedSiteSettings( }; } JoinedSsHash = joinedSsHash; + enableExpandLinkPath = enableExpandLinkPath + ?? (Parameters.General.EnableExpandLinkPath == true + && EnableExpandLinkPath == true); if (destinations) { Destinations = SiteSettingsList( @@ -438,7 +443,8 @@ public void SetLinkedSiteSettings( joinedSsHash: joinedSsHash, joinStacks: JoinStacks, links: Links, - previously: previously); + previously: previously, + enableExpandLinkPath: enableExpandLinkPath); } if (sources) { @@ -448,7 +454,8 @@ public void SetLinkedSiteSettings( joinedSsHash: joinedSsHash, joinStacks: JoinStacks, links: Links, - previously: previously); + previously: previously, + enableExpandLinkPath: enableExpandLinkPath); } if (destinations && sources) { @@ -463,6 +470,7 @@ private Dictionary SiteSettingsList( List joinStacks, List links, List previously, + bool? enableExpandLinkPath, Dictionary cache = null) { var hash = new Dictionary(); @@ -495,9 +503,19 @@ private Dictionary SiteSettingsList( ss.ParentId = dataRow.Long("ParentId"); ss.InheritPermission = dataRow.Long("InheritPermission"); ss.Linked = true; - previously = (previously == null) - ? new List() - : previously.Copy(); + if (enableExpandLinkPath==true) + { + previously = (previously == null) + ? new List() + : previously.Copy(); + } + else + { + if (previously == null) + { + previously = new List(); + } + } previously.Add(ss.SiteId); switch (direction) { @@ -519,7 +537,8 @@ private Dictionary SiteSettingsList( joinedSsHash: joinedSsHash, destinations: true, sources: false, - previously: previously); + previously: previously, + enableExpandLinkPath: enableExpandLinkPath); break; case "Sources": ss.Links @@ -539,7 +558,8 @@ private Dictionary SiteSettingsList( joinedSsHash: joinedSsHash, destinations: false, sources: true, - previously: previously); + previously: previously, + enableExpandLinkPath: enableExpandLinkPath); break; } hash.Add(ss.SiteId, ss); @@ -756,6 +776,10 @@ public SiteSettings RecordingData(Context context) { ss.OpenEditInNewTab = OpenEditInNewTab; } + if (EnableExpandLinkPath == true) + { + ss.EnableExpandLinkPath = EnableExpandLinkPath; + } if (LinkTableView != 0) { ss.LinkTableView = LinkTableView; @@ -3877,6 +3901,7 @@ public void Set(Context context, string propertyName, string value) case "AlwaysRequestSearchCondition": AlwaysRequestSearchCondition = value.ToBool(); break; case "DisableLinkToEdit": DisableLinkToEdit = value.ToBool(); break; case "OpenEditInNewTab": OpenEditInNewTab = value.ToBool(); break; + case "EnableExpandLinkPath": EnableExpandLinkPath = value.ToBool();break; case "LinkTableView": LinkTableView = value.ToInt(); break; case "FirstDayOfWeek": FirstDayOfWeek = value.ToInt(); break; case "FirstMonth": FirstMonth = value.ToInt(); break; @@ -5815,7 +5840,7 @@ public List GetServerScripts(Context context) Shared = extendedServerScript.Shared, Body = extendedServerScript.Body }) - .Concat(ServerScripts) + .Concat(ServerScripts.Where(script=>script.Disabled != true)) .ToList(); ServerScriptsAndExtended .Where(serverScript => diff --git a/Implem.Pleasanter/Libraries/Settings/View.cs b/Implem.Pleasanter/Libraries/Settings/View.cs index 8d4bd9992..01ae52302 100644 --- a/Implem.Pleasanter/Libraries/Settings/View.cs +++ b/Implem.Pleasanter/Libraries/Settings/View.cs @@ -3303,7 +3303,7 @@ private void SetByWhenViewProcessingServerScript( itemModel: null, view: this, where: script => script.WhenViewProcessing == true, - condition: "WhenViewProcessing"); + condition: ServerScriptModel.ServerScriptConditions.WhenViewProcessing); WhenViewProcessingServerScriptExecuted = true; } } diff --git a/Implem.Pleasanter/Models/Binaries/BinaryUtilities.cs b/Implem.Pleasanter/Models/Binaries/BinaryUtilities.cs index 94b220a29..467be12ae 100644 --- a/Implem.Pleasanter/Models/Binaries/BinaryUtilities.cs +++ b/Implem.Pleasanter/Models/Binaries/BinaryUtilities.cs @@ -806,7 +806,7 @@ public static string UploadFile( case Error.Types.OverLimitQuantity: return Messages.ResponseOverLimitQuantity( context: context, - data: column.LimitQuantity.ToString()).ToJson(); + data: column.LimitQuantity.ToInt().ToString()).ToJson(); case Error.Types.OverLimitSize: return Messages.ResponseOverLimitSize( context: context, diff --git a/Implem.Pleasanter/Models/Dashboards/DashboardModel.cs b/Implem.Pleasanter/Models/Dashboards/DashboardModel.cs index f4c498aad..21a49765c 100644 --- a/Implem.Pleasanter/Models/Dashboards/DashboardModel.cs +++ b/Implem.Pleasanter/Models/Dashboards/DashboardModel.cs @@ -1850,7 +1850,7 @@ private string ExecFormulaExtended( context: context, method: nameof(SetByFormula), message: $"Formula error {value}", - sysLogType: SysLogModel.SysLogTypes.Execption); + sysLogType: SysLogModel.SysLogTypes.Exception); break; } if (outputFormulaLogs == true) diff --git a/Implem.Pleasanter/Models/Issues/IssueModel.cs b/Implem.Pleasanter/Models/Issues/IssueModel.cs index 646402c92..a9da7cc85 100644 --- a/Implem.Pleasanter/Models/Issues/IssueModel.cs +++ b/Implem.Pleasanter/Models/Issues/IssueModel.cs @@ -3889,7 +3889,7 @@ private string ExecFormulaExtended( context: context, method: nameof(SetByFormula), message: $"Formula error {value}", - sysLogType: SysLogModel.SysLogTypes.Execption); + sysLogType: SysLogModel.SysLogTypes.Exception); break; } if (outputFormulaLogs == true) diff --git a/Implem.Pleasanter/Models/Issues/IssueUtilities.cs b/Implem.Pleasanter/Models/Issues/IssueUtilities.cs index caa58119d..54dec626d 100644 --- a/Implem.Pleasanter/Models/Issues/IssueUtilities.cs +++ b/Implem.Pleasanter/Models/Issues/IssueUtilities.cs @@ -1929,6 +1929,10 @@ public static HtmlBuilder Field( context: context, ss: ss, column: column); + var rawValue = issueModel.ControlRawValue( + context: context, + ss: ss, + column: column); if (value != null) { value += issueModel.NumUnit( @@ -1948,6 +1952,7 @@ public static HtmlBuilder Field( ?.ServerScriptModelRow ?.Columns.Get(column.ColumnName), value: value, + rawValue: rawValue, controlConstraintsType: issueModel.GetStatusControl( context: context, ss: ss, @@ -2382,6 +2387,136 @@ public static string ControlValue( } } + public static object ControlRawValue( + this IssueModel issueModel, + Context context, + SiteSettings ss, + Column column) + { + switch (column.Name) + { + case "IssueId": + return issueModel.IssueId + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Ver": + return issueModel.Ver + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Title": + return issueModel.Title + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Body": + return issueModel.Body + .ToApiValue( + context: context, + ss: ss, + column: column); + case "StartTime": + return issueModel.StartTime + .ToApiValue( + context: context, + ss: ss, + column: column); + case "CompletionTime": + return issueModel.CompletionTime + .ToApiValue( + context: context, + ss: ss, + column: column); + case "WorkValue": + return issueModel.WorkValue + .ToApiValue( + context: context, + ss: ss, + column: column); + case "ProgressRate": + return issueModel.ProgressRate + .ToApiValue( + context: context, + ss: ss, + column: column); + case "RemainingWorkValue": + return issueModel.RemainingWorkValue + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Status": + return issueModel.Status + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Manager": + return issueModel.Manager + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Owner": + return issueModel.Owner + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Locked": + return issueModel.Locked + .ToApiValue( + context: context, + ss: ss, + column: column); + default: + switch (Def.ExtendedColumnTypes.Get(column?.Name ?? string.Empty)) + { + case "Class": + return issueModel.GetClass(columnName: column.Name) + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Num": + return issueModel.GetNum(columnName: column.Name) + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Date": + return issueModel.GetDate(columnName: column.Name) + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Description": + return issueModel.GetDescription(columnName: column.Name) + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Check": + return issueModel.GetCheck(columnName: column.Name) + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Attachments": + return issueModel.GetAttachments(columnName: column.Name) + .ToApiValue( + context: context, + ss: ss, + column: column); + default: return null; + } + } + } + /// /// Fixed: /// @@ -3397,6 +3532,10 @@ public static ContentResultInheritance CreateByApi(Context context, SiteSettings { context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); } + if(HasInvalidValueAsApiDataAtCreate(issueApiModel)) + { + context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); + } var issueModel = new IssueModel( context: context, ss: ss, @@ -3490,6 +3629,10 @@ public static bool CreateByServerScript(Context context, SiteSettings ss, object { context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); } + if(HasInvalidValueAsApiDataAtCreate(issueApiModel)) + { + context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); + } var issueModel = new IssueModel( context: context, ss: ss, @@ -3532,6 +3675,25 @@ public static bool CreateByServerScript(Context context, SiteSettings ss, object } } + private static bool HasInvalidValueAsApiDataAtCreate(IssueApiModel model) + { + if (model is null) + return false; + foreach (var o in model.AttachmentsHash) + { + foreach (var attachment in o.Value) + { + if (attachment.Deleted ?? false) + continue; + if (attachment.Name.IsNullOrEmpty()) + return true; + if (attachment.Base64 is null && attachment.Base64Binary is null) + return true; + } + } + return false; + } + public static string Update(Context context, SiteSettings ss, long issueId, string previousTitle) { var issueModel = new IssueModel( @@ -3930,11 +4092,17 @@ public static string BulkUpdate(Context context, SiteSettings ss) case Error.Types.None: break; default: return invalid.MessageJson(context: context); } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return Error.Types.ImportLock.MessageJson(context: context); + } var count = BulkUpdate( context: context, ss: ss, columns: columns, - where: where); + where: where, + watchdog: () => exclusiveObj.Refresh()); var data = new string[] { ss.Title, @@ -3980,13 +4148,15 @@ private static int BulkUpdate( Context context, SiteSettings ss, List columns, - SqlWhereCollection where) + SqlWhereCollection where, + Action watchdog = null) { var onBulkUpdatingExtendedStatements = new List().OnBulkUpdatingExtendedSqls( context: context, siteId: ss.SiteId); if (onBulkUpdatingExtendedStatements.Count > 0) { + watchdog?.Invoke(); Repository.ExecuteNonQuery( context: context, transactional: true, @@ -4004,6 +4174,7 @@ private static int BulkUpdate( }), where: where).ForEach(issueModel => { + watchdog?.Invoke(); issueModel.SetByForm( context: context, ss: ss, @@ -4026,6 +4197,7 @@ private static int BulkUpdate( siteId: ss.SiteId); if (onBulkUpdatedExtendedStatements.Count > 0) { + watchdog?.Invoke(); Repository.ExecuteNonQuery( context: context, transactional: true, @@ -4512,6 +4684,10 @@ public static ContentResultInheritance UpdateByApi( { context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); } + if(HasInvalidValueAsApiDataAtUpdate(issueApiModel)) + { + context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); + } var issueModel = new IssueModel( context: context, ss: ss, @@ -4615,6 +4791,10 @@ public static bool UpdateByServerScript( { context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); } + if(HasInvalidValueAsApiDataAtUpdate(issueApiModel)) + { + context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); + } var issueModel = new IssueModel( context: context, ss: ss, @@ -4667,6 +4847,25 @@ public static bool UpdateByServerScript( } } + private static bool HasInvalidValueAsApiDataAtUpdate(IssueApiModel model) + { + if (model is null) + return false; + foreach (var o in model.AttachmentsHash) + { + foreach (var attachment in o.Value) + { + if (attachment.Deleted ?? false) + continue; + if (attachment.Name.IsNullOrEmpty()) + return true; + if (attachment.Base64 is null && attachment.Base64Binary is null) + return true; + } + } + return false; + } + public static ContentResultInheritance UpsertByApi( Context context, SiteSettings ss, @@ -4934,6 +5133,14 @@ public static ContentResultInheritance BulkUpsertByApi( context: context, data: Parameters.General.BulkUpsertMax.ToString()).Text)); } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return ApiResults.Get(new ApiResponse( + id: context.Id, + statusCode: 429, + message: Messages.ImportLock(context: context).Text)); + } var recodeCount = 0; var insertCount = 0; var updateCount = 0; @@ -4941,6 +5148,7 @@ public static ContentResultInheritance BulkUpsertByApi( foreach (var issueApiModel in list.Data) { recodeCount++; + exclusiveObj.Refresh(); var view = api.View ?? new View(); api.Keys?.ForEach(columnName => { @@ -5044,6 +5252,7 @@ public static ContentResultInheritance BulkUpsertByApi( insertCount++; } } + exclusiveObj.Refresh(); if (error.Type != Error.Types.None) { var errMessage = error.Data?.Any() == true @@ -6175,11 +6384,18 @@ public static string BulkDelete(Context context, SiteSettings ss) case Error.Types.None: break; default: return invalid.MessageJson(context: context); } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return Error.Types.ImportLock.MessageJson(context: context); + } var count = BulkDelete( context: context, ss: ss, where: where, - param: param); + param: param, + watchdog: () => exclusiveObj.Refresh()); + exclusiveObj.Refresh(); Summaries.Synchronize(context: context, ss: ss); var data = new string[] { @@ -6206,6 +6422,7 @@ public static string BulkDelete(Context context, SiteSettings ss) body: body.ToString()); } }); + exclusiveObj.Refresh(); return GridRows( context: context, ss: ss, @@ -6224,7 +6441,8 @@ public static int BulkDelete( Context context, SiteSettings ss, SqlWhereCollection where, - SqlParamCollection param) + SqlParamCollection param, + Action watchdog = null) { var sub = Rds.SelectIssues( column: Rds.IssuesColumn().IssueId(), @@ -6288,6 +6506,7 @@ public static int BulkDelete( statements.OnBulkDeletedExtendedSqls( context: context, siteId: ss.SiteId); + watchdog?.Invoke(); var ids = Rds.ExecuteTable( context: context, statements: Rds.SelectBinaries( @@ -6298,6 +6517,7 @@ public static int BulkDelete( .AsEnumerable() .Select(dataRow => dataRow.Long("ReferenceId")) .ToList(); + watchdog?.Invoke(); var affectedRows = Repository.ExecuteScalar_response( context: context, transactional: true, @@ -6334,6 +6554,14 @@ public static ContentResultInheritance BulkDeleteByApi( { return ApiResults.Get(ApiResponses.BadRequest(context: context)); } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return ApiResults.Get(new ApiResponse( + id: context.Id, + statusCode: 429, + message: Messages.ImportLock(context: context).Text)); + } var view = recordSelector.View ?? Views.GetBySession( context: context, ss: ss); @@ -6362,11 +6590,14 @@ public static ContentResultInheritance BulkDeleteByApi( context: context, errorData: invalid); } + exclusiveObj.Refresh(); var count = BulkDelete( context: context, ss: ss, where: where, - param: param); + param: param, + watchdog: () => exclusiveObj.Refresh()); + exclusiveObj.Refresh(); Summaries.Synchronize( context: context, ss: ss); @@ -6427,6 +6658,11 @@ public static long BulkDeleteByServerScript( { return 0; } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return 0; + } var view = recordSelector.View ?? Views.GetBySession( context: context, ss: ss); @@ -6453,11 +6689,13 @@ public static long BulkDeleteByServerScript( default: return 0; } + exclusiveObj.Refresh(); var count = BulkDelete( context: context, ss: ss, where: where, - param: param); + param: param, + watchdog: () => exclusiveObj.Refresh()); Summaries.Synchronize( context: context, ss: ss); @@ -6798,6 +7036,11 @@ public static long PhysicalBulkDeleteByServerScript( { return 0; } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return 0; + } var view = recordSelector.View ?? Views.GetBySession( context: context, ss: ss); @@ -6856,6 +7099,11 @@ public static string Import(Context context, SiteModel siteModel) case Error.Types.None: break; default: return invalid.MessageJson(context: context); } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return Error.Types.ImportLock.MessageJson(context: context); + } var res = new ResponseCollection(context: context); Csv csv; try @@ -6868,6 +7116,7 @@ public static string Import(Context context, SiteModel siteModel) { return Messages.ResponseFailedReadFile(context: context).ToJson(); } + exclusiveObj.Refresh(); var count = csv.Rows.Count(); if (Parameters.General.ImportMax > 0 && Parameters.General.ImportMax < count) { @@ -6917,6 +7166,7 @@ public static string Import(Context context, SiteModel siteModel) .ToDictionary(o => o.Index, o => o.Row); foreach (var data in csvRows) { + exclusiveObj.Refresh(); var issueModel = new IssueModel( context: context, ss: ss); @@ -6980,6 +7230,7 @@ public static string Import(Context context, SiteModel siteModel) var updateCount = 0; foreach (var data in issueHash) { + exclusiveObj.Refresh(); var issueModel = data.Value; if (issueModel.AccessStatus == Databases.AccessStatuses.Selected) { @@ -7162,6 +7413,14 @@ public static ContentResultInheritance ImportByApi( { return null; } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return ApiResults.Get(new ApiResponse( + id: context.Id, + statusCode: 429, + message: Messages.ImportLock(context: context).Text)); + } var invalid = IssueValidators.OnImporting( context: context, ss: ss, @@ -7254,6 +7513,7 @@ public static ContentResultInheritance ImportByApi( .ToDictionary(o => o.Index, o => o.Row); foreach (var data in csvRows) { + exclusiveObj.Refresh(); var issueModel = new IssueModel( context: context, ss: ss); @@ -7313,6 +7573,7 @@ public static ContentResultInheritance ImportByApi( var updateCount = 0; foreach (var data in issueHash) { + exclusiveObj.Refresh(); var issueModel = data.Value; if (issueModel.AccessStatus == Databases.AccessStatuses.Selected) { @@ -7420,6 +7681,7 @@ public static ContentResultInheritance ImportByApi( insertCount++; } } + exclusiveObj.Refresh(); ImportUtilities.SetOnImportedExtendedSqls(context, ss); ss.Notifications.ForEach(notification => { @@ -7651,6 +7913,14 @@ public static ContentResultInheritance ExportByApi( { return ApiResults.Get(ApiResponses.BadRequest(context: context)); } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return ApiResults.Get(new ApiResponse( + id: context.Id, + statusCode: 429, + message: Messages.ImportLock(context: context).Text)); + } var export = api.Export ?? ss.GetExport( context: context, id: api.ExportId); diff --git a/Implem.Pleasanter/Models/Issues/IssueValidators.cs b/Implem.Pleasanter/Models/Issues/IssueValidators.cs index 25403c7b3..ff4f944ed 100644 --- a/Implem.Pleasanter/Models/Issues/IssueValidators.cs +++ b/Implem.Pleasanter/Models/Issues/IssueValidators.cs @@ -1243,35 +1243,35 @@ private static ErrorData OnAttaching( return new ErrorData( context: context, type: Error.Types.OverLimitSize, - data: column.LimitSize.ToInt().ToString(), + data: column.LimitSize.ToString(), sysLogsStatus: 400, sysLogsDescription: Debugs.GetSysLogsDescription()); case Error.Types.OverTotalLimitSize: return new ErrorData( context: context, type: Error.Types.OverTotalLimitSize, - data: column.TotalLimitSize.ToInt().ToString(), + data: column.TotalLimitSize.ToString(), sysLogsStatus: 400, sysLogsDescription: Debugs.GetSysLogsDescription()); case Error.Types.OverLocalFolderLimitSize: return new ErrorData( context: context, type: Error.Types.OverLocalFolderLimitSize, - data: column.LocalFolderLimitSize.ToInt().ToString(), + data: column.LocalFolderLimitSize.ToString(), sysLogsStatus: 400, sysLogsDescription: Debugs.GetSysLogsDescription()); case Error.Types.OverLocalFolderTotalLimitSize: return new ErrorData( context: context, type: Error.Types.OverLocalFolderTotalLimitSize, - data: column.LocalFolderTotalLimitSize.ToInt().ToString(), + data: column.LocalFolderTotalLimitSize.ToString(), sysLogsStatus: 400, sysLogsDescription: Debugs.GetSysLogsDescription()); case Error.Types.OverTenantStorageSize: return new ErrorData( context: context, type: Error.Types.OverTenantStorageSize, - data: context.ContractSettings.StorageSize.ToInt().ToString(), + data: context.ContractSettings.StorageSize.ToString(), sysLogsStatus: 400, sysLogsDescription: Debugs.GetSysLogsDescription()); } diff --git a/Implem.Pleasanter/Models/Items/ItemModel.cs b/Implem.Pleasanter/Models/Items/ItemModel.cs index 5fc900a99..848ff8fc1 100644 --- a/Implem.Pleasanter/Models/Items/ItemModel.cs +++ b/Implem.Pleasanter/Models/Items/ItemModel.cs @@ -3367,10 +3367,16 @@ public string SynchronizeSummaries(Context context) { SetSite(context: context); var selected = context.Forms.IntList("EditSummary"); + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return Messages.ImportLock(context: context).ToJson(); + } var result = SiteUtilities.SynchronizeSummaries( context: context, siteModel: Site, - selected: selected); + selected: selected, + watchdog: () => exclusiveObj.Refresh()); if (result.Type == Error.Types.None) { return Messages.ResponseSynchronizationCompleted(context: context).ToJson(); @@ -3399,10 +3405,19 @@ public ContentResultInheritance SynchronizeSummariesByApi(Context context) sysLogsStatus: 400, sysLogsDescription: Debugs.GetSysLogsDescription())); } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return ApiResults.Get(new ApiResponse( + id: context.Id, + statusCode: 429, + message: Messages.ImportLock(context: context).Text)); + } var result = SiteUtilities.SynchronizeSummaries( context: context, siteModel: Site, - selected: selected); + selected: selected, + watchdog: () => exclusiveObj.Refresh()); if (result.Type == Error.Types.SelectTargets) { return ApiResults.Success( diff --git a/Implem.Pleasanter/Models/Results/ResultModel.cs b/Implem.Pleasanter/Models/Results/ResultModel.cs index d27f78826..391e093a0 100644 --- a/Implem.Pleasanter/Models/Results/ResultModel.cs +++ b/Implem.Pleasanter/Models/Results/ResultModel.cs @@ -3556,7 +3556,7 @@ private string ExecFormulaExtended( context: context, method: nameof(SetByFormula), message: $"Formula error {value}", - sysLogType: SysLogModel.SysLogTypes.Execption); + sysLogType: SysLogModel.SysLogTypes.Exception); break; } if (outputFormulaLogs == true) diff --git a/Implem.Pleasanter/Models/Results/ResultUtilities.cs b/Implem.Pleasanter/Models/Results/ResultUtilities.cs index 5f4feffc9..5a65bd48a 100644 --- a/Implem.Pleasanter/Models/Results/ResultUtilities.cs +++ b/Implem.Pleasanter/Models/Results/ResultUtilities.cs @@ -1824,6 +1824,10 @@ public static HtmlBuilder Field( context: context, ss: ss, column: column); + var rawValue = resultModel.ControlRawValue( + context: context, + ss: ss, + column: column); if (value != null) { value += resultModel.NumUnit( @@ -1843,6 +1847,7 @@ public static HtmlBuilder Field( ?.ServerScriptModelRow ?.Columns.Get(column.ColumnName), value: value, + rawValue: rawValue, controlConstraintsType: resultModel.GetStatusControl( context: context, ss: ss, @@ -2247,6 +2252,106 @@ public static string ControlValue( } } + public static object ControlRawValue( + this ResultModel resultModel, + Context context, + SiteSettings ss, + Column column) + { + switch (column.Name) + { + case "ResultId": + return resultModel.ResultId + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Ver": + return resultModel.Ver + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Title": + return resultModel.Title + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Body": + return resultModel.Body + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Status": + return resultModel.Status + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Manager": + return resultModel.Manager + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Owner": + return resultModel.Owner + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Locked": + return resultModel.Locked + .ToApiValue( + context: context, + ss: ss, + column: column); + default: + switch (Def.ExtendedColumnTypes.Get(column?.Name ?? string.Empty)) + { + case "Class": + return resultModel.GetClass(columnName: column.Name) + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Num": + return resultModel.GetNum(columnName: column.Name) + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Date": + return resultModel.GetDate(columnName: column.Name) + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Description": + return resultModel.GetDescription(columnName: column.Name) + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Check": + return resultModel.GetCheck(columnName: column.Name) + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Attachments": + return resultModel.GetAttachments(columnName: column.Name) + .ToApiValue( + context: context, + ss: ss, + column: column); + default: return null; + } + } + } + private static HtmlBuilder MainCommandExtensions( this HtmlBuilder hb, Context context, @@ -3216,6 +3321,10 @@ public static ContentResultInheritance CreateByApi(Context context, SiteSettings { context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); } + if(HasInvalidValueAsApiDataAtCreate(resultApiModel)) + { + context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); + } var resultModel = new ResultModel( context: context, ss: ss, @@ -3309,6 +3418,10 @@ public static bool CreateByServerScript(Context context, SiteSettings ss, object { context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); } + if(HasInvalidValueAsApiDataAtCreate(resultApiModel)) + { + context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); + } var resultModel = new ResultModel( context: context, ss: ss, @@ -3351,6 +3464,25 @@ public static bool CreateByServerScript(Context context, SiteSettings ss, object } } + private static bool HasInvalidValueAsApiDataAtCreate(ResultApiModel model) + { + if (model is null) + return false; + foreach (var o in model.AttachmentsHash) + { + foreach (var attachment in o.Value) + { + if (attachment.Deleted ?? false) + continue; + if (attachment.Name.IsNullOrEmpty()) + return true; + if (attachment.Base64 is null && attachment.Base64Binary is null) + return true; + } + } + return false; + } + public static string Update(Context context, SiteSettings ss, long resultId, string previousTitle) { var resultModel = new ResultModel( @@ -3742,11 +3874,17 @@ public static string BulkUpdate(Context context, SiteSettings ss) case Error.Types.None: break; default: return invalid.MessageJson(context: context); } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return Error.Types.ImportLock.MessageJson(context: context); + } var count = BulkUpdate( context: context, ss: ss, columns: columns, - where: where); + where: where, + watchdog: () => exclusiveObj.Refresh()); var data = new string[] { ss.Title, @@ -3792,13 +3930,15 @@ private static int BulkUpdate( Context context, SiteSettings ss, List columns, - SqlWhereCollection where) + SqlWhereCollection where, + Action watchdog = null) { var onBulkUpdatingExtendedStatements = new List().OnBulkUpdatingExtendedSqls( context: context, siteId: ss.SiteId); if (onBulkUpdatingExtendedStatements.Count > 0) { + watchdog?.Invoke(); Repository.ExecuteNonQuery( context: context, transactional: true, @@ -3816,6 +3956,7 @@ private static int BulkUpdate( }), where: where).ForEach(resultModel => { + watchdog?.Invoke(); resultModel.SetByForm( context: context, ss: ss, @@ -3838,6 +3979,7 @@ private static int BulkUpdate( siteId: ss.SiteId); if (onBulkUpdatedExtendedStatements.Count > 0) { + watchdog?.Invoke(); Repository.ExecuteNonQuery( context: context, transactional: true, @@ -4324,6 +4466,10 @@ public static ContentResultInheritance UpdateByApi( { context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); } + if(HasInvalidValueAsApiDataAtUpdate(resultApiModel)) + { + context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); + } var resultModel = new ResultModel( context: context, ss: ss, @@ -4427,6 +4573,10 @@ public static bool UpdateByServerScript( { context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); } + if(HasInvalidValueAsApiDataAtUpdate(resultApiModel)) + { + context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); + } var resultModel = new ResultModel( context: context, ss: ss, @@ -4479,6 +4629,25 @@ public static bool UpdateByServerScript( } } + private static bool HasInvalidValueAsApiDataAtUpdate(ResultApiModel model) + { + if (model is null) + return false; + foreach (var o in model.AttachmentsHash) + { + foreach (var attachment in o.Value) + { + if (attachment.Deleted ?? false) + continue; + if (attachment.Name.IsNullOrEmpty()) + return true; + if (attachment.Base64 is null && attachment.Base64Binary is null) + return true; + } + } + return false; + } + public static ContentResultInheritance UpsertByApi( Context context, SiteSettings ss, @@ -4746,6 +4915,14 @@ public static ContentResultInheritance BulkUpsertByApi( context: context, data: Parameters.General.BulkUpsertMax.ToString()).Text)); } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return ApiResults.Get(new ApiResponse( + id: context.Id, + statusCode: 429, + message: Messages.ImportLock(context: context).Text)); + } var recodeCount = 0; var insertCount = 0; var updateCount = 0; @@ -4753,6 +4930,7 @@ public static ContentResultInheritance BulkUpsertByApi( foreach (var resultApiModel in list.Data) { recodeCount++; + exclusiveObj.Refresh(); var view = api.View ?? new View(); api.Keys?.ForEach(columnName => { @@ -4856,6 +5034,7 @@ public static ContentResultInheritance BulkUpsertByApi( insertCount++; } } + exclusiveObj.Refresh(); if (error.Type != Error.Types.None) { var errMessage = error.Data?.Any() == true @@ -5842,11 +6021,18 @@ public static string BulkDelete(Context context, SiteSettings ss) case Error.Types.None: break; default: return invalid.MessageJson(context: context); } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return Error.Types.ImportLock.MessageJson(context: context); + } var count = BulkDelete( context: context, ss: ss, where: where, - param: param); + param: param, + watchdog: () => exclusiveObj.Refresh()); + exclusiveObj.Refresh(); Summaries.Synchronize(context: context, ss: ss); var data = new string[] { @@ -5873,6 +6059,7 @@ public static string BulkDelete(Context context, SiteSettings ss) body: body.ToString()); } }); + exclusiveObj.Refresh(); return GridRows( context: context, ss: ss, @@ -5891,7 +6078,8 @@ public static int BulkDelete( Context context, SiteSettings ss, SqlWhereCollection where, - SqlParamCollection param) + SqlParamCollection param, + Action watchdog = null) { var sub = Rds.SelectResults( column: Rds.ResultsColumn().ResultId(), @@ -5955,6 +6143,7 @@ public static int BulkDelete( statements.OnBulkDeletedExtendedSqls( context: context, siteId: ss.SiteId); + watchdog?.Invoke(); var ids = Rds.ExecuteTable( context: context, statements: Rds.SelectBinaries( @@ -5965,6 +6154,7 @@ public static int BulkDelete( .AsEnumerable() .Select(dataRow => dataRow.Long("ReferenceId")) .ToList(); + watchdog?.Invoke(); var affectedRows = Repository.ExecuteScalar_response( context: context, transactional: true, @@ -6001,6 +6191,14 @@ public static ContentResultInheritance BulkDeleteByApi( { return ApiResults.Get(ApiResponses.BadRequest(context: context)); } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return ApiResults.Get(new ApiResponse( + id: context.Id, + statusCode: 429, + message: Messages.ImportLock(context: context).Text)); + } var view = recordSelector.View ?? Views.GetBySession( context: context, ss: ss); @@ -6029,11 +6227,14 @@ public static ContentResultInheritance BulkDeleteByApi( context: context, errorData: invalid); } + exclusiveObj.Refresh(); var count = BulkDelete( context: context, ss: ss, where: where, - param: param); + param: param, + watchdog: () => exclusiveObj.Refresh()); + exclusiveObj.Refresh(); Summaries.Synchronize( context: context, ss: ss); @@ -6094,6 +6295,11 @@ public static long BulkDeleteByServerScript( { return 0; } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return 0; + } var view = recordSelector.View ?? Views.GetBySession( context: context, ss: ss); @@ -6120,11 +6326,13 @@ public static long BulkDeleteByServerScript( default: return 0; } + exclusiveObj.Refresh(); var count = BulkDelete( context: context, ss: ss, where: where, - param: param); + param: param, + watchdog: () => exclusiveObj.Refresh()); Summaries.Synchronize( context: context, ss: ss); @@ -6465,6 +6673,11 @@ public static long PhysicalBulkDeleteByServerScript( { return 0; } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return 0; + } var view = recordSelector.View ?? Views.GetBySession( context: context, ss: ss); @@ -6523,6 +6736,11 @@ public static string Import(Context context, SiteModel siteModel) case Error.Types.None: break; default: return invalid.MessageJson(context: context); } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return Error.Types.ImportLock.MessageJson(context: context); + } var res = new ResponseCollection(context: context); Csv csv; try @@ -6535,6 +6753,7 @@ public static string Import(Context context, SiteModel siteModel) { return Messages.ResponseFailedReadFile(context: context).ToJson(); } + exclusiveObj.Refresh(); var count = csv.Rows.Count(); if (Parameters.General.ImportMax > 0 && Parameters.General.ImportMax < count) { @@ -6584,6 +6803,7 @@ public static string Import(Context context, SiteModel siteModel) .ToDictionary(o => o.Index, o => o.Row); foreach (var data in csvRows) { + exclusiveObj.Refresh(); var resultModel = new ResultModel( context: context, ss: ss); @@ -6640,6 +6860,7 @@ public static string Import(Context context, SiteModel siteModel) var updateCount = 0; foreach (var data in resultHash) { + exclusiveObj.Refresh(); var resultModel = data.Value; if (resultModel.AccessStatus == Databases.AccessStatuses.Selected) { @@ -6822,6 +7043,14 @@ public static ContentResultInheritance ImportByApi( { return null; } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return ApiResults.Get(new ApiResponse( + id: context.Id, + statusCode: 429, + message: Messages.ImportLock(context: context).Text)); + } var invalid = ResultValidators.OnImporting( context: context, ss: ss, @@ -6914,6 +7143,7 @@ public static ContentResultInheritance ImportByApi( .ToDictionary(o => o.Index, o => o.Row); foreach (var data in csvRows) { + exclusiveObj.Refresh(); var resultModel = new ResultModel( context: context, ss: ss); @@ -6973,6 +7203,7 @@ public static ContentResultInheritance ImportByApi( var updateCount = 0; foreach (var data in resultHash) { + exclusiveObj.Refresh(); var resultModel = data.Value; if (resultModel.AccessStatus == Databases.AccessStatuses.Selected) { @@ -7080,6 +7311,7 @@ public static ContentResultInheritance ImportByApi( insertCount++; } } + exclusiveObj.Refresh(); ImportUtilities.SetOnImportedExtendedSqls(context, ss); ss.Notifications.ForEach(notification => { @@ -7311,6 +7543,14 @@ public static ContentResultInheritance ExportByApi( { return ApiResults.Get(ApiResponses.BadRequest(context: context)); } + using var exclusiveObj = new Sessions.TableExclusive(context: context); + if (!exclusiveObj.TryLock()) + { + return ApiResults.Get(new ApiResponse( + id: context.Id, + statusCode: 429, + message: Messages.ImportLock(context: context).Text)); + } var export = api.Export ?? ss.GetExport( context: context, id: api.ExportId); diff --git a/Implem.Pleasanter/Models/Results/ResultValidators.cs b/Implem.Pleasanter/Models/Results/ResultValidators.cs index 36a2d0258..1a135a91e 100644 --- a/Implem.Pleasanter/Models/Results/ResultValidators.cs +++ b/Implem.Pleasanter/Models/Results/ResultValidators.cs @@ -1135,35 +1135,35 @@ private static ErrorData OnAttaching( return new ErrorData( context: context, type: Error.Types.OverLimitSize, - data: column.LimitSize.ToInt().ToString(), + data: column.LimitSize.ToString(), sysLogsStatus: 400, sysLogsDescription: Debugs.GetSysLogsDescription()); case Error.Types.OverTotalLimitSize: return new ErrorData( context: context, type: Error.Types.OverTotalLimitSize, - data: column.TotalLimitSize.ToInt().ToString(), + data: column.TotalLimitSize.ToString(), sysLogsStatus: 400, sysLogsDescription: Debugs.GetSysLogsDescription()); case Error.Types.OverLocalFolderLimitSize: return new ErrorData( context: context, type: Error.Types.OverLocalFolderLimitSize, - data: column.LocalFolderLimitSize.ToInt().ToString(), + data: column.LocalFolderLimitSize.ToString(), sysLogsStatus: 400, sysLogsDescription: Debugs.GetSysLogsDescription()); case Error.Types.OverLocalFolderTotalLimitSize: return new ErrorData( context: context, type: Error.Types.OverLocalFolderTotalLimitSize, - data: column.LocalFolderTotalLimitSize.ToInt().ToString(), + data: column.LocalFolderTotalLimitSize.ToString(), sysLogsStatus: 400, sysLogsDescription: Debugs.GetSysLogsDescription()); case Error.Types.OverTenantStorageSize: return new ErrorData( context: context, type: Error.Types.OverTenantStorageSize, - data: context.ContractSettings.StorageSize.ToInt().ToString(), + data: context.ContractSettings.StorageSize.ToString(), sysLogsStatus: 400, sysLogsDescription: Debugs.GetSysLogsDescription()); } diff --git a/Implem.Pleasanter/Models/Sessions/SessionExclusive.cs b/Implem.Pleasanter/Models/Sessions/SessionExclusive.cs new file mode 100644 index 000000000..0ddb0c336 --- /dev/null +++ b/Implem.Pleasanter/Models/Sessions/SessionExclusive.cs @@ -0,0 +1,101 @@ +using Implem.DefinitionAccessor; +using Implem.Libraries.Utilities; +using Implem.Pleasanter.Libraries.Requests; +using System; +using System.Runtime.CompilerServices; + +namespace Implem.Pleasanter.Models.Sessions +{ + public class SessionExclusive : IDisposable + { + public class Lock + { + public long SiteId { get; set; } + public int UserId { get; set; } + public string Comment { get; set; } + public DateTime UpdatedTime { get; set; } + + public Lock(long siteId, int userId, string comment) + { + SiteId = siteId; + UserId = userId; + Comment = comment; + UpdatedTime = DateTime.MinValue; + } + + public Lock() { } + } + protected readonly Lock LockObj; + public readonly string Key; + private readonly Context Context; + private const string SessionExclusiveGuid = "SessionExclusive"; + + protected SessionExclusive(Context context, bool enabled, string key, string comment = "") + { + Key = key; + Context = context; + LockObj = enabled + ? new Lock(siteId: context.SiteId, userId: context.UserId, comment: comment) + : null; + } + + public bool TryLock() + { + if (LockObj == null) return true; + Lock value = null; + if (SessionUtilities.Get( + context: Context, + sessionGuid: SessionExclusiveGuid) + .TryGetValue(Key, out var rawValue)) + { + value = rawValue.Deserialize(); + } + if (value == null || value.UpdatedTime.AddSeconds(120) < DateTime.UtcNow) + { + Refresh(); + return true; + } + return false; + } + + public void Refresh() + { + if (LockObj == null) return; + if (LockObj.UpdatedTime != DateTime.MinValue && LockObj.UpdatedTime.AddSeconds(30) > DateTime.UtcNow) return; + LockObj.UpdatedTime = DateTime.UtcNow; + SessionUtilities.Set( + context: Context, + key: Key, + value: LockObj.ToJson(), + sessionGuid: SessionExclusiveGuid); + } + + private void Clear() + { + if (LockObj == null || LockObj.UpdatedTime == DateTime.MinValue) return; + LockObj.UpdatedTime = DateTime.MinValue; + SessionUtilities.Remove( + context: Context, + key: Key, + page: false, + sessionGuid: SessionExclusiveGuid); + } + + public void Dispose() + { + Clear(); + } + } + + public class TableExclusive : SessionExclusive + { + public TableExclusive(Context context, [CallerMemberName] string callerMethodName = "") + : base( + context: context, + enabled: Parameters.General.BlockSiteTaskWhileRunning == true, + key: $"TableExclusive_SiteId={context.SiteId}", + comment: callerMethodName) + { + } + } +} diff --git a/Implem.Pleasanter/Models/Shared/_BaseModel.cs b/Implem.Pleasanter/Models/Shared/_BaseModel.cs index c7d6c3b24..596391e80 100644 --- a/Implem.Pleasanter/Models/Shared/_BaseModel.cs +++ b/Implem.Pleasanter/Models/Shared/_BaseModel.cs @@ -771,7 +771,7 @@ public void SetByWhenloadingSiteSettingsServerScript( itemModel: null, view: null, where: script => script.WhenloadingSiteSettings == true, - condition: "WhenloadingSiteSettings"); + condition: ServerScriptConditions.WhenloadingSiteSettings); SetServerScriptModelColumns(context: context, ss: ss, scriptValues: scriptValues); @@ -809,7 +809,7 @@ public virtual ServerScriptModelRow SetByBeforeOpeningPageServerScript( itemModel: null, view: view, where: script => script.BeforeOpeningPage == true, - condition: "BeforeOpeningPage"); + condition: ServerScriptConditions.BeforeOpeningPage); if (scriptValues != null) { SetServerScriptModelColumns(context: context, @@ -916,7 +916,7 @@ public override ServerScriptModelRow SetByWhenloadingRecordServerScript( itemModel: this, view: null, where: script => script.WhenloadingRecord == true, - condition: "WhenloadingRecord"); + condition: ServerScriptConditions.WhenloadingRecord); if (scriptValues != null) { ServerScriptModelRow = scriptValues; @@ -933,7 +933,7 @@ public void SetByBeforeFormulaServerScript(Context context, SiteSettings ss) itemModel: this, view: null, where: script => script.BeforeFormula == true, - condition: "BeforeFormula"); + condition: ServerScriptConditions.BeforeFormula); } public override void SetByAfterFormulaServerScript(Context context, SiteSettings ss) @@ -945,7 +945,7 @@ public override void SetByAfterFormulaServerScript(Context context, SiteSettings itemModel: this, view: null, where: script => script.AfterFormula == true, - condition: "AfterFormula"); + condition: ServerScriptConditions.AfterFormula); } public void SetByAfterUpdateServerScript( @@ -959,7 +959,7 @@ public void SetByAfterUpdateServerScript( itemModel: this, view: null, where: script => script.AfterUpdate == true, - condition: "AfterUpdate"); + condition: ServerScriptConditions.AfterUpdate); } public void SetByBeforeUpdateServerScript( @@ -973,7 +973,7 @@ public void SetByBeforeUpdateServerScript( itemModel: this, view: null, where: script => script.BeforeUpdate == true, - condition: "BeforeUpdate"); + condition: ServerScriptConditions.BeforeUpdate); } public void SetByAfterCreateServerScript( @@ -987,7 +987,7 @@ public void SetByAfterCreateServerScript( itemModel: this, view: null, where: script => script.AfterCreate == true, - condition: "AfterCreate"); + condition: ServerScriptConditions.AfterCreate); } public void SetByBeforeCreateServerScript( @@ -1001,7 +1001,7 @@ public void SetByBeforeCreateServerScript( itemModel: this, view: null, where: script => script.BeforeCreate == true, - condition: "BeforeCreate"); + condition: ServerScriptConditions.BeforeCreate); } public void SetByAfterDeleteServerScript( @@ -1015,7 +1015,7 @@ public void SetByAfterDeleteServerScript( itemModel: this, view: null, where: script => script.AfterDelete == true, - condition: "AfterDelete"); + condition: ServerScriptConditions.AfterDelete); } public void SetByBeforeDeleteServerScript( @@ -1029,7 +1029,7 @@ public void SetByBeforeDeleteServerScript( itemModel: this, view: null, where: script => script.BeforeDelete == true, - condition: "BeforeDelete"); + condition: ServerScriptConditions.BeforeDelete); } public override ServerScriptModelRow SetByBeforeOpeningRowServerScript( @@ -1044,7 +1044,7 @@ public override ServerScriptModelRow SetByBeforeOpeningRowServerScript( itemModel: this, view: view, where: script => script.BeforeOpeningRow == true, - condition: "BeforeOpeningRow"); + condition: ServerScriptConditions.BeforeOpeningRow); if (scriptValues != null) { SetServerScriptModelColumns(context: context, @@ -1068,7 +1068,7 @@ public override ServerScriptModelRow SetByBeforeOpeningPageServerScript( itemModel: this, view: view, where: script => script.BeforeOpeningPage == true, - condition: "BeforeOpeningPage"); + condition: ServerScriptConditions.BeforeOpeningPage); if (scriptValues != null) { SetServerScriptModelColumns( diff --git a/Implem.Pleasanter/Models/Sites/ApiSiteSettings/ServerScriptApiSettingModel.cs b/Implem.Pleasanter/Models/Sites/ApiSiteSettings/ServerScriptApiSettingModel.cs index 8599e2b2b..23150777c 100644 --- a/Implem.Pleasanter/Models/Sites/ApiSiteSettings/ServerScriptApiSettingModel.cs +++ b/Implem.Pleasanter/Models/Sites/ApiSiteSettings/ServerScriptApiSettingModel.cs @@ -11,6 +11,9 @@ public class ServerScriptApiSettingModel : ISiteSettingBaseProperties public string Title { get; set; } public string Name { get; set; } public string Body { get; set; } + public bool? Functionalize { get; set; } + public bool? TryCatch { get; set; } + public bool? Disabled { get; set; } public bool? ServerScriptWhenloadingSiteSettings { get; set; } public bool? ServerScriptWhenViewProcessing { get; set; } public bool? ServerScriptWhenloadingRecord { get; set; } diff --git a/Implem.Pleasanter/Models/Sites/SiteModel.cs b/Implem.Pleasanter/Models/Sites/SiteModel.cs index d1ba7f5c2..e0e6e98e9 100644 --- a/Implem.Pleasanter/Models/Sites/SiteModel.cs +++ b/Implem.Pleasanter/Models/Sites/SiteModel.cs @@ -2402,8 +2402,11 @@ public void UpsertServerScriptByApi( beforeOpeningPage: ssApiSetting.ServerScriptBeforeOpeningPage, beforeOpeningRow: ssApiSetting.ServerScriptBeforeOpeningRow, shared: ssApiSetting.ServerScriptShared, - background: default, body: ssApiSetting.Body, + functionalize: ssApiSetting.Functionalize, + tryCatch: ssApiSetting.TryCatch, + disabled: ssApiSetting.Disabled, + background: default, timeOut: default); } else @@ -2427,6 +2430,9 @@ public void UpsertServerScriptByApi( beforeOpeningRow: ssApiSetting.ServerScriptBeforeOpeningRow, shared: ssApiSetting.ServerScriptShared, body: ssApiSetting.Body, + functionalize: ssApiSetting.Functionalize, + tryCatch: ssApiSetting.TryCatch, + disabled: ssApiSetting.Disabled, background: default, timeOut: default)); } @@ -7773,6 +7779,9 @@ private void AddServerScript(Context context, ResponseCollection res, string con shared: context.Forms.Bool("ServerScriptShared"), background: false, body: context.Forms.Data("ServerScriptBody"), + functionalize: context.Forms.Bool("ServerScriptFunctionalize"), + tryCatch: context.Forms.Bool("ServerScriptTryCatch"), + disabled: context.Forms.Bool("ServerScriptDisabled"), timeOut: GetServerScriptTimeOutValue(context: context)); var invalid = ServerScriptValidators.OnCreating( context: context, @@ -7804,6 +7813,9 @@ private void AddServerScript(Context context, ResponseCollection res, string con shared: script.Shared ?? default, background: script.Background ?? default, body: script.Body, + functionalize: script.Functionalize, + tryCatch: script.TryCatch, + disabled: script.Disabled, timeOut: script.TimeOut)); res .ReplaceAll("#EditServerScript", new HtmlBuilder() @@ -7838,6 +7850,9 @@ private void UpdateServerScript(Context context, ResponseCollection res, string shared: context.Forms.Bool("ServerScriptShared"), background: false, body: context.Forms.Data("ServerScriptBody"), + functionalize: context.Forms.Bool("ServerScriptFunctionalize"), + tryCatch: context.Forms.Bool("ServerScriptTryCatch"), + disabled: context.Forms.Bool("ServerScriptDisabled"), timeOut: GetServerScriptTimeOutValue(context: context)); var invalid = ServerScriptValidators.OnUpdating( context: context, @@ -7870,6 +7885,9 @@ private void UpdateServerScript(Context context, ResponseCollection res, string shared: script.Shared ?? default, background: script.Background ?? default, body: script.Body, + functionalize: script.Functionalize, + tryCatch: script.TryCatch, + disabled: script.Disabled, timeOut: script.TimeOut); res .Html("#EditServerScript", new HtmlBuilder() diff --git a/Implem.Pleasanter/Models/Sites/SiteUtilities.cs b/Implem.Pleasanter/Models/Sites/SiteUtilities.cs index 889bc3ffd..7db3505f0 100644 --- a/Implem.Pleasanter/Models/Sites/SiteUtilities.cs +++ b/Implem.Pleasanter/Models/Sites/SiteUtilities.cs @@ -4346,6 +4346,8 @@ private static HtmlBuilder SiteMenuInnerElements( .SiteMenuConditions( context: context, siteId: siteId, + hasImage: hasImage, + referenceType: referenceType, siteConditions: siteConditions); } @@ -4465,6 +4467,8 @@ private static HtmlBuilder SiteMenuStyle( private static HtmlBuilder SiteMenuConditions( this HtmlBuilder hb, Context context, + bool hasImage, + string referenceType, long siteId, IEnumerable siteConditions) { @@ -4475,15 +4479,45 @@ private static HtmlBuilder SiteMenuConditions( .FirstOrDefault(o => o.SiteId == siteId); hb.Div( css: "conditions", - _using: condition.ItemCount > 0, action: () => hb .ElapsedTime( context: context, value: condition.UpdatedTime.ToLocal(context: context)) + .Span( + attributes: new HtmlAttributes() + .Class("reference material-symbols-outlined") + .Title(ReferenceTypeDisplayName( + context: context, + referenceType: referenceType)), + _using: hasImage, + action: () => + { + switch (referenceType) + { + case "Sites": + hb.Text("folder"); + break; + case "Issues": + hb.Text("view_timeline"); + break; + case "Results": + hb.Text("table"); + break; + case "Wikis": + hb.Text("text_snippet"); + break; + case "Dashboards": + hb.Text("dashboard"); + break; + default: + break; + } + }) .Span( attributes: new HtmlAttributes() .Class("count") .Title(Displays.Quantity(context: context)), + _using: condition.ItemCount > 0, action: () => hb .Text(condition.ItemCount.ToString())) .Span( @@ -4492,7 +4526,7 @@ private static HtmlBuilder SiteMenuConditions( .Title(Displays.Overdue(context: context)), _using: condition.OverdueCount > 0, action: () => hb - .Text($"({condition.OverdueCount})"))); + .Text(condition.OverdueCount.ToString()))); } return hb; } @@ -5626,7 +5660,13 @@ private static HtmlBuilder GridSettingsEditor( controlId: "OpenEditInNewTab", fieldCss: "field-auto-thin", labelText: Displays.OpenEditInNewTab(context: context), - _checked: ss.OpenEditInNewTab == true)); + _checked: ss.OpenEditInNewTab == true) + .FieldCheckBox( + controlId: "EnableExpandLinkPath", + fieldCss: "field-auto-thin", + labelText: Displays.ExpandLinkPath(context: context), + _checked: ss.EnableExpandLinkPath == true, + _using: Parameters.General.EnableExpandLinkPath == true)); } /// @@ -15528,6 +15568,12 @@ private static HtmlBuilder EditServerScriptHeader( .Text(text: Displays.Title(context: context))) .Th(action: () => hb .Text(text: Displays.Name(context: context))) + .Th(action: () => hb + .Text(text: Displays.Disabled(context: context))) + .Th(action: () => hb + .Text(text: Displays.Functionalize(context: context))) + .Th(action: () => hb + .Text(text: Displays.TryCatch(context: context))) .Th(action: () => hb .Text(text: Displays.WhenloadingSiteSettings(context: context))) .Th(action: () => hb @@ -15582,6 +15628,18 @@ public static HtmlBuilder EditServerScriptBody( .Text(text: script.Title)) .Td(action: () => hb .Text(text: script.Name)) + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: script.Disabled == true)) + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: script.Functionalize == true)) + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: script.TryCatch == true)) .Td(action: () => hb .Span( css: "ui-icon ui-icon-circle-check", @@ -15687,6 +15745,12 @@ public static HtmlBuilder ServerScriptDialog( dataLang: "javascript", labelText: Displays.Script(context: context), text: script.Body) + .FieldCheckBox( + controlId: "ServerScriptDisabled", + fieldCss: "field-wide", + controlCss: " always-send", + labelText: Displays.Disabled(context: context), + _checked: script.Disabled == true) .FieldSpinner( controlId: "ServerScriptTimeOut", fieldCss: "field-normal", @@ -15698,6 +15762,18 @@ public static HtmlBuilder ServerScriptDialog( step: 1, width: 75, _using: Parameters.Script.ServerScriptTimeOutChangeable) + .FieldCheckBox( + controlId: "ServerScriptFunctionalize", + fieldCss: "field-normal", + controlCss: " always-send", + labelText: Displays.Functionalize(context: context), + _checked: script.Functionalize == true) + .FieldCheckBox( + controlId: "ServerScriptTryCatch", + fieldCss: "field-normal", + controlCss: " always-send", + labelText: Displays.TryCatch(context: context), + _checked: script.TryCatch == true) .FieldSet( css: enclosedCss, legendText: Displays.Condition(context: context), @@ -15894,7 +15970,11 @@ public static string SynchronizeTitles(Context context, SiteModel siteModel) /// /// Fixed: /// - public static ErrorData SynchronizeSummaries(Context context, SiteModel siteModel, List selected) + public static ErrorData SynchronizeSummaries( + Context context, + SiteModel siteModel, + List selected, + Action watchdog = null) { siteModel.SetSiteSettingsPropertiesBySession(context: context); siteModel.SiteSettings = SiteSettingsUtilities.Get( @@ -15917,10 +15997,14 @@ public static ErrorData SynchronizeSummaries(Context context, SiteModel siteMode } else { - selected.ForEach(id => Summaries.Synchronize( - context: context, - ss: ss, - id: id)); + selected.ForEach(id => + { + watchdog?.Invoke(); + Summaries.Synchronize( + context: context, + ss: ss, + id: id); + }); return new ErrorData(type: Error.Types.None); } } diff --git a/Implem.Pleasanter/Models/SysLogs/SysLogModel.cs b/Implem.Pleasanter/Models/SysLogs/SysLogModel.cs index f74a9a81e..8904a6d2f 100644 --- a/Implem.Pleasanter/Models/SysLogs/SysLogModel.cs +++ b/Implem.Pleasanter/Models/SysLogs/SysLogModel.cs @@ -3271,7 +3271,7 @@ public SysLogModel( Exception e, string extendedErrorMessage = null, Logs logs = null, - SysLogTypes sysLogType = SysLogTypes.Execption) + SysLogTypes sysLogType = SysLogTypes.Exception) { Class = context.Controller; Method = context.Action; @@ -3307,7 +3307,7 @@ public SysLogModel( switch (sysLogType) { case SysLogTypes.SystemError: - case SysLogTypes.Execption: + case SysLogTypes.Exception: ErrMessage = message; break; default: @@ -3340,7 +3340,7 @@ public enum SysLogTypes : int Warning = 50, UserError = 60, SystemError = 80, - Execption = 90 + Exception = 90 } /// diff --git a/Implem.Pleasanter/Models/Tenants/TenantModel.cs b/Implem.Pleasanter/Models/Tenants/TenantModel.cs index bdee58092..f749f12b5 100644 --- a/Implem.Pleasanter/Models/Tenants/TenantModel.cs +++ b/Implem.Pleasanter/Models/Tenants/TenantModel.cs @@ -1772,6 +1772,8 @@ private void UpdateServerScript(Context context, ResponseCollection res, string disabled: script.Disabled ?? default, body: script.Body, timeOut: script.TimeOut, + functionalize: script.Functionalize, + tryCatch: script.TryCatch, backgoundSchedules: script.backgoundSchedules); res .Html("#EditServerScript", new HtmlBuilder() @@ -1795,6 +1797,8 @@ private static BackgroundServerScript GetBackgroundServerScriptFromForm(Context disabled: context.Forms.Bool("ServerScriptDisabled"), body: context.Forms.Data("ServerScriptBody"), timeOut: context.Forms.Int("ServerScriptTimeOut"), + functionalize: context.Forms.Bool("ServerScriptFunctionalize"), + tryCatch: context.Forms.Bool("ServerScriptTryCatch"), backgoundSchedules: context.Forms.Data("BackgroundSchedule").Deserialize>()); } diff --git a/Implem.Pleasanter/Models/Tenants/TenantUtilities.cs b/Implem.Pleasanter/Models/Tenants/TenantUtilities.cs index e63eb4475..fe9b42ccb 100644 --- a/Implem.Pleasanter/Models/Tenants/TenantUtilities.cs +++ b/Implem.Pleasanter/Models/Tenants/TenantUtilities.cs @@ -1882,7 +1882,7 @@ public static HtmlBuilder TenantImageSettingsEditor(this HtmlBuilder hb, Context method: "delete", confirm: "ConfirmDelete", _using: BinaryUtilities.ExistsTenantImage( - context: context, + context: context, ss: SiteSettingsUtilities.TenantsSiteSettings(context), referenceId: tenantModel.TenantId, sizeType: Libraries.Images.ImageData.SizeTypes.Logo))); @@ -1930,7 +1930,6 @@ public static HtmlBuilder ServerScriptDialog( Context context, TenantModel tenantModel, string controlId, BackgroundServerScript script) { var hb = new HtmlBuilder(); - var outputDestinationCss = " output-destination-script"; var enclosedCss = " enclosed"; return hb.Form( attributes: new HtmlAttributes() @@ -1982,6 +1981,12 @@ public static HtmlBuilder ServerScriptDialog( controlCss: " always-send", labelText: Displays.ServerScript(context: context), text: script.Body) + .FieldCheckBox( + controlId: "ServerScriptDisabled", + fieldCss: "field-wide", + controlCss: " always-send", + labelText: Displays.Disabled(context: context), + _checked: script.Disabled == true) .FieldSpinner( controlId: "ServerScriptTimeOut", fieldCss: "field-normal", @@ -1993,20 +1998,24 @@ public static HtmlBuilder ServerScriptDialog( step: 1, width: 75, _using: Parameters.Script.ServerScriptTimeOutChangeable) - .Div( - action: () => hb - .FieldCheckBox( - controlId: "ServerScriptDisabled", - fieldCss: outputDestinationCss, - controlCss: " always-send", - labelText: Displays.Disabled(context: context), - _checked: script.Disabled == true) - .FieldCheckBox( - controlId: "ServerScriptShared", - fieldCss: outputDestinationCss, - controlCss: " always-send", - labelText: Displays.Shared(context: context), - _checked: script.Shared == true)) + .FieldCheckBox( + controlId: "ServerScriptFunctionalize", + fieldCss: "field-normal", + controlCss: " always-send", + labelText: Displays.Functionalize(context: context), + _checked: script.Functionalize == true) + .FieldCheckBox( + controlId: "ServerScriptTryCatch", + fieldCss: "field-normal", + controlCss: " always-send", + labelText: Displays.TryCatch(context: context), + _checked: script.TryCatch == true) + .FieldCheckBox( + controlId: "ServerScriptShared", + fieldCss: "field-wide", + controlCss: " always-send", + labelText: Displays.Shared(context: context), + _checked: script.Shared == true) .FieldSet( css: enclosedCss, legendText: Displays.Schedule(context: context), @@ -2073,7 +2082,7 @@ private static HtmlBuilder FieldTenantUsers( controlId: controlId, fieldCss: "field-normal", controlCss: " always-send search", - labelText: labelText, + labelText: labelText, optionCollection: optionCollection, controlOption: () => hb.Div(css: "ui-icon ui-icon-person current-user"), selectedValue: userId == 0 ? "" : userId.ToString()); @@ -2124,6 +2133,10 @@ private static HtmlBuilder EditServerScriptHeader( .Text(text: Displays.Name(context: context))) .Th(action: () => hb .Text(text: Displays.Disabled(context: context))) + .Th(action: () => hb + .Text(text: Displays.Functionalize(context: context))) + .Th(action: () => hb + .Text(text: Displays.TryCatch(context: context))) .Th(action: () => hb .Text(text: Displays.Shared(context: context))))); } @@ -2156,6 +2169,14 @@ private static HtmlBuilder EditServerScriptBody( .Span( css: "ui-icon ui-icon-circle-check", _using: script.Disabled == true)) + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: script.Functionalize == true)) + .Td(action: () => hb + .Span( + css: "ui-icon ui-icon-circle-check", + _using: script.TryCatch == true)) .Td(action: () => hb .Span( css: "ui-icon ui-icon-circle-check", diff --git a/Implem.Pleasanter/Models/Wikis/WikiModel.cs b/Implem.Pleasanter/Models/Wikis/WikiModel.cs index da2c08d36..9757598f0 100644 --- a/Implem.Pleasanter/Models/Wikis/WikiModel.cs +++ b/Implem.Pleasanter/Models/Wikis/WikiModel.cs @@ -1588,7 +1588,7 @@ private string ExecFormulaExtended( context: context, method: nameof(SetByFormula), message: $"Formula error {value}", - sysLogType: SysLogModel.SysLogTypes.Execption); + sysLogType: SysLogModel.SysLogTypes.Exception); break; } if (outputFormulaLogs == true) diff --git a/Implem.Pleasanter/Models/Wikis/WikiUtilities.cs b/Implem.Pleasanter/Models/Wikis/WikiUtilities.cs index c2da94e1a..dd02f8c1e 100644 --- a/Implem.Pleasanter/Models/Wikis/WikiUtilities.cs +++ b/Implem.Pleasanter/Models/Wikis/WikiUtilities.cs @@ -869,6 +869,10 @@ public static HtmlBuilder Field( context: context, ss: ss, column: column); + var rawValue = wikiModel.ControlRawValue( + context: context, + ss: ss, + column: column); if (value != null) { value += wikiModel.NumUnit( @@ -888,6 +892,7 @@ public static HtmlBuilder Field( ?.ServerScriptModelRow ?.Columns.Get(column.ColumnName), value: value, + rawValue: rawValue, columnPermissionType: Permissions.ColumnPermissionType( context: context, ss: ss, @@ -1266,6 +1271,88 @@ public static string ControlValue( } } + public static object ControlRawValue( + this WikiModel wikiModel, + Context context, + SiteSettings ss, + Column column) + { + switch (column.Name) + { + case "WikiId": + return wikiModel.WikiId + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Ver": + return wikiModel.Ver + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Title": + return wikiModel.Title + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Body": + return wikiModel.Body + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Locked": + return wikiModel.Locked + .ToApiValue( + context: context, + ss: ss, + column: column); + default: + switch (Def.ExtendedColumnTypes.Get(column?.Name ?? string.Empty)) + { + case "Class": + return wikiModel.GetClass(columnName: column.Name) + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Num": + return wikiModel.GetNum(columnName: column.Name) + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Date": + return wikiModel.GetDate(columnName: column.Name) + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Description": + return wikiModel.GetDescription(columnName: column.Name) + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Check": + return wikiModel.GetCheck(columnName: column.Name) + .ToApiValue( + context: context, + ss: ss, + column: column); + case "Attachments": + return wikiModel.GetAttachments(columnName: column.Name) + .ToApiValue( + context: context, + ss: ss, + column: column); + default: return null; + } + } + } + private static HtmlBuilder MainCommandExtensions( this HtmlBuilder hb, Context context, @@ -1765,6 +1852,10 @@ public static ContentResultInheritance CreateByApi(Context context, SiteSettings { context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); } + if(HasInvalidValueAsApiDataAtCreate(wikiApiModel)) + { + context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); + } var wikiModel = new WikiModel( context: context, ss: ss, @@ -1823,6 +1914,10 @@ public static bool CreateByServerScript(Context context, SiteSettings ss, object { context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); } + if(HasInvalidValueAsApiDataAtCreate(wikiApiModel)) + { + context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); + } var wikiModel = new WikiModel( context: context, ss: ss, @@ -1865,6 +1960,25 @@ public static bool CreateByServerScript(Context context, SiteSettings ss, object } } + private static bool HasInvalidValueAsApiDataAtCreate(WikiApiModel model) + { + if (model is null) + return false; + foreach (var o in model.AttachmentsHash) + { + foreach (var attachment in o.Value) + { + if (attachment.Deleted ?? false) + continue; + if (attachment.Name.IsNullOrEmpty()) + return true; + if (attachment.Base64 is null && attachment.Base64Binary is null) + return true; + } + } + return false; + } + public static string Update(Context context, SiteSettings ss, long wikiId, string previousTitle) { var wikiModel = new WikiModel( @@ -2060,6 +2174,10 @@ public static ContentResultInheritance UpdateByApi( { context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); } + if(HasInvalidValueAsApiDataAtUpdate(wikiApiModel)) + { + context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); + } var wikiModel = new WikiModel( context: context, ss: ss, @@ -2128,6 +2246,10 @@ public static bool UpdateByServerScript( { context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); } + if(HasInvalidValueAsApiDataAtUpdate(wikiApiModel)) + { + context.InvalidJsonData = !context.RequestDataString.IsNullOrEmpty(); + } var wikiModel = new WikiModel( context: context, ss: ss, @@ -2180,6 +2302,25 @@ public static bool UpdateByServerScript( } } + private static bool HasInvalidValueAsApiDataAtUpdate(WikiApiModel model) + { + if (model is null) + return false; + foreach (var o in model.AttachmentsHash) + { + foreach (var attachment in o.Value) + { + if (attachment.Deleted ?? false) + continue; + if (attachment.Name.IsNullOrEmpty()) + return true; + if (attachment.Base64 is null && attachment.Base64Binary is null) + return true; + } + } + return false; + } + public static string Delete(Context context, SiteSettings ss, long wikiId) { var wikiModel = new WikiModel(context, ss, wikiId); diff --git a/Implem.Pleasanter/Startup.cs b/Implem.Pleasanter/Startup.cs index 6c6143713..77507c7f7 100644 --- a/Implem.Pleasanter/Startup.cs +++ b/Implem.Pleasanter/Startup.cs @@ -434,7 +434,7 @@ public async Task Invoke(HttpContext httpContext, Func next) { var context = new Context(); var log = new SysLogModel(context: context); - log.SysLogType = SysLogModel.SysLogTypes.Execption; + log.SysLogType = SysLogModel.SysLogTypes.Exception; log.ErrMessage = error.Message; log.ErrStackTrace = error.StackTrace; log.Finish(context: context); diff --git a/Implem.Pleasanter/wwwroot/content/responsive.css b/Implem.Pleasanter/wwwroot/content/responsive.css index 005566f67..a7faa5f44 100644 --- a/Implem.Pleasanter/wwwroot/content/responsive.css +++ b/Implem.Pleasanter/wwwroot/content/responsive.css @@ -562,6 +562,12 @@ border-radius: 3vw; } + #SiteMenu .nav-site .conditions .overdue::before, + #SiteMenu .nav-site .conditions .overdue::after { + display: none; + content: initial; + } + #SiteMenu .nav-site[data-type="Wikis"] { position: relative; width: 20vw; diff --git a/Implem.Pleasanter/wwwroot/content/responsive.min.css b/Implem.Pleasanter/wwwroot/content/responsive.min.css index 74a770e96..88e770216 100644 --- a/Implem.Pleasanter/wwwroot/content/responsive.min.css +++ b/Implem.Pleasanter/wwwroot/content/responsive.min.css @@ -1 +1 @@ -@media screen and (max-width:1024px) and (min-width:0){#LoginFieldSet{width:100%;padding:10px;font-size:4vw}#LoginFieldSet input,#LoginFieldSet select{padding:10px;font-size:5vw}#LoginFieldSet input[type="checkbox"]{margin:20px 0 0 10px;transform:scale(2)}#LoginFieldSet button{font-size:4vw}#LoginFieldSet .container-normal{margin-left:0}#LoginFieldSet .field-wide,#LoginFieldSet .field-normal{float:left;width:100%;margin:10px 0}#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{padding:10px;font-size:5vw}#DemoFields button{float:right;margin-top:10px;font-size:4vw}#DemoFields .container-normal{margin-left:0}#DemoFields .field-normal{float:left;width:100%;margin:10px 0}#StartGuide{display:none}.container-normal>#ApiKey{word-break:break-all}div[role="dialog"]{z-index:999;width:98% !important}#EnterPriseBanner,#SupportBanner,#CasesBanner{display:none}#EditorTabsContainer>fieldset{display:contents}#EditorTabsContainer>fieldset>fieldset{display:contents}#TenantImage{width:100%}#Search{width:auto;height:auto}#Breadcrumb{font-size:2.6vw}#ViewSelectorField{position:relative;margin-bottom:5px;font-size:2.8vw}#HeaderTitleContainer{margin-bottom:3%}#ViewFilters{padding-bottom:2%;font-size:2.6vw}#Aggregations{font-size:2.6vw}#ViewFilters_Reset{float:none}#ViewFilters.reduced,#Aggregations.reduced{margin-bottom:2%;padding:2%;border-bottom:1px solid #aaa}#Aggregations .label{height:auto}#ViewFilters>.field-auto-thin{display:flex;align-items:center;justify-content:start;width:49%;height:6vw;margin:2% 0 0 0;padding:0;line-height:1}#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:100% !important;height:6vw}.field-auto-thin input[type="checkbox"],.field-auto-thin input[type="radio"]{width:2.6vw;height: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-top:0;padding-bottom:15%}#MainForm{display:flex;flex-direction:column}#RecordInfo{margin-bottom:2%}#RecordSwitchers{width:100%;font-size:2.6vw}.ui-button,#RecordSwitchers .current{height:auto;margin-right:2%;padding:2% !important;line-height:1}#EditorComments{width:100%;font-size:2.6vw;order:3}#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{float:none;clear:both;width:100%;min-height:5vw;padding:0 0 3% 0}.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{clear:both;width:100%;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{font-size:2.6vw}#Guide{font-size:2.6vw}.alert-success,.alert-warning,.alert-error{height:auto;font-size:2.6vw}#MainCommandsContainer{z-index:200;height:auto;padding:2vw 0;font-size:2.6vw}#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-radius:4px}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:1%;padding-bottom:0;border-radius:4px}.message{bottom:140px}}#GuideExpand{width:100px}@media screen and (max-width:1024px) and (min-width:0){body{min-width:320px !important}#Header{position:relative;height:auto}#CorpLogo{float:none;width:30%}#MainContainer{min-height:100vh}#Header a#navtgl{position:absolute;top:1.4vw;right:4vw;z-index:101;display:block;width:8vw;height:8vw;padding:1.6vw 1.4vw;background:#fece2f;border:.4vw solid #d19405;border-radius:1vw}#Header a#navtgl::before,#Header a#navtgl span,#Header a#navtgl::after{position:absolute;top:50%;left:50%;width:20px;height:1.5px;margin:0 0 0 -10px;content:" ";background:#333;transition:transform 150ms ease-out,margin 150ms ease-out,width 150ms ease-out}#Header a#navtgl::before{transform:translateY(7px)}#Header a#navtgl span{transform:translateY(0)}#Header a#navtgl::after{transform:translateY(-7px)}* #Navigations{box-sizing:border-box}#Navigations{position:fixed;top:0;right:-110% !important;z-index:1000;float:none !important;width:70%;height:100vh !important;margin:0 !important;padding-top:112px !important;overflow:auto;font-size:3.2vw;line-height:7vw;border:none;transition:right ease-out .3s}#Navigations:not(.open){pointer-events:none}#Navigations.open{right:0 !important}#NavigationMenu>li.sub-menu>div.hover{background:none}#NavigationMenu{float:none;margin-right:0;margin-bottom:3%}#SearchField{float:none;margin:0;color:#000}#NavigationMenu>li{position:relative;display:block;float:none;width:100%;height:auto}#NavigationMenu>li>div{height:auto;font-weight:bold;line-height:7vw;text-align:left}#NavigationMenu>li>div:hover{background:none}#NavigationMenu>li>div>a{display:block;height:auto;font-weight:bold;text-decoration:none}#NavigationMenu .menu{position:relative;top:0;right:0;z-index:3;width:100%;border-top:none !important;border-radius:0}.pc-dn{display:block !important}#NavigationMenu .menu>li>a.ui-state-active{font-weight:normal;text-decoration:none}.ui-menu .ui-menu-item{border-top:1px solid #d19405}#NewMenuContainer{background:#fff;border:1px solid #d19405}}@media screen and (max-width:1024px) and (min-width:0){#SiteMenu .nav-site{float:none;width:20vw;height:20vw;margin:6%;text-align:center;border-radius:.5vw}#SiteMenu .sortable{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:flex-start}#SiteMenu .nav-site.sites{width:20vw !important;height:20vw !important;background:#fff;border-radius:5px}#SiteMenu .nav-site .heading{top:-3vw;width:8vw;height:3vw}#SiteMenu .nav-site.sites.to-parent{height:auto !important;margin-top:3%;margin-bottom:0;box-shadow:none}#SiteMenu .nav-site.sites.to-parent span.title{position:relative;top:0;width:100%;margin-left:0;text-align:left}#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;z-index:1;display:block;width:90%;max-width:inherit;margin:0 auto;border-radius:unset}#SiteMenu .nav-site span.title::before{display:block;height:0;content:""}#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{min-width:6vw;height:6vw;padding:0;font-size:2.6vw;font-weight:bold;line-height:6vw;border-radius:3vw}#SiteMenu .nav-site[data-type="Wikis"]{position:relative;width:20vw;border:2px solid #ccc;border-radius:2px}#SiteMenu .nav-site[data-type="Wikis"] a::before,#SiteMenu .nav-site[data-type="Wikis"] a::after{position:absolute;left:10%;display:block;width:80%;height:20%;content:"";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;text-align:left;background:none;border:none}#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;font-size:15px;text-decoration:none;vertical-align:middle}#SiteMenu .nav-site.to-parent a::before,#SiteMenu .nav-site.to-parent a::after{position:absolute;top:0;bottom:0;left:0;margin:auto;vertical-align:middle;content:""}#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{position:absolute;top:22vw;display:block;width:140%;margin-left:0;margin-left:-20%;overflow:hidden;font-size:2.6vw;text-align:center;text-overflow:ellipsis;white-space:nowrap}#SiteMenu .nav-site .stacking1{position:absolute;top:1px;left:1px;width:20vw;height:20vw;border-right:solid 1px #c0c0c0;border-bottom:solid 1px #c0c0c0;border-radius:5px}#SiteMenu .nav-site .stacking2{position:absolute;top:4px;left:4px;width:20vw;height:20vw;border-right:solid 1px #c0c0c0;border-bottom:solid 1px #c0c0c0;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:1024px) and (min-width:0){#FieldSetStandard{display:flex;flex-direction:column}.legend{order:2}#StandardTemplatesViewer{order:3}.template-selectable{float:none;order:1}.template-viewer-container{float:none;margin:0}.template-viewer{margin:0}.template-selectable{width:100%}.template-tab-container{min-height:10px}.field-vertical{float:none;width:100%;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:1024px) and (min-width:0){#FieldSetHistories{width:100%;overflow:auto}#ViewModeContainer{width:100%;padding-top:1%;overflow:auto}#CrosstabBody{width:100%;overflow:auto}#GanttBody{width:100%;padding-top:5%;overflow:auto}.grid{width:98%;font-size:2.8vw}.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;margin-bottom:2% !important;padding:0}#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;align-items:center;justify-content:space-between}#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{margin-top:1%;font-size:2.6vw}.svg-crosstab{display:block}#ViewModeContainer .both{display:flex;flex-wrap:wrap;align-items:center}#ViewModeContainer .both .field-auto-thin{display:flex;align-items:center;width:48%;height:auto;margin:0;padding:0;padding-top:2%;font-size:2.6vw}#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{display:block;width:48%}#ViewModeContainer .field-auto-thin p{margin-right:2%;text-align:left;white-space:nowrap}#GanttAxis{position:relative;bottom:0;left:0;width:1500px}#Gantt{width:1500px}#BurnDown{width:1500px}#TimeSeriesBody{width:1500px;margin-left:-5%;padding-top:5%}#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 (max-width:1024px) and (min-width:0){#Header{padding:0 calc(5vw)}#Header a#navtgl{right:5vw}#Application,#Footer{padding-right:5vw;padding-left:5vw}#SiteMenu .nav-site{margin:5%}:not(td)>div.field-control .container-normal{margin-left:0}*{line-height:1.4}.field-normal .control-textbox,.field-normal .control-dropdown,.field-normal .control-text,.field-control .control-textbox,.field-control .control-dropdown,.field-control .control-text,.container-normal .control-textbox,.container-normal .control-dropdown,.container-normal .control-text{display:flex;align-items:center;height:6vw;min-height:unset;padding-top:0;padding-bottom:0;font-size:2.6vw;line-height:6vw}body{font-size:16px}}@media screen and (max-width:1024px) and (min-width:0){#HeaderTitle{font-size:16px}}@media screen and (max-width:1024px) and (min-width:768px){#HeaderTitle{font-size:35px}}@media screen and (max-width:1024px) and (min-width:0){.command-center{padding:0}.ui-dialog .ui-dialog-titlebar-close{top:0;bottom:0;width:5vw;height:5vw;margin:auto 0}}@media screen and (max-width:1024px) and (min-width:0){#ViewSelector{font-size:2.6vw}}@media screen and (max-width:1024px) and (min-width:0){#Logo a{display:inline-flex;align-items:center}#Logo #ProductLogo{padding-left:8px;font-size:18px}#CorpLogo{float:none;width:unset;height:calc(8vw + 10px);margin-top:0}}@media screen and (max-width:1024px) and (min-width:768px){#Logo #ProductLogo{padding-left:16px;font-size:32px}}@media screen and (max-width:1024px) and (min-width:0){#Editor .field-control .container-normal{width:calc(100% - 18px)}#Editor .field-control .ui-icon.ui-icon-clock.current-time,#Editor .field-control .ui-icon.ui-icon-person.current-user{top:calc(3vw - 6px)}}@media screen and (max-width:1024px) and (min-width:768px){#Editor .field-control .container-normal{width:calc(100% - 36px)}#Editor .field-control .ui-icon.ui-icon-clock.current-time,#Editor .field-control .ui-icon.ui-icon-person.current-user{top:calc(3vw - 3.5px);right:-30px}}@media screen and (max-width:1024px) and (min-width:0){#FieldSetAddressBook #OutgoingMailDestinationForm .container-left{width:38vw}#FieldSetAddressBook #OutgoingMailDestinationForm .container-right .command-left{float:unset;padding:0}#FieldSetAddressBook #OutgoingMailDestinationForm .container-right .command-left button{margin:1vw 1vw 1vw 0}#FieldSetAddressBook #OutgoingMailDestinationForm .container-right .container-selectable .wrapper{height:40vw}#FieldSetAddressBook #OutgoingMailDestinationForm .container-right>*{margin-left:40vw}}@media screen and (max-width:1024px) and (min-width:768px){#FieldSetAddressBook #OutgoingMailDestinationForm .container-left{width:33vw}}@media screen and (max-width:1024px) and (min-width:0){#Issues_WorkValue{width:100px}}@media screen and (max-width:1024px) and (min-width:0){#Users_LoginId,#Users_Password{height:40px}#LoginMessage span{font-size:3.5vw}#PortalLink{top:3vw;font-size:3.5vw}#LoginFieldSet{margin:65px auto 20px auto}#LoginFieldSet input[type="checkbox"]{margin:auto 0;margin-left:1.2vw}#LoginFieldSet button{margin-top:0}#LoginFieldSet .field-wide,#LoginFieldSet .field-normal{margin:0 0}#LoginFieldSet .field-normal .control-checkbox+label{margin:auto 0;margin-left:4vw;padding:0}#Logins .field-label{width:100%}}@media screen and (max-width:1024px) and (min-width:0){#Editor .field-markdown>.field-label>label{font-weight:bold}#Editor .field-control .unit{padding-top:calc((18px - 1.4em)/2);font-size:2.6vw}#Editor .ui-spinner .control-spinner{height:100%}}@media screen and (max-width:1024px) and (min-width:0){#GridCheckAll{margin-top:0}label[for="GridCheckAll"]{margin:0}#Footer{height:auto;font-size:2.8vw}#MainCommandsContainer{bottom:calc(2.8vw*1.4 + 10px)}body>thead>tr{font-size:.75em}}@media screen and (max-width:1024px) and (min-width:0){#Editor #EditorTabsContainer fieldset .wrapper{max-height:250px;overflow:auto}#Editor #EditorTabsContainer fieldset .container-selectable .command-left{display:flex;align-items:center}#Editor #EditorTabsContainer fieldset:not(#FieldSetGeneral) legend.legend{min-height:10px}#SiteImageSettingsEditor .field-auto-thin,#GridSettingsEditor .field-auto-thin,#FiltersSettingsEditor .field-auto-thin,#EditorSettingsEditor .field-auto-thin,#LinksSettingsEditor .field-auto-thin,#HistoriesSettingsEditor .field-auto-thin,#FormulasSettingsEditor .field-auto-thin,#ViewsSettingsEditor .field-auto-thin,#ImportsSettingsEditor .field-auto-thin,#ExportsSettingsEditor .field-auto-thin,#CalendarSettingsEditor .field-auto-thin,#CrosstabSettingsEditor .field-auto-thin,#GanttSettingsEditor .field-auto-thin,#BurnDownSettingsEditor .field-auto-thin,#TimeSeriesSettingsEditor .field-auto-thin,#KambanSettingsEditor .field-auto-thin,#ImageLibSettingsEditor .field-auto-thin,#SearchSettingsEditor .field-auto-thin,#StylesSettingsEditor .field-auto-thin,#ScriptsSettingsEditor .field-auto-thin,#PublishSettingsEditor .field-auto-thin,#FieldSetSiteAccessControl .field-auto-thin{display:flex;align-items:center;clear:both;height:auto;padding-right:0}#SiteImageSettingsEditor .field-auto-thin .container-normal,#GridSettingsEditor .field-auto-thin .container-normal,#FiltersSettingsEditor .field-auto-thin .container-normal,#EditorSettingsEditor .field-auto-thin .container-normal,#LinksSettingsEditor .field-auto-thin .container-normal,#HistoriesSettingsEditor .field-auto-thin .container-normal,#FormulasSettingsEditor .field-auto-thin .container-normal,#ViewsSettingsEditor .field-auto-thin .container-normal,#ImportsSettingsEditor .field-auto-thin .container-normal,#ExportsSettingsEditor .field-auto-thin .container-normal,#CalendarSettingsEditor .field-auto-thin .container-normal,#CrosstabSettingsEditor .field-auto-thin .container-normal,#GanttSettingsEditor .field-auto-thin .container-normal,#BurnDownSettingsEditor .field-auto-thin .container-normal,#TimeSeriesSettingsEditor .field-auto-thin .container-normal,#KambanSettingsEditor .field-auto-thin .container-normal,#ImageLibSettingsEditor .field-auto-thin .container-normal,#SearchSettingsEditor .field-auto-thin .container-normal,#StylesSettingsEditor .field-auto-thin .container-normal,#ScriptsSettingsEditor .field-auto-thin .container-normal,#PublishSettingsEditor .field-auto-thin .container-normal,#FieldSetSiteAccessControl .field-auto-thin .container-normal{width:100%}#SiteImageSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#GridSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#FiltersSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#EditorSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#LinksSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#HistoriesSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#FormulasSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#ViewsSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#ImportsSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#ExportsSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#CalendarSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#CrosstabSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#GanttSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#BurnDownSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#TimeSeriesSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#KambanSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#ImageLibSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#SearchSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#StylesSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#ScriptsSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#PublishSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#FieldSetSiteAccessControl .field-auto-thin .container-normal .control-checkbox~label{display:unset;float:unset;width:auto}#SiteImageSettingsEditor .field-auto-thin .field-label~.field-control,#GridSettingsEditor .field-auto-thin .field-label~.field-control,#FiltersSettingsEditor .field-auto-thin .field-label~.field-control,#EditorSettingsEditor .field-auto-thin .field-label~.field-control,#LinksSettingsEditor .field-auto-thin .field-label~.field-control,#HistoriesSettingsEditor .field-auto-thin .field-label~.field-control,#FormulasSettingsEditor .field-auto-thin .field-label~.field-control,#ViewsSettingsEditor .field-auto-thin .field-label~.field-control,#ImportsSettingsEditor .field-auto-thin .field-label~.field-control,#ExportsSettingsEditor .field-auto-thin .field-label~.field-control,#CalendarSettingsEditor .field-auto-thin .field-label~.field-control,#CrosstabSettingsEditor .field-auto-thin .field-label~.field-control,#GanttSettingsEditor .field-auto-thin .field-label~.field-control,#BurnDownSettingsEditor .field-auto-thin .field-label~.field-control,#TimeSeriesSettingsEditor .field-auto-thin .field-label~.field-control,#KambanSettingsEditor .field-auto-thin .field-label~.field-control,#ImageLibSettingsEditor .field-auto-thin .field-label~.field-control,#SearchSettingsEditor .field-auto-thin .field-label~.field-control,#StylesSettingsEditor .field-auto-thin .field-label~.field-control,#ScriptsSettingsEditor .field-auto-thin .field-label~.field-control,#PublishSettingsEditor .field-auto-thin .field-label~.field-control,#FieldSetSiteAccessControl .field-auto-thin .field-label~.field-control{margin-left:10px}#SiteImageSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#GridSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#FiltersSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#EditorSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#LinksSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#HistoriesSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#FormulasSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#ViewsSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#ImportsSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#ExportsSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#CalendarSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#CrosstabSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#GanttSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#BurnDownSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#TimeSeriesSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#KambanSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#ImageLibSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#SearchSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#StylesSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#ScriptsSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#PublishSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#FieldSetSiteAccessControl .field-auto-thin .field-label~.field-control .container-normal{width:100%}#FieldSetGeneral .field-control .container-normal .control-checkbox~label{width:auto}#GridSettingsEditor #GridEditorType{max-width:unset}#SiteImageSettingsEditor #SiteImage{width:100%;height:7vw}#SiteImageSettingsEditor #SetSiteImage{margin-right:0}#SearchSettingsEditor #SearchType{margin-bottom:10px}#SearchSettingsEditor #SearchSettingsEditorFulltext legend.legend.applied,#SearchSettingsEditor #SearchSettingsEditorOperations legend.legend.applied{margin-bottom:10px}#SearchSettingsEditor #SearchSettingsEditorFulltext{padding-top:10px}#Editor #EditorTabsContainer .fieldset+.field-auto-thin{margin-top:10px}}@media screen and (max-width:1024px) and (min-width:0){#Aggregations{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-start;row-gap:5px}#Aggregations span.label{display:flex;flex:1 0 auto;align-items:center;align-self:stretch;justify-content:flex-start;margin:0;text-align:center}#Aggregations span.data{display:flex;flex:1 0 auto;align-items:center;align-self:stretch;justify-content:flex-start;height:auto;margin:0}#Aggregations span.data.no-choice{flex-basis:auto;align-self:stretch}#Aggregations span.data.link span{font-weight:bold}#Aggregations #ReduceAggregations{width:100%}}@media screen and (max-width:1024px) and (min-width:768px){#Aggregations{row-gap:15px}}@media screen and (max-width:1024px) and (min-width:0){#ViewModeContainer .grid{vertical-align:middle}input[type="checkbox"],.field-auto-thin input[type="checkbox"]{width:3vw;height:3vw}.field-auto-thin input[type="checkbox"]+label{padding-top:2px}}@media screen and (max-width:1024px) and (min-width:0){#SearchField #Search{width:100%;font-size:3vw}#SearchField #Search::placeholder{font-size:3vw}}@media screen and (max-width:1024px) and (min-width:0){#ViewFilters #ViewFilters_Reset{margin-right:0;margin-left:auto}#ViewFilters .field-auto-thin{width:50%}#ViewFilters .field-auto-thin .field-control .container-normal{display:flex;align-items:center}#ViewFilters .field-auto-thin .field-control .container-normal input[type="checkbox"]{margin-top:1px;margin-right:4px}#ViewFilters .field-auto-thin .field-control .container-normal .ui-widget.ui-state-default.ui-multiselect,#ViewFilters .field-auto-thin .field-control .container-normal .control-textbox{height:6vw;font-size:2.6vw}#ViewFilters #ViewFilters_SearchField{width:100%}#ViewFilters #ViewFilters_SearchField p.field-label{width:17%}#ViewFilters #ViewFilters_SearchField .field-control{width:100%}#ViewFilters>.field-auto-thin:nth-child(odd){padding-right:2px}#ViewFilters>.field-auto-thin:nth-child(even){padding-left:2px}.ui-multiselect-menu .ui-helper-reset{position:relative}.ui-multiselect-menu .ui-helper-reset li{width:100%}.ui-multiselect-menu .ui-helper-reset li>label span{position:relative;top:-4px}.ui-multiselect-menu .ui-helper-reset li .ui-multiselect-all,.ui-multiselect-menu .ui-helper-reset li .ui-multiselect-none{display:flex;align-items:center;width:100%}.ui-multiselect-menu .ui-helper-reset li .ui-multiselect-all span:last-child,.ui-multiselect-menu .ui-helper-reset li .ui-multiselect-none span:last-child{padding-left:10px}.ui-multiselect-menu .ui-helper-reset li .ui-multiselect-close{position:absolute;top:8px;right:0}}@media screen and (max-width:1024px) and (min-width:0){#EditorTabsContainer .legend.applied{display:flex;align-items:center;font-weight:bold}#EditorTabsContainer #PermissionEditor .field-vertical:first-child>.field-control{padding-bottom:2vw;border-bottom:1px solid #d19405}#EditorTabsContainer #PermissionEditor .field-control .container-selectable .command-left{display:flex;flex-wrap:wrap;align-items:center;width:100%}#EditorTabsContainer #PermissionEditor .field-control .container-selectable .command-left #SearchPermissionElements{height:7vw;margin:2px 1vw 2px 6vw}#EditorTabsContainer #PermissionEditor .field-control .container-selectable .command-left button{display:flex;align-items:center;align-self:stretch;justify-content:center;white-space:nowrap}#EditorTabsContainer #PermissionEditor .field-control .container-selectable .command-left button .ui-icon{position:relative;top:.5vw;width:18px;height:18px;margin-right:0}#EditorTabsContainer #PermissionEditor .field-control .container-selectable .command-left #OpenPermissionsDialog,#EditorTabsContainer #PermissionEditor .field-control .container-selectable .command-left #DeletePermissions{line-height:1.5}#EditorTabsContainer #PermissionEditor .field-control .container-selectable #CurrentPermissionsWrapper{min-height:15vw}}@media screen and (max-width:1024px) and (min-width:0){thead>tr.ui-widget-header th div>span{font-size:2.8vw;white-space:nowrap}}@media screen and (max-width:1024px) and (min-width:768px){#EditorTabsContainer .field-control .container-normal .ui-icon.ui-icon-pencil.button-edit-markdown{top:10px;right:4px}}@media screen and (max-width:1024px) and (min-width:0){#EditorTabsContainer{overflow:auto}#EditorComments{margin:0;padding:0}#EditorComments #CommentField .control-textarea{height:15vw}#EditorComments #CommentField .control-textarea::placeholder{font-size:2.6vw}}@media screen and (max-width:1024px) and (min-width:0){body{overflow-x:hidden}.is-showMenu{overflow:hidden}.is-showMenu body{position:fixed;overflow:hidden}.bg-overlay{position:fixed;top:0;left:0;z-index:301;display:none;width:100%;height:100%;background:rgba(0,0,0,.5)}header#Header{position:sticky;top:0;z-index:1000;background-color:#fff;transition:all .5s ease}header#Header a#navtgl{top:8px;z-index:1000;transition:all .5s ease}#Header a#navtgl.on::before,#Header a#navtgl.on span,#Header a#navtgl.on::after{position:absolute;top:50%;left:50%;width:20px;height:1.5px;margin:0 0 0 -10px;content:" ";background:#333;transition:transform 150ms ease-out,margin 150ms ease-out,width 150ms ease-out}header#Header a#navtgl.on::before{width:20px;margin:0 0 0 -10px;transform:rotate(45deg)}header#Header a#navtgl.on span{width:0}header#Header a#navtgl.on::after{width:20px;margin:0 0 0 -10px;transform:rotate(-45deg)}}@media screen and (max-width:1024px) and (min-width:0){#OutgoingMailsForm{width:100%;font-size:2.6vw}#OutgoingMailsForm .item h3.title-header{height:auto}#OutgoingMailsForm .item .content{margin:0;padding:.2em}#OutgoingMailsForm .item .content .field-auto,#OutgoingMailsForm .item .content .field-auto-thin{display:flex;flex-direction:column;width:100%;height:auto;margin-right:0;padding-right:0;padding-bottom:0}#OutgoingMailsForm .item .content .field-auto .field-label,#OutgoingMailsForm .item .content .field-auto-thin .field-label{display:block;float:none;width:100%;padding:7px 7px 7px 0;text-align:left}#OutgoingMailsForm .item .content .field-auto .field-label label,#OutgoingMailsForm .item .content .field-auto-thin .field-label label{font-weight:bold}#OutgoingMailsForm .item .content .field-auto .field-control,#OutgoingMailsForm .item .content .field-auto-thin .field-control{float:none;width:100%}#OutgoingMailsForm .item .content .field-auto .field-control .container-normal,#OutgoingMailsForm .item .content .field-auto-thin .field-control .container-normal{width:100%;margin-right:0}#OutgoingMailsForm .item .content .field-auto .field-control .container-normal .control-text,#OutgoingMailsForm .item .content .field-auto-thin .field-control .container-normal .control-text{height:auto;min-height:0}#OutgoingMailsForm .item .content .field-auto-thin{margin-left:0}#OutgoingMailsForm .item .content .field-wide{display:flex;flex-direction:column;padding:0}#OutgoingMailsForm .item .content .field-wide .field-label{padding:7px 0}#OutgoingMailsForm .item .content .field-wide .field-control .container-normal{width:100%;margin-right:0}}@media screen and (max-width:1024px) and (min-width:0){#SiteMenu li.ui-sortable-handle{touch-action:unset}}@media screen and (max-width:1024px) and (min-width:0){.xdsoft_datetimepicker span{font-size:2.6vw}.xdsoft_datetimepicker .xdsoft_datepicker{width:calc(42.81vw - 16px)}.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_monthpicker .xdsoft_today_button{margin-left:0}.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_monthpicker .xdsoft_label.xdsoft_year{margin-left:0}.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_monthpicker .xdsoft_year,.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_monthpicker .xdsoft_month{width:fit-content}.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_monthpicker .xdsoft_year .xdsoft_select .xdsoft_option,.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_monthpicker .xdsoft_month .xdsoft_select .xdsoft_option{font-size:2.6vw}.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_monthpicker .xdsoft_year .xdsoft_select .xdsoft_scrollbar,.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_monthpicker .xdsoft_month .xdsoft_select .xdsoft_scrollbar{width:.7vw}.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_calendar table th,.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_calendar table td{font-size:2.6vw}.xdsoft_datetimepicker .xdsoft_timepicker.active{width:calc(12.17vw - 8px)}.xdsoft_datetimepicker .xdsoft_timepicker.active .xdsoft_time_box .xdsoft_time{font-size:2.6vw}}@media screen and (max-width:1024px) and (min-width:768px){.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_monthpicker .xdsoft_year i,.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_monthpicker .xdsoft_month i{transform:scale(1.6)}.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_monthpicker .xdsoft_year span,.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_monthpicker .xdsoft_month span{font-size:16px}}@media screen and (max-width:1024px) and (min-width:0){.message span.body{display:flex;align-items:center;justify-content:center}.message .close{top:unset;bottom:calc(50% - 8px);margin:auto}}@media screen and (max-width:1024px) and (min-width:0){#Navigations #NavigationMenu #NewMenuContainer{background:unset;border:none}#Navigations #NavigationMenu #NewMenuContainer a{line-height:7vw}#Navigations #NavigationMenu li.sub-menu .ui-menu-item .ui-menu-item-wrapper{padding-left:5vw;font-size:3vw}}@media screen and (max-width:1024px) and (min-width:768px){#Navigations #NavigationMenu li.sub-menu .ui-menu-item .ui-menu-item-wrapper{padding-left:4vw}}@media screen and (max-width:1024px) and (min-width:0){#Editor .field-normal .field-control .container-normal input[type="checkbox"].control-checkbox{position:relative;margin-top:.3vw;margin-right:6px}}@media screen and (max-width:1024px) and (min-width:768px){#Editor .field-normal .field-control .container-normal input[type="checkbox"].control-checkbox{margin-right:12px}}@media screen and (max-width:1024px) and (min-width:0){#Editor #EditorTabsContainer .field-normal:not(.hidden),#Editor #EditorTabsContainer .field-wide:not(.hidden),#Editor #EditorTabsContainer .field-markdown:not(.hidden){display:inline-block;margin-top:8px;padding-bottom:0}}@media screen and (max-width:1024px) and (min-width:0){#ViewModeContainer #Calendar.both select{height:6vw;font-size:2.6vw}#ViewModeContainer #Calendar.both .field-label{min-width:16%;margin-right:0}#ViewModeContainer #Calendar.both .field-auto-thin .field-control .container-normal{display:flex;align-items:center}#ViewModeContainer #Calendar.both .field-auto-thin:nth-child(1),#ViewModeContainer #Calendar.both .field-auto-thin:nth-child(2),#ViewModeContainer #Calendar.both .field-auto-thin:nth-child(3){flex:0 1 calc(47%);flex-wrap:nowrap}#ViewModeContainer #Calendar.both .field-auto-thin:nth-child(1) .field-label,#ViewModeContainer #Calendar.both .field-auto-thin:nth-child(2) .field-label,#ViewModeContainer #Calendar.both .field-auto-thin:nth-child(3) .field-label{min-width:16%}#ViewModeContainer #Calendar.both .field-auto-thin:nth-child(1) .field-control,#ViewModeContainer #Calendar.both .field-auto-thin:nth-child(2) .field-control,#ViewModeContainer #Calendar.both .field-auto-thin:nth-child(3) .field-control{width:84%}#ViewModeContainer #Calendar.both .field-auto-thin:nth-child(4){width:47%;padding-top:2%}#ViewModeContainer #Calendar.both .field-auto-thin:nth-child(4) .field-control .container-normal{justify-content:flex-end}#ViewModeContainer #Calendar.both .field-auto-thin:nth-child(4) .field-control .container-normal #CalendarDate{width:100%;margin-right:0;font-size:2.6vw}#ViewModeContainer #Calendar.both .field-auto-thin input[type="checkbox"]{margin-left:2px}#ViewModeContainer #Calendar.both button{flex:1 0 calc((100%/3) - 32px);margin:2% 10px 2% 10px}#ViewModeContainer .grid.fixed{width:100%}#ViewModeContainer .grid.fixed tbody tr td.container .item{height:4vw;min-height:4vw;margin-top:5px;margin-bottom:5px;touch-action:auto}#ViewModeContainer .grid.fixed tbody tr td.container .item .connection{height:4vw;min-height:4vw}#ViewModeContainer .grid.fixed tbody tr td.container .dummy{height:4vw}#ViewModeContainer .grid.fixed tbody .title{padding:0}thead th.calendar-header{overflow-x:hidden}}@media screen and (max-width:1024px) and (min-width:0){#ViewModeContainer .both{column-gap:16px}#ViewModeContainer .both .field-auto-thin:first-child,#ViewModeContainer .both .field-auto-thin:nth-child(2){flex:0 1 calc(50% - 8px)}#ViewModeContainer .both .field-auto-thin:first-child .field-control,#ViewModeContainer .both .field-auto-thin:nth-child(2) .field-control{flex:1}#ViewModeContainer .both .field-auto-thin:first-child .field-control select,#ViewModeContainer .both .field-auto-thin:nth-child(2) .field-control select{max-width:100%}#ViewModeContainer .both .field-auto-thin:nth-child(3){flex-wrap:wrap;row-gap:12px}#ViewModeContainer .both .field-auto-thin:nth-child(3) .field-label{min-width:15%}#ViewModeContainer .both .field-auto-thin:nth-child(3) .field-auto-thin{display:flex;flex:1 0 100%;align-items:center}#ViewModeContainer .both .field-auto-thin:nth-child(3) .field-auto-thin #GanttStartDate{width:100%;margin-right:0;font-size:2.6vw}#ViewModeContainer .both .field-auto-thin:nth-child(3) button{flex:1}#ViewModeContainer .both .field-auto-thin:nth-child(3) button:last-child{margin-right:8px}#ViewModeContainer .both .field-auto-thin:nth-child(4){width:100%;padding-top:12px}#ViewModeContainer .both .field-auto-thin:nth-child(4) .field-control{width:100%}#ViewModeContainer .both .field-auto-thin:nth-child(4) .field-control .container-normal{display:flex;align-items:center;column-gap:32px;width:100%}#ViewModeContainer .both .field-auto-thin:nth-child(4) .field-control .container-normal #GanttPeriod\,ui{width:99%;margin-top:0}#ViewModeContainer .both .field-auto-thin:nth-child(4) .field-control .container-normal #GanttPeriod{margin:0}#GanttBody{max-height:70vh}#GanttBody #Gantt{width:500%;font-size:2.6vw}#GanttBody text{font-size:2.6vw}#GanttBody .title text.summary{font-size:3vw}#GanttBody #GanttAxis{position:sticky;left:-2px;width:500%}}@media screen and (max-width:1024px) and (min-width:0){#ViewModeContainer #Kamban.both .field-auto-thin select{font-size:2.6vw}#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(1),#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(2),#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(3),#ViewModeContainer #Kamban.both .field-auto-thin#KambanValueField{display:flex;flex:0 1 calc(50% - 8px);flex-wrap:wrap;width:100%;row-gap:0}#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(1) .field-label,#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(2) .field-label,#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(3) .field-label,#ViewModeContainer #Kamban.both .field-auto-thin#KambanValueField .field-label{width:100%}#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(1) select,#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(2) select,#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(3) select,#ViewModeContainer #Kamban.both .field-auto-thin#KambanValueField select{max-width:100%}#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(3){padding-top:4%}#ViewModeContainer #Kamban.both .field-auto-thin#KambanValueField{padding-top:4%}#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(5){display:block;width:100%;padding-top:4%}#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(5) .field-label{min-width:50%;margin-right:10px}#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(5) select{max-width:100%}#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(6),#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(7){width:calc(50% - 8px);padding-top:4%}#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(6) .container-normal,#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(7) .container-normal{display:flex;align-items:center}#ViewModeContainer #Kamban.both #KambanBody #Grid tbody .kamban-row .kamban-container .kamban-item{display:-webkit-box;height:4vw;padding:0 16px 0 5px;overflow:hidden;white-space:pre-line;touch-action:auto;-webkit-line-clamp:1;-webkit-box-orient:vertical}}@media screen and (max-width:1024px) and (min-width:768px){#ViewModeContainer #Kamban.both #KambanBody #Grid tbody .kamban-row .kamban-container .kamban-item .ui-icon.ui-icon-pencil{top:10px;right:4px;width:16px;height:16px}}@media screen and (max-width:1024px) and (min-width:0){#ViewModeContainer #Calendar #FullCalendar.fc .fc-header-toolbar .fc-toolbar-chunk:last-child .fc-button-group{display:flex;flex-wrap:wrap;margin:0}#ViewModeContainer #Calendar #FullCalendar.fc .fc-header-toolbar .fc-toolbar-chunk:last-child .fc-button-group button:nth-child(3){border-radius:0 .25em .25em 0}#ViewModeContainer #Calendar #FullCalendar.fc .fc-header-toolbar .fc-toolbar-chunk:last-child .fc-button-group button:last-child{border-radius:.25em}}@media screen and (max-width:768px) and (min-width:0){#ViewModeContainer #Calendar #FullCalendar.fc .fc-header-toolbar .fc-toolbar-chunk:last-child .fc-button-group button:nth-child(odd){border-radius:.25em 0 0 .25em}#ViewModeContainer #Calendar #FullCalendar.fc .fc-header-toolbar .fc-toolbar-chunk:last-child .fc-button-group button:nth-child(even){border-radius:0 .25em .25em 0}}@media screen and (max-width:1024px) and (min-width:0){#RecordSwitchers{display:flex;align-items:center}#RecordSwitchers #CurrentIndex{display:flex;align-items:center;height:7.5vw}#Editor fieldset .command-left{width:100%}table.grid tbody tr td svg{margin-top:calc(3.2vw - 13px);overflow:unset}table.grid tbody tr td .user{display:flex;align-items:center}table.grid tbody tr td .user .ui-icon-person{margin-top:.15vw}}@media screen and (max-width:1024px) and (min-width:0){#Editor #RecordHeader .user{display:flex;align-items:center}#Editor #RecordHeader .user .ui-icon-person{margin-right:.6vw}#EditorTabsContainer #Users_DeptIdField .ui-icon-person{top:calc(3vw - 6.5px)}}@media screen and (max-width:1024px) and (min-width:768px){.ui-icon{margin-right:4px;transform:scale(1.6)}#Editor .ui-button-icon-space{width:1vw}#Editor #RecordHeader .user .ui-icon-person{margin:auto 4px}#EditorTabsContainer #Users_DeptIdField .ui-icon-person{top:calc(3vw - 3.5px);right:-30px}}@media screen and (max-width:1024px) and (min-width:0){#OutgoingMailDialog .field-wide{padding-bottom:5px}#OutgoingMailDialog .field-wide .field-label{width:auto}#OutgoingMailDialog .field-wide .field-control{float:none}#OutgoingMailDialog .field-wide .control-basket,#OutgoingMailDialog .field-wide .container-normal{margin-left:15vw}#OutgoingMailDialog textarea{height:20vw}}@media screen and (max-width:1024px) and (min-width:0){.show-password{top:calc(50% - 12px);right:10px}#LoginFieldSet input[type="checkbox"]{transform:scale(1.2)}#LoginFieldSet input{height:10vw}#LoginFieldSet input,#LoginFieldSet select{font-size:4vw}#Users_RememberMeField .container-normal{display:flex;align-items:center}}@media screen and (max-width:1024px) and (min-width:768px){.show-password{transform:scale(1.5)}}@media screen and (max-width:1024px) and (min-width:0){#Navigations.open{padding-top:18vw}}@media screen and (max-width:1024px) and (min-width:0){#ViewModeContainer .field-auto-thin>.field-label{padding:7px 2vw 7px 0}#CrosstabValueField .field-control{width:70%}#Crosstab .field-auto-thin p{margin-right:0%}#ViewModeContainer #Crosstab .field-auto-thin{flex:0 1 calc(100%);width:100%;padding-top:1vw}#ViewModeContainer #Crosstab .field-auto-thin .field-label{width:30%}#ViewModeContainer #Crosstab .field-auto-thin .field-control{width:70%}#ViewModeContainer #Crosstab .field-auto-thin .field-control input[type="checkbox"],#ViewModeContainer #Crosstab .field-auto-thin .field-control .field-auto-thin input[type="checkbox"]{width:4vw;height:4vw;margin-left:2px}#ViewModeContainer #Crosstab .field-control .control-dropdown{font-size:2.6vw}#CrosstabBody .grid>thead>tr:first-child>th:not(:first-child),#KambanBody .grid>thead>tr:first-child>th:not(:first-child){white-space:nowrap}}@media screen and (max-width:1024px) and (min-width:0){#ImportSettingsDialog .control-checkbox+label{margin:1.8vw 0 0 1vw}#ImportSettingsDialog .control-checkbox{margin:2vw 0 2vw 2px}#ImportSettingsDialog .control-textbox{height:7vw;line-height:6.5vw}#ImportSettingsDialog .command-center{padding:2vw 0}}@media screen and (max-width:1024px) and (min-width:0){#ExportSelectorDialog .command-center{padding:2vw 0}}@media screen and (max-width:1024px) and (min-width:0){#ViewModeContainer #Grid .control-dropdown,#ViewModeContainer #Grid .datepicker{width:25vw;text-overflow:ellipsis;white-space:nowrap}#ViewModeContainer #Grid .current-user,#ViewModeContainer #Grid .current-time{display:none}#ViewModeContainer #Grid .ui-spinner{display:flex;align-items:center;height:6vw;max-height:6vw}}@media screen and (max-width:1024px) and (min-width:0){#ViewModeContainer .both #TimeSeriesValueField,#ViewModeContainer .both #TimeSeriesChartTypeField,#ViewModeContainer .both #TimeSeriesHorizontalAxisField{width:100%}#ViewModeContainer .both #TimeSeriesValueField .field-label,#ViewModeContainer .both #TimeSeriesChartTypeField .field-label,#ViewModeContainer .both #TimeSeriesHorizontalAxisField .field-label{min-width:30%}#ViewModeContainer .both .field-auto-thin:first-child,#ViewModeContainer .both .field-auto-thin:nth-child(2){flex:0 1 calc(50% - 8px)}#ViewModeContainer .both .field-auto-thin:first-child .field-label,#ViewModeContainer .both .field-auto-thin:nth-child(2) .field-label{min-width:29%}#ViewModeContainer .both .field-auto-thin:nth-child(3) .field-label{min-width:13%}#ViewModeContainer .both .field-auto-thin select{max-width:100%}#ViewModeContainer .both .field-auto-thin>.field-control{min-width:68%}}@media screen and (max-width:1024px) and (min-width:0){#ApiEditorCommands{display:flex;justify-content:center;padding:10vw 0}}@media screen and (max-width:1024px) and (min-width:0){#Editor #TenantForm #EditorTabsContainer .fieldset .field-auto-thin{width:100%;height:7vw;margin:0}#Editor #TenantForm #EditorTabsContainer .fieldset .field-auto-thin .field-control{width:100%}#Editor #TenantForm #EditorTabsContainer .fieldset .field-auto-thin .field-control .container-normal label{padding:0}#Editor #TenantForm #EditorTabsContainer .fieldset .field-auto-thin .field-control .container-normal #TenantImage{height:auto}#Editor #TenantForm #EditorTabsContainer .fieldset .button-icon{margin-top:5vw}#Editor #TenantForm #EditorTabsContainer .fieldset #StyleField .field-textarea>.field-label,#Editor #TenantForm #EditorTabsContainer .fieldset #ScriptField .field-textarea>.field-label{width:100%;text-align:left}}@media screen and (max-width:1024px) and (min-width:0){#Versions span{margin:20px 10px 20px 0}}@media screen and (max-width:767px) and (min-width:0){#Versions{width:auto;padding:4vw 5vw 4vw 7vw;font-size:2.6vw}#Versions span{margin:0 10px 0 0}} \ No newline at end of file +@media screen and (max-width:1024px) and (min-width:0){#LoginFieldSet{width:100%;padding:10px;font-size:4vw}#LoginFieldSet input,#LoginFieldSet select{padding:10px;font-size:5vw}#LoginFieldSet input[type="checkbox"]{margin:20px 0 0 10px;transform:scale(2)}#LoginFieldSet button{font-size:4vw}#LoginFieldSet .container-normal{margin-left:0}#LoginFieldSet .field-wide,#LoginFieldSet .field-normal{float:left;width:100%;margin:10px 0}#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{padding:10px;font-size:5vw}#DemoFields button{float:right;margin-top:10px;font-size:4vw}#DemoFields .container-normal{margin-left:0}#DemoFields .field-normal{float:left;width:100%;margin:10px 0}#StartGuide{display:none}.container-normal>#ApiKey{word-break:break-all}div[role="dialog"]{z-index:999;width:98% !important}#EnterPriseBanner,#SupportBanner,#CasesBanner{display:none}#EditorTabsContainer>fieldset{display:contents}#EditorTabsContainer>fieldset>fieldset{display:contents}#TenantImage{width:100%}#Search{width:auto;height:auto}#Breadcrumb{font-size:2.6vw}#ViewSelectorField{position:relative;margin-bottom:5px;font-size:2.8vw}#HeaderTitleContainer{margin-bottom:3%}#ViewFilters{padding-bottom:2%;font-size:2.6vw}#Aggregations{font-size:2.6vw}#ViewFilters_Reset{float:none}#ViewFilters.reduced,#Aggregations.reduced{margin-bottom:2%;padding:2%;border-bottom:1px solid #aaa}#Aggregations .label{height:auto}#ViewFilters>.field-auto-thin{display:flex;align-items:center;justify-content:start;width:49%;height:6vw;margin:2% 0 0 0;padding:0;line-height:1}#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:100% !important;height:6vw}.field-auto-thin input[type="checkbox"],.field-auto-thin input[type="radio"]{width:2.6vw;height: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-top:0;padding-bottom:15%}#MainForm{display:flex;flex-direction:column}#RecordInfo{margin-bottom:2%}#RecordSwitchers{width:100%;font-size:2.6vw}.ui-button,#RecordSwitchers .current{height:auto;margin-right:2%;padding:2% !important;line-height:1}#EditorComments{width:100%;font-size:2.6vw;order:3}#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{float:none;clear:both;width:100%;min-height:5vw;padding:0 0 3% 0}.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{clear:both;width:100%;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{font-size:2.6vw}#Guide{font-size:2.6vw}.alert-success,.alert-warning,.alert-error{height:auto;font-size:2.6vw}#MainCommandsContainer{z-index:200;height:auto;padding:2vw 0;font-size:2.6vw}#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-radius:4px}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:1%;padding-bottom:0;border-radius:4px}.message{bottom:140px}}#GuideExpand{width:100px}@media screen and (max-width:1024px) and (min-width:0){body{min-width:320px !important}#Header{position:relative;height:auto}#CorpLogo{float:none;width:30%}#MainContainer{min-height:100vh}#Header a#navtgl{position:absolute;top:1.4vw;right:4vw;z-index:101;display:block;width:8vw;height:8vw;padding:1.6vw 1.4vw;background:#fece2f;border:.4vw solid #d19405;border-radius:1vw}#Header a#navtgl::before,#Header a#navtgl span,#Header a#navtgl::after{position:absolute;top:50%;left:50%;width:20px;height:1.5px;margin:0 0 0 -10px;content:" ";background:#333;transition:transform 150ms ease-out,margin 150ms ease-out,width 150ms ease-out}#Header a#navtgl::before{transform:translateY(7px)}#Header a#navtgl span{transform:translateY(0)}#Header a#navtgl::after{transform:translateY(-7px)}* #Navigations{box-sizing:border-box}#Navigations{position:fixed;top:0;right:-110% !important;z-index:1000;float:none !important;width:70%;height:100vh !important;margin:0 !important;padding-top:112px !important;overflow:auto;font-size:3.2vw;line-height:7vw;border:none;transition:right ease-out .3s}#Navigations:not(.open){pointer-events:none}#Navigations.open{right:0 !important}#NavigationMenu>li.sub-menu>div.hover{background:none}#NavigationMenu{float:none;margin-right:0;margin-bottom:3%}#SearchField{float:none;margin:0;color:#000}#NavigationMenu>li{position:relative;display:block;float:none;width:100%;height:auto}#NavigationMenu>li>div{height:auto;font-weight:bold;line-height:7vw;text-align:left}#NavigationMenu>li>div:hover{background:none}#NavigationMenu>li>div>a{display:block;height:auto;font-weight:bold;text-decoration:none}#NavigationMenu .menu{position:relative;top:0;right:0;z-index:3;width:100%;border-top:none !important;border-radius:0}.pc-dn{display:block !important}#NavigationMenu .menu>li>a.ui-state-active{font-weight:normal;text-decoration:none}.ui-menu .ui-menu-item{border-top:1px solid #d19405}#NewMenuContainer{background:#fff;border:1px solid #d19405}}@media screen and (max-width:1024px) and (min-width:0){#SiteMenu .nav-site{float:none;width:20vw;height:20vw;margin:6%;text-align:center;border-radius:.5vw}#SiteMenu .sortable{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:flex-start}#SiteMenu .nav-site.sites{width:20vw !important;height:20vw !important;background:#fff;border-radius:5px}#SiteMenu .nav-site .heading{top:-3vw;width:8vw;height:3vw}#SiteMenu .nav-site.sites.to-parent{height:auto !important;margin-top:3%;margin-bottom:0;box-shadow:none}#SiteMenu .nav-site.sites.to-parent span.title{position:relative;top:0;width:100%;margin-left:0;text-align:left}#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;z-index:1;display:block;width:90%;max-width:inherit;margin:0 auto;border-radius:unset}#SiteMenu .nav-site span.title::before{display:block;height:0;content:""}#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{min-width:6vw;height:6vw;padding:0;font-size:2.6vw;font-weight:bold;line-height:6vw;border-radius:3vw}#SiteMenu .nav-site .conditions .overdue::before,#SiteMenu .nav-site .conditions .overdue::after{display:none;content:initial}#SiteMenu .nav-site[data-type="Wikis"]{position:relative;width:20vw;border:2px solid #ccc;border-radius:2px}#SiteMenu .nav-site[data-type="Wikis"] a::before,#SiteMenu .nav-site[data-type="Wikis"] a::after{position:absolute;left:10%;display:block;width:80%;height:20%;content:"";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;text-align:left;background:none;border:none}#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;font-size:15px;text-decoration:none;vertical-align:middle}#SiteMenu .nav-site.to-parent a::before,#SiteMenu .nav-site.to-parent a::after{position:absolute;top:0;bottom:0;left:0;margin:auto;vertical-align:middle;content:""}#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{position:absolute;top:22vw;display:block;width:140%;margin-left:0;margin-left:-20%;overflow:hidden;font-size:2.6vw;text-align:center;text-overflow:ellipsis;white-space:nowrap}#SiteMenu .nav-site .stacking1{position:absolute;top:1px;left:1px;width:20vw;height:20vw;border-right:solid 1px #c0c0c0;border-bottom:solid 1px #c0c0c0;border-radius:5px}#SiteMenu .nav-site .stacking2{position:absolute;top:4px;left:4px;width:20vw;height:20vw;border-right:solid 1px #c0c0c0;border-bottom:solid 1px #c0c0c0;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:1024px) and (min-width:0){#FieldSetStandard{display:flex;flex-direction:column}.legend{order:2}#StandardTemplatesViewer{order:3}.template-selectable{float:none;order:1}.template-viewer-container{float:none;margin:0}.template-viewer{margin:0}.template-selectable{width:100%}.template-tab-container{min-height:10px}.field-vertical{float:none;width:100%;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:1024px) and (min-width:0){#FieldSetHistories{width:100%;overflow:auto}#ViewModeContainer{width:100%;padding-top:1%;overflow:auto}#CrosstabBody{width:100%;overflow:auto}#GanttBody{width:100%;padding-top:5%;overflow:auto}.grid{width:98%;font-size:2.8vw}.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;margin-bottom:2% !important;padding:0}#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;align-items:center;justify-content:space-between}#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{margin-top:1%;font-size:2.6vw}.svg-crosstab{display:block}#ViewModeContainer .both{display:flex;flex-wrap:wrap;align-items:center}#ViewModeContainer .both .field-auto-thin{display:flex;align-items:center;width:48%;height:auto;margin:0;padding:0;padding-top:2%;font-size:2.6vw}#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{display:block;width:48%}#ViewModeContainer .field-auto-thin p{margin-right:2%;text-align:left;white-space:nowrap}#GanttAxis{position:relative;bottom:0;left:0;width:1500px}#Gantt{width:1500px}#BurnDown{width:1500px}#TimeSeriesBody{width:1500px;margin-left:-5%;padding-top:5%}#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 (max-width:1024px) and (min-width:0){#Header{padding:0 calc(5vw)}#Header a#navtgl{right:5vw}#Application,#Footer{padding-right:5vw;padding-left:5vw}#SiteMenu .nav-site{margin:5%}:not(td)>div.field-control .container-normal{margin-left:0}*{line-height:1.4}.field-normal .control-textbox,.field-normal .control-dropdown,.field-normal .control-text,.field-control .control-textbox,.field-control .control-dropdown,.field-control .control-text,.container-normal .control-textbox,.container-normal .control-dropdown,.container-normal .control-text{display:flex;align-items:center;height:6vw;min-height:unset;padding-top:0;padding-bottom:0;font-size:2.6vw;line-height:6vw}body{font-size:16px}}@media screen and (max-width:1024px) and (min-width:0){#HeaderTitle{font-size:16px}}@media screen and (max-width:1024px) and (min-width:768px){#HeaderTitle{font-size:35px}}@media screen and (max-width:1024px) and (min-width:0){.command-center{padding:0}.ui-dialog .ui-dialog-titlebar-close{top:0;bottom:0;width:5vw;height:5vw;margin:auto 0}}@media screen and (max-width:1024px) and (min-width:0){#ViewSelector{font-size:2.6vw}}@media screen and (max-width:1024px) and (min-width:0){#Logo a{display:inline-flex;align-items:center}#Logo #ProductLogo{padding-left:8px;font-size:18px}#CorpLogo{float:none;width:unset;height:calc(8vw + 10px);margin-top:0}}@media screen and (max-width:1024px) and (min-width:768px){#Logo #ProductLogo{padding-left:16px;font-size:32px}}@media screen and (max-width:1024px) and (min-width:0){#Editor .field-control .container-normal{width:calc(100% - 18px)}#Editor .field-control .ui-icon.ui-icon-clock.current-time,#Editor .field-control .ui-icon.ui-icon-person.current-user{top:calc(3vw - 6px)}}@media screen and (max-width:1024px) and (min-width:768px){#Editor .field-control .container-normal{width:calc(100% - 36px)}#Editor .field-control .ui-icon.ui-icon-clock.current-time,#Editor .field-control .ui-icon.ui-icon-person.current-user{top:calc(3vw - 3.5px);right:-30px}}@media screen and (max-width:1024px) and (min-width:0){#FieldSetAddressBook #OutgoingMailDestinationForm .container-left{width:38vw}#FieldSetAddressBook #OutgoingMailDestinationForm .container-right .command-left{float:unset;padding:0}#FieldSetAddressBook #OutgoingMailDestinationForm .container-right .command-left button{margin:1vw 1vw 1vw 0}#FieldSetAddressBook #OutgoingMailDestinationForm .container-right .container-selectable .wrapper{height:40vw}#FieldSetAddressBook #OutgoingMailDestinationForm .container-right>*{margin-left:40vw}}@media screen and (max-width:1024px) and (min-width:768px){#FieldSetAddressBook #OutgoingMailDestinationForm .container-left{width:33vw}}@media screen and (max-width:1024px) and (min-width:0){#Issues_WorkValue{width:100px}}@media screen and (max-width:1024px) and (min-width:0){#Users_LoginId,#Users_Password{height:40px}#LoginMessage span{font-size:3.5vw}#PortalLink{top:3vw;font-size:3.5vw}#LoginFieldSet{margin:65px auto 20px auto}#LoginFieldSet input[type="checkbox"]{margin:auto 0;margin-left:1.2vw}#LoginFieldSet button{margin-top:0}#LoginFieldSet .field-wide,#LoginFieldSet .field-normal{margin:0 0}#LoginFieldSet .field-normal .control-checkbox+label{margin:auto 0;margin-left:4vw;padding:0}#Logins .field-label{width:100%}}@media screen and (max-width:1024px) and (min-width:0){#Editor .field-markdown>.field-label>label{font-weight:bold}#Editor .field-control .unit{padding-top:calc((18px - 1.4em)/2);font-size:2.6vw}#Editor .ui-spinner .control-spinner{height:100%}}@media screen and (max-width:1024px) and (min-width:0){#GridCheckAll{margin-top:0}label[for="GridCheckAll"]{margin:0}#Footer{height:auto;font-size:2.8vw}#MainCommandsContainer{bottom:calc(2.8vw*1.4 + 10px)}body>thead>tr{font-size:.75em}}@media screen and (max-width:1024px) and (min-width:0){#Editor #EditorTabsContainer fieldset .wrapper{max-height:250px;overflow:auto}#Editor #EditorTabsContainer fieldset .container-selectable .command-left{display:flex;align-items:center}#Editor #EditorTabsContainer fieldset:not(#FieldSetGeneral) legend.legend{min-height:10px}#SiteImageSettingsEditor .field-auto-thin,#GridSettingsEditor .field-auto-thin,#FiltersSettingsEditor .field-auto-thin,#EditorSettingsEditor .field-auto-thin,#LinksSettingsEditor .field-auto-thin,#HistoriesSettingsEditor .field-auto-thin,#FormulasSettingsEditor .field-auto-thin,#ViewsSettingsEditor .field-auto-thin,#ImportsSettingsEditor .field-auto-thin,#ExportsSettingsEditor .field-auto-thin,#CalendarSettingsEditor .field-auto-thin,#CrosstabSettingsEditor .field-auto-thin,#GanttSettingsEditor .field-auto-thin,#BurnDownSettingsEditor .field-auto-thin,#TimeSeriesSettingsEditor .field-auto-thin,#KambanSettingsEditor .field-auto-thin,#ImageLibSettingsEditor .field-auto-thin,#SearchSettingsEditor .field-auto-thin,#StylesSettingsEditor .field-auto-thin,#ScriptsSettingsEditor .field-auto-thin,#PublishSettingsEditor .field-auto-thin,#FieldSetSiteAccessControl .field-auto-thin{display:flex;align-items:center;clear:both;height:auto;padding-right:0}#SiteImageSettingsEditor .field-auto-thin .container-normal,#GridSettingsEditor .field-auto-thin .container-normal,#FiltersSettingsEditor .field-auto-thin .container-normal,#EditorSettingsEditor .field-auto-thin .container-normal,#LinksSettingsEditor .field-auto-thin .container-normal,#HistoriesSettingsEditor .field-auto-thin .container-normal,#FormulasSettingsEditor .field-auto-thin .container-normal,#ViewsSettingsEditor .field-auto-thin .container-normal,#ImportsSettingsEditor .field-auto-thin .container-normal,#ExportsSettingsEditor .field-auto-thin .container-normal,#CalendarSettingsEditor .field-auto-thin .container-normal,#CrosstabSettingsEditor .field-auto-thin .container-normal,#GanttSettingsEditor .field-auto-thin .container-normal,#BurnDownSettingsEditor .field-auto-thin .container-normal,#TimeSeriesSettingsEditor .field-auto-thin .container-normal,#KambanSettingsEditor .field-auto-thin .container-normal,#ImageLibSettingsEditor .field-auto-thin .container-normal,#SearchSettingsEditor .field-auto-thin .container-normal,#StylesSettingsEditor .field-auto-thin .container-normal,#ScriptsSettingsEditor .field-auto-thin .container-normal,#PublishSettingsEditor .field-auto-thin .container-normal,#FieldSetSiteAccessControl .field-auto-thin .container-normal{width:100%}#SiteImageSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#GridSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#FiltersSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#EditorSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#LinksSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#HistoriesSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#FormulasSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#ViewsSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#ImportsSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#ExportsSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#CalendarSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#CrosstabSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#GanttSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#BurnDownSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#TimeSeriesSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#KambanSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#ImageLibSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#SearchSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#StylesSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#ScriptsSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#PublishSettingsEditor .field-auto-thin .container-normal .control-checkbox~label,#FieldSetSiteAccessControl .field-auto-thin .container-normal .control-checkbox~label{display:unset;float:unset;width:auto}#SiteImageSettingsEditor .field-auto-thin .field-label~.field-control,#GridSettingsEditor .field-auto-thin .field-label~.field-control,#FiltersSettingsEditor .field-auto-thin .field-label~.field-control,#EditorSettingsEditor .field-auto-thin .field-label~.field-control,#LinksSettingsEditor .field-auto-thin .field-label~.field-control,#HistoriesSettingsEditor .field-auto-thin .field-label~.field-control,#FormulasSettingsEditor .field-auto-thin .field-label~.field-control,#ViewsSettingsEditor .field-auto-thin .field-label~.field-control,#ImportsSettingsEditor .field-auto-thin .field-label~.field-control,#ExportsSettingsEditor .field-auto-thin .field-label~.field-control,#CalendarSettingsEditor .field-auto-thin .field-label~.field-control,#CrosstabSettingsEditor .field-auto-thin .field-label~.field-control,#GanttSettingsEditor .field-auto-thin .field-label~.field-control,#BurnDownSettingsEditor .field-auto-thin .field-label~.field-control,#TimeSeriesSettingsEditor .field-auto-thin .field-label~.field-control,#KambanSettingsEditor .field-auto-thin .field-label~.field-control,#ImageLibSettingsEditor .field-auto-thin .field-label~.field-control,#SearchSettingsEditor .field-auto-thin .field-label~.field-control,#StylesSettingsEditor .field-auto-thin .field-label~.field-control,#ScriptsSettingsEditor .field-auto-thin .field-label~.field-control,#PublishSettingsEditor .field-auto-thin .field-label~.field-control,#FieldSetSiteAccessControl .field-auto-thin .field-label~.field-control{margin-left:10px}#SiteImageSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#GridSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#FiltersSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#EditorSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#LinksSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#HistoriesSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#FormulasSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#ViewsSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#ImportsSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#ExportsSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#CalendarSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#CrosstabSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#GanttSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#BurnDownSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#TimeSeriesSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#KambanSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#ImageLibSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#SearchSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#StylesSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#ScriptsSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#PublishSettingsEditor .field-auto-thin .field-label~.field-control .container-normal,#FieldSetSiteAccessControl .field-auto-thin .field-label~.field-control .container-normal{width:100%}#FieldSetGeneral .field-control .container-normal .control-checkbox~label{width:auto}#GridSettingsEditor #GridEditorType{max-width:unset}#SiteImageSettingsEditor #SiteImage{width:100%;height:7vw}#SiteImageSettingsEditor #SetSiteImage{margin-right:0}#SearchSettingsEditor #SearchType{margin-bottom:10px}#SearchSettingsEditor #SearchSettingsEditorFulltext legend.legend.applied,#SearchSettingsEditor #SearchSettingsEditorOperations legend.legend.applied{margin-bottom:10px}#SearchSettingsEditor #SearchSettingsEditorFulltext{padding-top:10px}#Editor #EditorTabsContainer .fieldset+.field-auto-thin{margin-top:10px}}@media screen and (max-width:1024px) and (min-width:0){#Aggregations{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-start;row-gap:5px}#Aggregations span.label{display:flex;flex:1 0 auto;align-items:center;align-self:stretch;justify-content:flex-start;margin:0;text-align:center}#Aggregations span.data{display:flex;flex:1 0 auto;align-items:center;align-self:stretch;justify-content:flex-start;height:auto;margin:0}#Aggregations span.data.no-choice{flex-basis:auto;align-self:stretch}#Aggregations span.data.link span{font-weight:bold}#Aggregations #ReduceAggregations{width:100%}}@media screen and (max-width:1024px) and (min-width:768px){#Aggregations{row-gap:15px}}@media screen and (max-width:1024px) and (min-width:0){#ViewModeContainer .grid{vertical-align:middle}input[type="checkbox"],.field-auto-thin input[type="checkbox"]{width:3vw;height:3vw}.field-auto-thin input[type="checkbox"]+label{padding-top:2px}}@media screen and (max-width:1024px) and (min-width:0){#SearchField #Search{width:100%;font-size:3vw}#SearchField #Search::placeholder{font-size:3vw}}@media screen and (max-width:1024px) and (min-width:0){#ViewFilters #ViewFilters_Reset{margin-right:0;margin-left:auto}#ViewFilters .field-auto-thin{width:50%}#ViewFilters .field-auto-thin .field-control .container-normal{display:flex;align-items:center}#ViewFilters .field-auto-thin .field-control .container-normal input[type="checkbox"]{margin-top:1px;margin-right:4px}#ViewFilters .field-auto-thin .field-control .container-normal .ui-widget.ui-state-default.ui-multiselect,#ViewFilters .field-auto-thin .field-control .container-normal .control-textbox{height:6vw;font-size:2.6vw}#ViewFilters #ViewFilters_SearchField{width:100%}#ViewFilters #ViewFilters_SearchField p.field-label{width:17%}#ViewFilters #ViewFilters_SearchField .field-control{width:100%}#ViewFilters>.field-auto-thin:nth-child(odd){padding-right:2px}#ViewFilters>.field-auto-thin:nth-child(even){padding-left:2px}.ui-multiselect-menu .ui-helper-reset{position:relative}.ui-multiselect-menu .ui-helper-reset li{width:100%}.ui-multiselect-menu .ui-helper-reset li>label span{position:relative;top:-4px}.ui-multiselect-menu .ui-helper-reset li .ui-multiselect-all,.ui-multiselect-menu .ui-helper-reset li .ui-multiselect-none{display:flex;align-items:center;width:100%}.ui-multiselect-menu .ui-helper-reset li .ui-multiselect-all span:last-child,.ui-multiselect-menu .ui-helper-reset li .ui-multiselect-none span:last-child{padding-left:10px}.ui-multiselect-menu .ui-helper-reset li .ui-multiselect-close{position:absolute;top:8px;right:0}}@media screen and (max-width:1024px) and (min-width:0){#EditorTabsContainer .legend.applied{display:flex;align-items:center;font-weight:bold}#EditorTabsContainer #PermissionEditor .field-vertical:first-child>.field-control{padding-bottom:2vw;border-bottom:1px solid #d19405}#EditorTabsContainer #PermissionEditor .field-control .container-selectable .command-left{display:flex;flex-wrap:wrap;align-items:center;width:100%}#EditorTabsContainer #PermissionEditor .field-control .container-selectable .command-left #SearchPermissionElements{height:7vw;margin:2px 1vw 2px 6vw}#EditorTabsContainer #PermissionEditor .field-control .container-selectable .command-left button{display:flex;align-items:center;align-self:stretch;justify-content:center;white-space:nowrap}#EditorTabsContainer #PermissionEditor .field-control .container-selectable .command-left button .ui-icon{position:relative;top:.5vw;width:18px;height:18px;margin-right:0}#EditorTabsContainer #PermissionEditor .field-control .container-selectable .command-left #OpenPermissionsDialog,#EditorTabsContainer #PermissionEditor .field-control .container-selectable .command-left #DeletePermissions{line-height:1.5}#EditorTabsContainer #PermissionEditor .field-control .container-selectable #CurrentPermissionsWrapper{min-height:15vw}}@media screen and (max-width:1024px) and (min-width:0){thead>tr.ui-widget-header th div>span{font-size:2.8vw;white-space:nowrap}}@media screen and (max-width:1024px) and (min-width:768px){#EditorTabsContainer .field-control .container-normal .ui-icon.ui-icon-pencil.button-edit-markdown{top:10px;right:4px}}@media screen and (max-width:1024px) and (min-width:0){#EditorTabsContainer{overflow:auto}#EditorComments{margin:0;padding:0}#EditorComments #CommentField .control-textarea{height:15vw}#EditorComments #CommentField .control-textarea::placeholder{font-size:2.6vw}}@media screen and (max-width:1024px) and (min-width:0){body{overflow-x:hidden}.is-showMenu{overflow:hidden}.is-showMenu body{position:fixed;overflow:hidden}.bg-overlay{position:fixed;top:0;left:0;z-index:301;display:none;width:100%;height:100%;background:rgba(0,0,0,.5)}header#Header{position:sticky;top:0;z-index:1000;background-color:#fff;transition:all .5s ease}header#Header a#navtgl{top:8px;z-index:1000;transition:all .5s ease}#Header a#navtgl.on::before,#Header a#navtgl.on span,#Header a#navtgl.on::after{position:absolute;top:50%;left:50%;width:20px;height:1.5px;margin:0 0 0 -10px;content:" ";background:#333;transition:transform 150ms ease-out,margin 150ms ease-out,width 150ms ease-out}header#Header a#navtgl.on::before{width:20px;margin:0 0 0 -10px;transform:rotate(45deg)}header#Header a#navtgl.on span{width:0}header#Header a#navtgl.on::after{width:20px;margin:0 0 0 -10px;transform:rotate(-45deg)}}@media screen and (max-width:1024px) and (min-width:0){#OutgoingMailsForm{width:100%;font-size:2.6vw}#OutgoingMailsForm .item h3.title-header{height:auto}#OutgoingMailsForm .item .content{margin:0;padding:.2em}#OutgoingMailsForm .item .content .field-auto,#OutgoingMailsForm .item .content .field-auto-thin{display:flex;flex-direction:column;width:100%;height:auto;margin-right:0;padding-right:0;padding-bottom:0}#OutgoingMailsForm .item .content .field-auto .field-label,#OutgoingMailsForm .item .content .field-auto-thin .field-label{display:block;float:none;width:100%;padding:7px 7px 7px 0;text-align:left}#OutgoingMailsForm .item .content .field-auto .field-label label,#OutgoingMailsForm .item .content .field-auto-thin .field-label label{font-weight:bold}#OutgoingMailsForm .item .content .field-auto .field-control,#OutgoingMailsForm .item .content .field-auto-thin .field-control{float:none;width:100%}#OutgoingMailsForm .item .content .field-auto .field-control .container-normal,#OutgoingMailsForm .item .content .field-auto-thin .field-control .container-normal{width:100%;margin-right:0}#OutgoingMailsForm .item .content .field-auto .field-control .container-normal .control-text,#OutgoingMailsForm .item .content .field-auto-thin .field-control .container-normal .control-text{height:auto;min-height:0}#OutgoingMailsForm .item .content .field-auto-thin{margin-left:0}#OutgoingMailsForm .item .content .field-wide{display:flex;flex-direction:column;padding:0}#OutgoingMailsForm .item .content .field-wide .field-label{padding:7px 0}#OutgoingMailsForm .item .content .field-wide .field-control .container-normal{width:100%;margin-right:0}}@media screen and (max-width:1024px) and (min-width:0){#SiteMenu li.ui-sortable-handle{touch-action:unset}}@media screen and (max-width:1024px) and (min-width:0){.xdsoft_datetimepicker span{font-size:2.6vw}.xdsoft_datetimepicker .xdsoft_datepicker{width:calc(42.81vw - 16px)}.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_monthpicker .xdsoft_today_button{margin-left:0}.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_monthpicker .xdsoft_label.xdsoft_year{margin-left:0}.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_monthpicker .xdsoft_year,.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_monthpicker .xdsoft_month{width:fit-content}.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_monthpicker .xdsoft_year .xdsoft_select .xdsoft_option,.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_monthpicker .xdsoft_month .xdsoft_select .xdsoft_option{font-size:2.6vw}.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_monthpicker .xdsoft_year .xdsoft_select .xdsoft_scrollbar,.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_monthpicker .xdsoft_month .xdsoft_select .xdsoft_scrollbar{width:.7vw}.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_calendar table th,.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_calendar table td{font-size:2.6vw}.xdsoft_datetimepicker .xdsoft_timepicker.active{width:calc(12.17vw - 8px)}.xdsoft_datetimepicker .xdsoft_timepicker.active .xdsoft_time_box .xdsoft_time{font-size:2.6vw}}@media screen and (max-width:1024px) and (min-width:768px){.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_monthpicker .xdsoft_year i,.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_monthpicker .xdsoft_month i{transform:scale(1.6)}.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_monthpicker .xdsoft_year span,.xdsoft_datetimepicker .xdsoft_datepicker .xdsoft_monthpicker .xdsoft_month span{font-size:16px}}@media screen and (max-width:1024px) and (min-width:0){.message span.body{display:flex;align-items:center;justify-content:center}.message .close{top:unset;bottom:calc(50% - 8px);margin:auto}}@media screen and (max-width:1024px) and (min-width:0){#Navigations #NavigationMenu #NewMenuContainer{background:unset;border:none}#Navigations #NavigationMenu #NewMenuContainer a{line-height:7vw}#Navigations #NavigationMenu li.sub-menu .ui-menu-item .ui-menu-item-wrapper{padding-left:5vw;font-size:3vw}}@media screen and (max-width:1024px) and (min-width:768px){#Navigations #NavigationMenu li.sub-menu .ui-menu-item .ui-menu-item-wrapper{padding-left:4vw}}@media screen and (max-width:1024px) and (min-width:0){#Editor .field-normal .field-control .container-normal input[type="checkbox"].control-checkbox{position:relative;margin-top:.3vw;margin-right:6px}}@media screen and (max-width:1024px) and (min-width:768px){#Editor .field-normal .field-control .container-normal input[type="checkbox"].control-checkbox{margin-right:12px}}@media screen and (max-width:1024px) and (min-width:0){#Editor #EditorTabsContainer .field-normal:not(.hidden),#Editor #EditorTabsContainer .field-wide:not(.hidden),#Editor #EditorTabsContainer .field-markdown:not(.hidden){display:inline-block;margin-top:8px;padding-bottom:0}}@media screen and (max-width:1024px) and (min-width:0){#ViewModeContainer #Calendar.both select{height:6vw;font-size:2.6vw}#ViewModeContainer #Calendar.both .field-label{min-width:16%;margin-right:0}#ViewModeContainer #Calendar.both .field-auto-thin .field-control .container-normal{display:flex;align-items:center}#ViewModeContainer #Calendar.both .field-auto-thin:nth-child(1),#ViewModeContainer #Calendar.both .field-auto-thin:nth-child(2),#ViewModeContainer #Calendar.both .field-auto-thin:nth-child(3){flex:0 1 calc(47%);flex-wrap:nowrap}#ViewModeContainer #Calendar.both .field-auto-thin:nth-child(1) .field-label,#ViewModeContainer #Calendar.both .field-auto-thin:nth-child(2) .field-label,#ViewModeContainer #Calendar.both .field-auto-thin:nth-child(3) .field-label{min-width:16%}#ViewModeContainer #Calendar.both .field-auto-thin:nth-child(1) .field-control,#ViewModeContainer #Calendar.both .field-auto-thin:nth-child(2) .field-control,#ViewModeContainer #Calendar.both .field-auto-thin:nth-child(3) .field-control{width:84%}#ViewModeContainer #Calendar.both .field-auto-thin:nth-child(4){width:47%;padding-top:2%}#ViewModeContainer #Calendar.both .field-auto-thin:nth-child(4) .field-control .container-normal{justify-content:flex-end}#ViewModeContainer #Calendar.both .field-auto-thin:nth-child(4) .field-control .container-normal #CalendarDate{width:100%;margin-right:0;font-size:2.6vw}#ViewModeContainer #Calendar.both .field-auto-thin input[type="checkbox"]{margin-left:2px}#ViewModeContainer #Calendar.both button{flex:1 0 calc((100%/3) - 32px);margin:2% 10px 2% 10px}#ViewModeContainer .grid.fixed{width:100%}#ViewModeContainer .grid.fixed tbody tr td.container .item{height:4vw;min-height:4vw;margin-top:5px;margin-bottom:5px;touch-action:auto}#ViewModeContainer .grid.fixed tbody tr td.container .item .connection{height:4vw;min-height:4vw}#ViewModeContainer .grid.fixed tbody tr td.container .dummy{height:4vw}#ViewModeContainer .grid.fixed tbody .title{padding:0}thead th.calendar-header{overflow-x:hidden}}@media screen and (max-width:1024px) and (min-width:0){#ViewModeContainer .both{column-gap:16px}#ViewModeContainer .both .field-auto-thin:first-child,#ViewModeContainer .both .field-auto-thin:nth-child(2){flex:0 1 calc(50% - 8px)}#ViewModeContainer .both .field-auto-thin:first-child .field-control,#ViewModeContainer .both .field-auto-thin:nth-child(2) .field-control{flex:1}#ViewModeContainer .both .field-auto-thin:first-child .field-control select,#ViewModeContainer .both .field-auto-thin:nth-child(2) .field-control select{max-width:100%}#ViewModeContainer .both .field-auto-thin:nth-child(3){flex-wrap:wrap;row-gap:12px}#ViewModeContainer .both .field-auto-thin:nth-child(3) .field-label{min-width:15%}#ViewModeContainer .both .field-auto-thin:nth-child(3) .field-auto-thin{display:flex;flex:1 0 100%;align-items:center}#ViewModeContainer .both .field-auto-thin:nth-child(3) .field-auto-thin #GanttStartDate{width:100%;margin-right:0;font-size:2.6vw}#ViewModeContainer .both .field-auto-thin:nth-child(3) button{flex:1}#ViewModeContainer .both .field-auto-thin:nth-child(3) button:last-child{margin-right:8px}#ViewModeContainer .both .field-auto-thin:nth-child(4){width:100%;padding-top:12px}#ViewModeContainer .both .field-auto-thin:nth-child(4) .field-control{width:100%}#ViewModeContainer .both .field-auto-thin:nth-child(4) .field-control .container-normal{display:flex;align-items:center;column-gap:32px;width:100%}#ViewModeContainer .both .field-auto-thin:nth-child(4) .field-control .container-normal #GanttPeriod\,ui{width:99%;margin-top:0}#ViewModeContainer .both .field-auto-thin:nth-child(4) .field-control .container-normal #GanttPeriod{margin:0}#GanttBody{max-height:70vh}#GanttBody #Gantt{width:500%;font-size:2.6vw}#GanttBody text{font-size:2.6vw}#GanttBody .title text.summary{font-size:3vw}#GanttBody #GanttAxis{position:sticky;left:-2px;width:500%}}@media screen and (max-width:1024px) and (min-width:0){#ViewModeContainer #Kamban.both .field-auto-thin select{font-size:2.6vw}#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(1),#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(2),#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(3),#ViewModeContainer #Kamban.both .field-auto-thin#KambanValueField{display:flex;flex:0 1 calc(50% - 8px);flex-wrap:wrap;width:100%;row-gap:0}#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(1) .field-label,#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(2) .field-label,#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(3) .field-label,#ViewModeContainer #Kamban.both .field-auto-thin#KambanValueField .field-label{width:100%}#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(1) select,#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(2) select,#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(3) select,#ViewModeContainer #Kamban.both .field-auto-thin#KambanValueField select{max-width:100%}#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(3){padding-top:4%}#ViewModeContainer #Kamban.both .field-auto-thin#KambanValueField{padding-top:4%}#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(5){display:block;width:100%;padding-top:4%}#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(5) .field-label{min-width:50%;margin-right:10px}#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(5) select{max-width:100%}#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(6),#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(7){width:calc(50% - 8px);padding-top:4%}#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(6) .container-normal,#ViewModeContainer #Kamban.both .field-auto-thin:nth-child(7) .container-normal{display:flex;align-items:center}#ViewModeContainer #Kamban.both #KambanBody #Grid tbody .kamban-row .kamban-container .kamban-item{display:-webkit-box;height:4vw;padding:0 16px 0 5px;overflow:hidden;white-space:pre-line;touch-action:auto;-webkit-line-clamp:1;-webkit-box-orient:vertical}}@media screen and (max-width:1024px) and (min-width:768px){#ViewModeContainer #Kamban.both #KambanBody #Grid tbody .kamban-row .kamban-container .kamban-item .ui-icon.ui-icon-pencil{top:10px;right:4px;width:16px;height:16px}}@media screen and (max-width:1024px) and (min-width:0){#ViewModeContainer #Calendar #FullCalendar.fc .fc-header-toolbar .fc-toolbar-chunk:last-child .fc-button-group{display:flex;flex-wrap:wrap;margin:0}#ViewModeContainer #Calendar #FullCalendar.fc .fc-header-toolbar .fc-toolbar-chunk:last-child .fc-button-group button:nth-child(3){border-radius:0 .25em .25em 0}#ViewModeContainer #Calendar #FullCalendar.fc .fc-header-toolbar .fc-toolbar-chunk:last-child .fc-button-group button:last-child{border-radius:.25em}}@media screen and (max-width:768px) and (min-width:0){#ViewModeContainer #Calendar #FullCalendar.fc .fc-header-toolbar .fc-toolbar-chunk:last-child .fc-button-group button:nth-child(odd){border-radius:.25em 0 0 .25em}#ViewModeContainer #Calendar #FullCalendar.fc .fc-header-toolbar .fc-toolbar-chunk:last-child .fc-button-group button:nth-child(even){border-radius:0 .25em .25em 0}}@media screen and (max-width:1024px) and (min-width:0){#RecordSwitchers{display:flex;align-items:center}#RecordSwitchers #CurrentIndex{display:flex;align-items:center;height:7.5vw}#Editor fieldset .command-left{width:100%}table.grid tbody tr td svg{margin-top:calc(3.2vw - 13px);overflow:unset}table.grid tbody tr td .user{display:flex;align-items:center}table.grid tbody tr td .user .ui-icon-person{margin-top:.15vw}}@media screen and (max-width:1024px) and (min-width:0){#Editor #RecordHeader .user{display:flex;align-items:center}#Editor #RecordHeader .user .ui-icon-person{margin-right:.6vw}#EditorTabsContainer #Users_DeptIdField .ui-icon-person{top:calc(3vw - 6.5px)}}@media screen and (max-width:1024px) and (min-width:768px){.ui-icon{margin-right:4px;transform:scale(1.6)}#Editor .ui-button-icon-space{width:1vw}#Editor #RecordHeader .user .ui-icon-person{margin:auto 4px}#EditorTabsContainer #Users_DeptIdField .ui-icon-person{top:calc(3vw - 3.5px);right:-30px}}@media screen and (max-width:1024px) and (min-width:0){#OutgoingMailDialog .field-wide{padding-bottom:5px}#OutgoingMailDialog .field-wide .field-label{width:auto}#OutgoingMailDialog .field-wide .field-control{float:none}#OutgoingMailDialog .field-wide .control-basket,#OutgoingMailDialog .field-wide .container-normal{margin-left:15vw}#OutgoingMailDialog textarea{height:20vw}}@media screen and (max-width:1024px) and (min-width:0){.show-password{top:calc(50% - 12px);right:10px}#LoginFieldSet input[type="checkbox"]{transform:scale(1.2)}#LoginFieldSet input{height:10vw}#LoginFieldSet input,#LoginFieldSet select{font-size:4vw}#Users_RememberMeField .container-normal{display:flex;align-items:center}}@media screen and (max-width:1024px) and (min-width:768px){.show-password{transform:scale(1.5)}}@media screen and (max-width:1024px) and (min-width:0){#Navigations.open{padding-top:18vw}}@media screen and (max-width:1024px) and (min-width:0){#ViewModeContainer .field-auto-thin>.field-label{padding:7px 2vw 7px 0}#CrosstabValueField .field-control{width:70%}#Crosstab .field-auto-thin p{margin-right:0%}#ViewModeContainer #Crosstab .field-auto-thin{flex:0 1 calc(100%);width:100%;padding-top:1vw}#ViewModeContainer #Crosstab .field-auto-thin .field-label{width:30%}#ViewModeContainer #Crosstab .field-auto-thin .field-control{width:70%}#ViewModeContainer #Crosstab .field-auto-thin .field-control input[type="checkbox"],#ViewModeContainer #Crosstab .field-auto-thin .field-control .field-auto-thin input[type="checkbox"]{width:4vw;height:4vw;margin-left:2px}#ViewModeContainer #Crosstab .field-control .control-dropdown{font-size:2.6vw}#CrosstabBody .grid>thead>tr:first-child>th:not(:first-child),#KambanBody .grid>thead>tr:first-child>th:not(:first-child){white-space:nowrap}}@media screen and (max-width:1024px) and (min-width:0){#ImportSettingsDialog .control-checkbox+label{margin:1.8vw 0 0 1vw}#ImportSettingsDialog .control-checkbox{margin:2vw 0 2vw 2px}#ImportSettingsDialog .control-textbox{height:7vw;line-height:6.5vw}#ImportSettingsDialog .command-center{padding:2vw 0}}@media screen and (max-width:1024px) and (min-width:0){#ExportSelectorDialog .command-center{padding:2vw 0}}@media screen and (max-width:1024px) and (min-width:0){#ViewModeContainer #Grid .control-dropdown,#ViewModeContainer #Grid .datepicker{width:25vw;text-overflow:ellipsis;white-space:nowrap}#ViewModeContainer #Grid .current-user,#ViewModeContainer #Grid .current-time{display:none}#ViewModeContainer #Grid .ui-spinner{display:flex;align-items:center;height:6vw;max-height:6vw}}@media screen and (max-width:1024px) and (min-width:0){#ViewModeContainer .both #TimeSeriesValueField,#ViewModeContainer .both #TimeSeriesChartTypeField,#ViewModeContainer .both #TimeSeriesHorizontalAxisField{width:100%}#ViewModeContainer .both #TimeSeriesValueField .field-label,#ViewModeContainer .both #TimeSeriesChartTypeField .field-label,#ViewModeContainer .both #TimeSeriesHorizontalAxisField .field-label{min-width:30%}#ViewModeContainer .both .field-auto-thin:first-child,#ViewModeContainer .both .field-auto-thin:nth-child(2){flex:0 1 calc(50% - 8px)}#ViewModeContainer .both .field-auto-thin:first-child .field-label,#ViewModeContainer .both .field-auto-thin:nth-child(2) .field-label{min-width:29%}#ViewModeContainer .both .field-auto-thin:nth-child(3) .field-label{min-width:13%}#ViewModeContainer .both .field-auto-thin select{max-width:100%}#ViewModeContainer .both .field-auto-thin>.field-control{min-width:68%}}@media screen and (max-width:1024px) and (min-width:0){#ApiEditorCommands{display:flex;justify-content:center;padding:10vw 0}}@media screen and (max-width:1024px) and (min-width:0){#Editor #TenantForm #EditorTabsContainer .fieldset .field-auto-thin{width:100%;height:7vw;margin:0}#Editor #TenantForm #EditorTabsContainer .fieldset .field-auto-thin .field-control{width:100%}#Editor #TenantForm #EditorTabsContainer .fieldset .field-auto-thin .field-control .container-normal label{padding:0}#Editor #TenantForm #EditorTabsContainer .fieldset .field-auto-thin .field-control .container-normal #TenantImage{height:auto}#Editor #TenantForm #EditorTabsContainer .fieldset .button-icon{margin-top:5vw}#Editor #TenantForm #EditorTabsContainer .fieldset #StyleField .field-textarea>.field-label,#Editor #TenantForm #EditorTabsContainer .fieldset #ScriptField .field-textarea>.field-label{width:100%;text-align:left}}@media screen and (max-width:1024px) and (min-width:0){#Versions span{margin:20px 10px 20px 0}}@media screen and (max-width:767px) and (min-width:0){#Versions{width:auto;padding:4vw 5vw 4vw 7vw;font-size:2.6vw}#Versions span{margin:0 10px 0 0}} \ No newline at end of file diff --git a/Implem.Pleasanter/wwwroot/content/styles.css b/Implem.Pleasanter/wwwroot/content/styles.css index d81767265..0eb6218ed 100644 --- a/Implem.Pleasanter/wwwroot/content/styles.css +++ b/Implem.Pleasanter/wwwroot/content/styles.css @@ -1736,9 +1736,20 @@ th.calendar-header { background-color: red; } +.nav-site .conditions span.overdue::before { + content: "("; +} + +.nav-site .conditions span.overdue::after { + content: ")"; +} + .nav-site .conditions span.elapsed-time.old { color: silver; } +.nav-site .conditions span.reference { + display: none; +} .error-page { padding: 30px 50px; diff --git a/Implem.Pleasanter/wwwroot/content/styles.min.css b/Implem.Pleasanter/wwwroot/content/styles.min.css index d84c40a05..dabca0104 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;font-weight:normal;font-style:normal;vertical-align:baseline;border:0}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-spacing:0;border-collapse:collapse}caption,th{text-align:left}td p{font-weight:inherit}a:focus{outline:none}.cf:before,.cf:after{display:table;content:" "}.cf:after{clear:both}.cf{*zoom:1}.both{clear:both}img{width:auto;max-width:100%;height: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{margin:0;-webkit-appearance:none}input[type="number"]{-moz-appearance:textfield}body{clear:both;min-width:1200px;font-family:Hiragino Kaku Gothic Pro,"Meiryo UI",sans-serif;font-size:.75em}h1{clear:both}h2{clear:both}h3{clear:both}legend{cursor:pointer}legend>*{display:block;float:left}label{position:relative;z-index:2;cursor:pointer}input{position:relative;z-index:2;background-color:#fff}select{position:relative;z-index:2}table{clear:both;width:100%;border-collapse:collapse;border:0}td{padding:3px;color:#000;vertical-align:top}td.right-align>p{float:right}pre{font-family:Terminal,Hiragino Kaku Gothic Pro;line-height:1.5em;white-space:pre-wrap;word-break:break-all;word-wrap:break-word}#Logo{padding:3px 0}#CorpLogo{display:block;float:left;margin:3px 0 0 0}#ProductLogo{display:block;float:left;padding:0 0 0 5px;color:#696969;font-size:26px;font-weight:bold;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{clear:both;text-align:right}#AuthenticationByMail{float:left;padding:0 0 10px 50px}#TotpQRCode{width:38%;height:160px;margin-right:auto;margin-left:auto}#TotpQRCodeText{margin-right:auto;margin-left:auto}#qrCodeText{font-size:1.3em}.annonymous .close-announcement{display:none}#TotpAuthenticationCodeSeparate{display:flex;width:150px;padding:0 0 10px 40px}#TotpAuthenticationCodeSeparate>.field-normal>.field-control{margin-left:unset}#TotpAuthenticationCodeSeparate>.field-normal>.field-control>.container-normal{margin-left:10px}.totp-authentication-code{width:25px;height:25px;font-size:125%;text-align:center;border:none;border-bottom:2px solid #000;outline:none}.totp-form{visibility:hidden}#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{position:relative;display:block;float:left;clear:both;width:100%;margin:0 0 5px 0;padding:5px 10px;background:#fafad2;border:solid 1px #c0c0c0;border-radius:5px}#Guide>.with-icon-close{padding:10px 5px 10px}#Guide>div>#ReduceGuides{float:left;padding-right:5px;cursor:pointer}#Guide>#ExpandGuides{padding:10px 5px 10px;font-weight:bold;cursor:pointer}#Guide .markup{overflow:hidden}#CopyToClipboards>.display-control{float:left;cursor:pointer}#Header{position:relative;z-index:99;float:left;clear:both;width:100%;padding:0 6px;border:none}.theme-version-1_0 #Navigations,#NavigationsUpperRight{top:0;right:5px;float:right;height:30px;margin:0 0 5px 0;padding:0 5px 0 15px;border:none;border-radius:20px 0 0 20px}#NavigationMenu{float:left;margin-right:5px}#NavigationMenu>li{position:relative;display:block;float:left;width:158px;height:30px}#NavigationMenu>li>div{height:30px;line-height:30px;text-align:center;cursor:pointer}#NavigationMenu>li>div>a{display:block;height:30px;text-decoration:none}#NavigationMenu .menu{position:absolute;top:30px;right:0;z-index:4;display:none;width:158px;border-top:none !important;border-radius:0 0 5px 5px}#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{display:block;float:left;width:100%;margin:0 10px 5px 0;padding:5px 10px;color:#fff;background-color:#00f;border-radius:7px}#SwitchUserInfo>a{display:block;float:left;width:100%;color:#fff;text-decoration:none}#ExcessLicenseWarning{display:block;float:left;width:100%;margin:0 10px 5px 0;padding:5px 10px;color:#fff;background:#f00;border-radius:7px}#PublishWarning{display:block;float:left;width:100%;margin:0 10px 5px 0;padding:5px 10px;background:#f00;border-radius:7px}#PublishWarning>a{display:block;float:left;width:100%;color:#fff;text-decoration:none}#LockedWarning{display:block;float:left;width:100%;margin:0 10px 5px 0;padding:5px 10px;background:#f00;border-radius:7px}#LockedWarning>div{display:block;float:left;width:100%;color:#fff;text-decoration:none}#Application{position:relative;float:left;clear:both;width:100%;margin:10px 0 0 0;padding:0 10px 120px 10px}#Application>.site-image-icon{display:block;float:left;margin:0 10px 0 0}#StartGuide{position:relative;display:block;float:left;width:100%;margin:0 0 10px 0;padding:50px 0 0 0;background-color:#f5f5f5;border-radius:10px}#StartGuide>#StartGuideContents{width:900px;margin:0 auto}#StartGuide>#StartGuideContents>a{display:block;float:left;width:150px;margin:0 37px;padding:5px;text-align:center;border-radius:5px}#StartGuide>#StartGuideContents>a:hover{background-color:#fff}#StartGuide>#StartGuideContents>a>*{display:block;clear:both;text-align:center}#StartGuide>#StartGuideContents>a>img{width:50px;margin:5px 50px}#StartGuide>#DisableStartGuideField{display:block;float:left;clear:both;margin:50px 0 0 20px}#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{color:#d2691e;font-size:20px;font-weight:bold}#Notes>*{float:left;width:100%;margin:0 10px 5px 0}#Notes>.history{display:block;float:left;width:100%;padding:5px 10px;color:#fff;background-color:#00f;border-radius:7px}#Notes>.readonly{display:block;float:left;width:100%;padding:5px 10px;color:#fff;background-color:#ffa500;border-radius:7px}#ViewSelectorField{position:absolute;top:-10px;right:0}#ViewFilters{float:left;width:100%;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{float:left;height:32px;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{float:left;width:100%;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{display:block;float:left;height:26px;margin:2px 5px 0 0;padding:5px 10px;background:#dcdcdc;border-radius:5px}#Aggregations .label.overdue{color:#fff;font-weight:bold;cursor:pointer;background-color:#f00}#Aggregations .data{display:block;float:left;height:26px;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}div.Calendar>.CalendarBody>.grid>thead>tr>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{z-index:20;border:solid 2px #00f}.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{position:relative;top:-1px;left:-30px;width:30px;height:25px;background-color:#fafad2;border-top:solid 1px #c0c0c0;border-bottom:solid 1px #c0c0c0}.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{position:absolute;z-index:2;padding:5px 0;overflow:hidden;white-space:nowrap}.CalendarBody .item .title.sub{display:none}.CalendarBody .item .title>span:not(.ui-icon){margin-right:3px}.CalendarBody .dragging{z-index:50;height:25px;padding:5px;background-color:#fafad2;border-radius:3px}.CalendarBody .dummy{height:25px;margin:5px 0 0 0}.fc .fc-scrollgrid-section-sticky>*{z-index:2}#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{position:sticky;bottom:75px;left:0;width:calc(100% + 20px);height:50px;margin-top:-25px;margin-left:-10px;background-color:rgba(255,255,255,.5)}#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{cursor:pointer;background-color:#f5f5f5}#BurnDownDetails>tbody>tr>td{padding:6px}#BurnDownDetails>tbody>tr>td.warning{color:#f00;font-weight:bold}#BurnDownDetails>tbody>tr>td.difference{color:#00f;font-size:1.3em;font-weight:bold;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{background-color:#fff}.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{position:relative;margin:3px;padding:4px 16px 4px 5px;overflow:hidden;cursor:pointer;background-color:#fafad2;border:solid 1px #c0c0c0;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}.kambanbody .dragging{z-index:50;padding:5px;background-color:#fafad2;border-radius:3px}.dashboard-kamban-header{position:sticky;top:-20px;z-index:1}.dashboard-kamban-header>th{overflow-x:hidden}#ImageLib .item{position:relative;float:left;width:250px;height:250px;margin:10px 10px 0 0;padding:10px;overflow:hidden;border:solid 1px #c0c0c0}#ImageLib .item .image{float:left;width:100%;margin:5px 0 0 0}#ImageLib .item .delete-image{position:absolute;right:5px;bottom:5px;float:left}#RecordHeader{float:left;width:100%;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{display:block;float:left;height:26px;margin:0 1px 0 0;padding:5px;border-radius:5px}#TemplateTabsContainer{float:left;width:100%}#Editor{float:left;clear:both;width:100%}#EditorTabsContainer{float:left;width:73%;margin:0 0 20px 0}#EditorTabsContainer.max{width:100%}#MailEditorTabsContainer{float:left;width:100%;margin:0 0 20px 0;border:none}#EditorComments{float:right;width:27%;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{float:left;width:73%}#OutgoingMailsForm>.item{position:relative;float:left;width:100%;border-radius:10px}#OutgoingMailsForm .content{float:left;width:100%;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{clear:both;margin:0 20px 10px 20px}#StatusControlTabsContainer{clear:both;margin:0 20px 10px 20px}#StatusControlColumnHash .column-control-types{margin:0 0 0 10px}#ViewTabsContainer{clear:both;margin:0 20px 10px 20px}#ExportTabsContainer{clear:both;margin:0 20px 10px 20px}#EditorDetailTabsContainer{clear:both;margin:0 20px 10px 20px}#ColumnAccessControlTabsContainer{clear:both;margin:0 20px 10px 20px}#SearchResults{float:left;width:80%;margin:0 100px}#SearchResults .count{float:left;margin:0 0 10px 0}#SearchResults .count .label{display:block;float:left;height:26px;margin:0 5px 5px 0;padding:5px 10px;background:#dcdcdc;border-radius:5px}#SearchResults .count .data{display:block;float:left;height:26px;margin:0 5px 5px 0;padding:5px}#SearchResults .result{float:left;clear:both;width:100%;padding:15px;border:solid 1px #fff}#SearchResults .result>ul{display:block;float:left;clear:both}#SearchResults .result>h3{display:block;float:left;clear:both;margin:5px 0}#SearchResults .result>h3>a{font-size:1.3em;font-weight:bold}#SearchResults .result>h3>a>span{font-weight:bold}#SearchResults .result>p{display:block;float:left;clear:both}#SearchResults .result:hover{cursor:pointer;border:solid 1px #ffa500}.highlight{background:#ff0}#MainCommandsContainer{position:fixed;bottom:30px;left:0;z-index:90;width:100%;height:47px;padding:7px 0 0 0;background-color:rgba(0,0,0,.65)}#MainCommands{text-align:center}#MainCommands>button{display:inline;float:none;margin:2px 4px}#ApiEditorCommands{padding:0 5px 200px 140px}#ApiEditorCommands>*{margin-right:10px}#BottomMargin{clear:both;height:100px}#Video{display:block;float:left;width:640px;height:480px;margin:0 16px}#Canvas{display:none}#Footer{position:fixed;bottom:0;left:0;z-index:90;display:block;width:100%;height:30px;padding:5px 10px;text-align:right;background-color:#000}#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}#SummaryForm .field-normal[style="display: none;"]+#SummarySetZeroWhenOutOfConditionField{display:none !important}.template{display:block;float:left;width:100%}.template-selectable{display:block;float:left;width:340px}.template-viewer-container{display:block;float:right;width:100%;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{clear:both;margin:0 -10px}.nav-site{position:relative;top:0;left:0;float:left;width:220px;height:70px;margin:10px;border-radius:5px}.nav-site .heading{position:absolute;top:-10px;left:5px;width:50px;height:9px;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{position:absolute;top:1px;left:1px;width:220px;height:70px;border-right:solid 1px #c0c0c0;border-bottom:solid 1px #c0c0c0;border-radius:5px}.nav-site .stacking2{position:absolute;top:4px;left:4px;width:220px;height:70px;border-right:solid 1px #c0c0c0;border-bottom:solid 1px #c0c0c0;border-radius:5px}.nav-site a{display:block;width:100%;height:100%;padding:10px 3px 3px 10px;overflow:hidden;text-decoration:none;word-wrap:break-word}.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{position:absolute;right:1px;bottom:1px;color:#000;font-size:.75em}.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;color:#f00;font-weight:bold;border-bottom:dotted 1px #f00}.error-page-message{margin:15px 0 0 0;padding:5px 20px;color:#fff;font-weight:bold;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{min-inline-size:0}.fieldset.enclosed{clear:both;margin:0 0 10px 0;padding:10px;border:solid 1px #c0c0c0}.fieldset.enclosed-half{float:left;width:380px;margin:0 0 10px 0;padding:10px;border:solid 1px #c0c0c0}.fieldset.enclosed-thin{clear:both;margin:0 0 10px 0;padding:5px 5px 5px 10px;border:solid 1px #c0c0c0}.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{clear:both;padding:10px 5px 5px 136px;text-align:center}.command-field>button{display:block;float:left;margin:2px 4px}.command-center{clear:both;padding:5px 5px 5px 5px;text-align:center}.command-center>button{display:inline;float:none;margin:2px 4px}.command-left{float:left;clear:both;padding:5px 5px 5px 5px}.command-left>*{display:block;float:left}.command-left>button{margin:2px 4px}.command-left>.ui-icon{margin:7px 3px 0 15px}.command-right{clear:both;padding:5px 5px 5px 5px;text-align:right}.command-right>button{display:inline;float:none;margin:2px 4px}.field-normal{float:left;width:340px;height:45px;padding:0 20px 10px 0}.field-normal>.field-label{float:left;width:120px;margin-right:-120px;padding:7px 7px 7px 0;text-align:right}.field-normal>.field-control{float:right;width:100%}: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{float:left;clear:both;width:100%;min-height:45px;padding:0 10px 10px 0}.field-wide>.field-label{float:left;width:120px;margin-right:-120px;padding:7px 7px 7px 0;text-align:right}.field-wide>.field-control{float:right;width:100%}:not(td)>div.field-wide .container-normal{margin-left:120px}.field-markdown{float:left;clear:both;width:100%;min-height:45px;padding:0 10px 10px 0}.field-markdown>.field-label{float:left;width:120px;margin-right:-120px;padding:7px 7px 7px 0;text-align:right}.field-markdown>.field-control{float:right;width:100%}:not(td)>div.field-markdown .container-normal{margin-left:120px}.field-textarea{float:left;clear:both;width:100%;min-height:45px;padding:0 10px 10px 0}.field-textarea>.field-label{float:left;width:120px;margin-right:-120px;padding:7px 7px 7px 0;text-align:right}.field-textarea>.field-control{float:right;width:100%}:not(td)>div.field-textarea .container-normal{margin-left:120px}.field-auto{display:flex;float:left;width:auto;height:45px;margin-right:35px;padding:0 10px 10px 0}.field-auto>.field-label{float:left;width:120px;padding:7px 7px 7px 0;text-align:right}.field-auto>.field-control{flex:1;float:left;width:auto}.field-auto-thin{float:left;width:auto;height:45px;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{float:left;width:auto}.field-auto-thin select{max-width:120px}.field-vertical{float:left;width:330px;height:100%;padding:0 20px 20px 0}.field-vertical>.field-label{float:left;width:100%;margin-right:-120px;padding:5px 10px;text-align:center}.field-vertical>.field-control{float:left;clear:both;width:100%}.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{display:block;float:left;clear:both;width:100%;margin:15px;padding:2px 5px;font-weight:bold;border-bottom:solid 1px #c0c0c0}.container-normal{position:relative}.container-left{position:relative;float:left;width:340px;margin-right:-340px;padding:0 0 15px 0}.container-right{position:relative;float:right;width:100%}.container-right>*{display:block;margin-left:340px}.control-text{display:block;width:100%;min-height:30px;padding:6px 4px 2px 4px;overflow:hidden;color:#000;background:#f5f5f5;border:solid 1px #c0c0c0;border-radius:5px}.control-textbox{width:100%;height:30px;padding:4px;border:solid 1px #c0c0c0;border-radius:5px}.control-textbox.with-unit{display:block;float:left;width:70%}.control-textbox.anchor{z-index:0;width:100%;height:30px;padding:4px;border:solid 1px #c0c0c0;border-radius:5px}.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{position:absolute;top:50px;height:22px}.control-attachments-upload{display:block;float:left;width:100%;padding:25px 0;text-align:center;border:dotted 2px #d19405;border-radius:3px}.control-attachments-items{display:block;float:left;width:100%}.control-attachments-item{display:block;float:left;width:100%;margin:5px 0 0 0;padding:5px 10px;text-align:left;border:solid 1px #d19405;border-radius:5px}.progress-bar{display:block;float:left;width:100%;height:30px;margin:5px 0 0 0;overflow:hidden;vertical-align:top;border:solid 1px #d19405;border-radius:5px}.progress-bar>div{width:0;height:100%;color:#fff;line-height:22px;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{float:left;width:100%;min-height:100px;padding:4px 25px 4px 6px;color:#000;background:#f5f5f5;border:solid 1px #c0c0c0;border-radius:5px}.md{float:left;width:100%;font-family:Terminal,Hiragino Kaku Gothic Pro;line-height:1.5em;word-break:break-all;word-wrap:break-word}.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{clear:both;margin:0 0 10px 0}.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}.md li p{float:none}.control-markdown{display:none;width:100%;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{display:block;float:left;width:auto;height:22px;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{float:left;width:30px;margin:8px 0 0 12px}.control-slider-ui{float:left;width:140px;margin:11px 0 0 5px}.container-selectable .wrapper{display:block;float:left;width:100%;min-height:300px;overflow:auto;background-color:#f5f5f5;border:solid 1px #c0c0c0;border-radius:5px}.control-selectable{display:block;float:left;width:100%;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{z-index:2;display:block;float:left}.comment{position:relative;display:block;float:left;clear:both;width:100%;margin:0 0 5px 0;padding:5px 10px 10px 20px;background:#fafad2;border:solid 1px #c0c0c0}.comment>*{display:block;float:left}.comment>.time{float:left;margin:0 0 8px -10px;margin-right:10px}.comment>.body{clear:both;width:100%}.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{display:none;width:100%}.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}.center-align{text-align:center;text-align-last:center}.tooltip{position:absolute;display:none}.no-border{border:none}.grid-wrap{clear:both}.grid{margin:0 0 10px 0}.grid.fixed{table-layout:fixed}.grid>thead{position:sticky;top:-1px;z-index:3}.grid>thead>tr>caption{margin:0 0 5px 0}.grid>thead>tr>th{padding:6px;vertical-align:middle;word-wrap:break-word;border-top:solid 1px transparent;border-right:solid 1px #fff;border-bottom:solid 1px transparent;border-left:solid 1px transparent}.grid>thead>tr>th>div{z-index:2;float:left;width:100%;text-align:center}.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;word-wrap:break-word;border-right:dotted 1px #c0c0c0;border-left:dotted 1px #c0c0c0}.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;font-weight:normal;vertical-align:middle;word-wrap:break-word;background-color:#dcdcdc;border-top:solid 1px #fff;border-right:solid 1px transparent;border-bottom:solid 1px #fff;border-left:solid 1px transparent}.grid-row{background-color:#fff;border-bottom:solid 1px #c0c0c0}.grid-row td{overflow:hidden}.grid-row .comment{clear:both;min-width:200px;max-height:100px;margin:0 0 3px 0;padding:3px 6px 3px 15px;overflow:hidden;background:#fafad2;border:solid 1px #fff}.grid-row .comment.one-third{max-height:306px}.grid-row .comment.half{max-height:151px}.grid:not(.not-link) .grid-row:hover{cursor:pointer;background-color:#f5f5f5}.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{clear:both;min-width:200px;max-height:306px;margin:0 0 3px 0;padding:3px 6px;overflow:hidden;background:inherit;border:solid 1px transparent}.grid-title-body>.body{width:100%}.grid-title-body>.title+.body{padding:8px 0 0 10px}.dashboard-grid-header{position:sticky;top:-20px;z-index:3}.links{padding:0 10px}#Links>.fieldset>div .grid{width:max-content;min-width:100%}#Links>.fieldset>div .grid-wrap{margin-bottom:10px;overflow:auto}.link-creations button{display:block;float:left;margin:0 10px 0 0}.text{display:block;float:left;width:250px;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{position:fixed;bottom:78px;left:0;z-index:90;width:100%;text-align:center}.message .body{position:relative;margin-bottom:4px;border-radius:20px}.message .close{position:absolute;top:11px;right:8px;cursor:pointer;background-color:#fff;border-radius:10px}.message-dialog{display:block;float:left;width:100%;margin:0 auto;text-align:center}.message-form-bottom{width:600px;margin:0 auto;text-align:center}.alert-error{display:block;min-height:32px;padding:5px;color:#fff;background-color:rgba(255,0,0,.9);border:solid 1px #f00}.alert-success{display:block;min-height:32px;padding:5px;color:#fff;background-color:rgba(0,128,0,.9);border:solid 1px #008000}.alert-warning{display:block;min-height:32px;padding:5px;color:#000;background-color:#ff0;border:solid 1px #ff0}.alert-information{display:block;min-height:32px;padding:5px;color:#fff;background-color:#00f;border:solid 1px #00f}label.error{top:-5px;left:0;z-index:2;display:block;float:left;width:100%;padding:0 5px;color:#f00;background-color:#fff;border-top:none;border-radius:0 0 5px 5px/0 0 5px 5px}.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{position:absolute;top:25px;width:70%}.button-edit-markdown{position:absolute;top:5px;right:5px;z-index:1;cursor:pointer}.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}.show-password{position:absolute;top:4px;right:-27px;z-index:10;cursor:pointer}#passwordGenerateicon{position:absolute;top:4px;right:-60px;z-index:10;cursor:pointer}input[type="password"]::-ms-reveal{display:none}.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{font-family:Terminal,Hiragino Kaku Gothic Pro;line-height:1.5em}.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;max-height:46px;background:#fff}.ui-widget.ui-state-default.ui-multiselect{display:flex;align-items:center;justify-content:space-between;height:30px;overflow:hidden;background:#fff;border:solid 1px #c0c0c0;border-radius:5px}.field-wide .ui-widget.ui-state-default.ui-multiselect{height:auto;min-height:30px}.ui-widget.ui-state-default.ui-multiselect .ui-multiselect-open{display:block;order:2}.ui-widget.ui-state-default.ui-multiselect .ui-multiselect-open+span{display:block;overflow:hidden;text-overflow:ellipsis;order:1}.field-normal .ui-widget.ui-state-default.ui-multiselect .ui-multiselect-open+span{white-space:nowrap}.field-wide .ui-widget.ui-state-default.ui-multiselect .ui-multiselect-open+span{display:-webkit-box;max-height:4.7em;-webkit-box-orient:vertical;-webkit-line-clamp:3}.ui-multiselect-menu{width:auto !important;min-width:225px;max-width:450px}.ui-multiselect-checkboxes{min-height:300px}.ui-multiselect-checkboxes label{white-space:nowrap}.ui-multiselect-checkboxes input{margin:0 5px}.ui-corner-all.ui-state-hover{border-radius:2px}.ui-icon-white{background-image:url(../styles/plugins/images/ui-icons_ffffff_256x240.png)}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{position:absolute;z-index:10;border-right:solid 1px #fff;border-left:solid 1px #fff}.menu-negative>li{display:block;float:left;clear:both;width:100%;cursor:pointer;border-top:dotted 1px #fff}.menu-sort{position:absolute;z-index:10;border-right:solid 1px #fff;border-left:solid 1px #fff;border-radius:0 0 10px 10px/0 0 10px 10px}.menu-sort>li{display:block;float:left;clear:both;width:100%;cursor:pointer;border-top:dotted 1px #fff}.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;z-index:10;cursor:pointer}.current-user{position:absolute;top:9px;right:-17px;z-index:10;cursor:pointer}.current-dept{position:absolute;top:9px;right:-17px;z-index:10;cursor:pointer}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{position:fixed;right:8px;bottom:280px;z-index:3;width:238px}#SupportBanner{position:fixed;right:8px;bottom:180px;z-index:3;width:238px}#CasesBanner{position:fixed;right:8px;bottom:80px;z-index:3;width:238px}.annonymous .close-announcement{display:none}.grid-stack{margin:10px;background-color:#fff}.grid-stack-item-content{background-color:#f5f5f5}.dashboard-timeline-container{display:flex;flex-direction:column;gap:4px}.dashboard-timeline-item{margin:4px;padding:8px;cursor:pointer;background-color:#fff;border-radius:4px;box-shadow:0 2px 4px rgba(0,0,0,.2);transition:background-color .3s}.dashboard-timeline-item:hover{background-color:#ebebeb}.dashboard-timeline-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:4px}.dashboard-timeline-header a{min-width:40px;overflow:hidden;color:#007bff;font-weight:bold;text-overflow:ellipsis;white-space:nowrap}.dashboard-timeline-header-closed{max-height:0;margin-bottom:0;overflow:hidden}.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{display:flex;margin-left:3px;color:#777;font-size:.8em;font-weight:bold;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{color:#333;font-size:1.2em;font-weight:bold}.dashboard-timeline-body{margin-top:8px;color:#555;line-height:1.5}.dashboard-timeline-body-closed{max-height:0;margin-top:0;overflow:hidden}.dashboard-timeline-item:hover .dashboard-timeline-body-closed{max-height:300px;margin-top:8px;overflow:auto;transition:max-height .5s linear 1s,margin-top 0s;transition-delay:1s}.grid-stack-item-content{display:flex;flex-direction:column;padding:16px;background-color:#f2f2f2;border-radius:5px;box-shadow:0 2px 4px rgba(0,0,0,.1)}.grid-stack>.grid-stack-item>.grid-stack-item-content{overflow-x:auto}.dashboard-part-title{margin-bottom:10px;color:#333;font-size:1.2em;font-weight:bold}.dashboard-part-nav{margin-top:10px}.dashboard-part-nav-menu{display:flex;flex-wrap:wrap;margin:0;padding:0;list-style:none}.dashboard-part-nav-menu>.dashboard-part-nav-item{min-width:120px;max-width:200px;margin-left:10px;padding:4px;overflow:hidden;white-space:nowrap;box-shadow:0 2px 4px rgba(0,0,0,.2)}.dashboard-part-nav-menu-vartical{display:flex;flex-direction:column;margin:0;padding:0;list-style:none}.dashboard-part-nav-item{display:flex;margin-bottom:8px;padding:4px;color:#333;background-color:#fff;border-radius:4px;box-shadow:0 2px 4px rgba(0,0,0,.2)}.dashboard-part-nav-item:hover{background-color:#ddd}.dashboard-part-nav-link{width:100%;padding:4px;color:inherit;text-decoration:none}.dashboard-part-refresh{position:absolute;top:8px;left:8px;z-index:5;padding-top:0;padding-left:0;color:#636363;background-color:transparent;border:none;opacity:0}@keyframes custom-spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}.dashboard-part-road{position:absolute;top:calc(50% - 25px);left:calc(50% - 25px);display:inline-block;color:#636363;font-size:50px;animation:custom-spin 1s linear infinite}#AnalyPartTimePeriodValueField{width:230px}#AnalyPartTimePeriodField{width:110px}#AnalyPartTimePeriodField .field-label{display:none}#AnalyPartTimePeriodField div.container-normal{margin-left:0}.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%}div.lower-search-ui{margin:4px 0 0 0} \ 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;font-weight:normal;font-style:normal;vertical-align:baseline;border:0}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-spacing:0;border-collapse:collapse}caption,th{text-align:left}td p{font-weight:inherit}a:focus{outline:none}.cf:before,.cf:after{display:table;content:" "}.cf:after{clear:both}.cf{*zoom:1}.both{clear:both}img{width:auto;max-width:100%;height: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{margin:0;-webkit-appearance:none}input[type="number"]{-moz-appearance:textfield}body{clear:both;min-width:1200px;font-family:Hiragino Kaku Gothic Pro,"Meiryo UI",sans-serif;font-size:.75em}h1{clear:both}h2{clear:both}h3{clear:both}legend{cursor:pointer}legend>*{display:block;float:left}label{position:relative;z-index:2;cursor:pointer}input{position:relative;z-index:2;background-color:#fff}select{position:relative;z-index:2}table{clear:both;width:100%;border-collapse:collapse;border:0}td{padding:3px;color:#000;vertical-align:top}td.right-align>p{float:right}pre{font-family:Terminal,Hiragino Kaku Gothic Pro;line-height:1.5em;white-space:pre-wrap;word-break:break-all;word-wrap:break-word}#Logo{padding:3px 0}#CorpLogo{display:block;float:left;margin:3px 0 0 0}#ProductLogo{display:block;float:left;padding:0 0 0 5px;color:#696969;font-size:26px;font-weight:bold;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{clear:both;text-align:right}#AuthenticationByMail{float:left;padding:0 0 10px 50px}#TotpQRCode{width:38%;height:160px;margin-right:auto;margin-left:auto}#TotpQRCodeText{margin-right:auto;margin-left:auto}#qrCodeText{font-size:1.3em}.annonymous .close-announcement{display:none}#TotpAuthenticationCodeSeparate{display:flex;width:150px;padding:0 0 10px 40px}#TotpAuthenticationCodeSeparate>.field-normal>.field-control{margin-left:unset}#TotpAuthenticationCodeSeparate>.field-normal>.field-control>.container-normal{margin-left:10px}.totp-authentication-code{width:25px;height:25px;font-size:125%;text-align:center;border:none;border-bottom:2px solid #000;outline:none}.totp-form{visibility:hidden}#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{position:relative;display:block;float:left;clear:both;width:100%;margin:0 0 5px 0;padding:5px 10px;background:#fafad2;border:solid 1px #c0c0c0;border-radius:5px}#Guide>.with-icon-close{padding:10px 5px 10px}#Guide>div>#ReduceGuides{float:left;padding-right:5px;cursor:pointer}#Guide>#ExpandGuides{padding:10px 5px 10px;font-weight:bold;cursor:pointer}#Guide .markup{overflow:hidden}#CopyToClipboards>.display-control{float:left;cursor:pointer}#Header{position:relative;z-index:99;float:left;clear:both;width:100%;padding:0 6px;border:none}.theme-version-1_0 #Navigations,#NavigationsUpperRight{top:0;right:5px;float:right;height:30px;margin:0 0 5px 0;padding:0 5px 0 15px;border:none;border-radius:20px 0 0 20px}#NavigationMenu{float:left;margin-right:5px}#NavigationMenu>li{position:relative;display:block;float:left;width:158px;height:30px}#NavigationMenu>li>div{height:30px;line-height:30px;text-align:center;cursor:pointer}#NavigationMenu>li>div>a{display:block;height:30px;text-decoration:none}#NavigationMenu .menu{position:absolute;top:30px;right:0;z-index:4;display:none;width:158px;border-top:none !important;border-radius:0 0 5px 5px}#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{display:block;float:left;width:100%;margin:0 10px 5px 0;padding:5px 10px;color:#fff;background-color:#00f;border-radius:7px}#SwitchUserInfo>a{display:block;float:left;width:100%;color:#fff;text-decoration:none}#ExcessLicenseWarning{display:block;float:left;width:100%;margin:0 10px 5px 0;padding:5px 10px;color:#fff;background:#f00;border-radius:7px}#PublishWarning{display:block;float:left;width:100%;margin:0 10px 5px 0;padding:5px 10px;background:#f00;border-radius:7px}#PublishWarning>a{display:block;float:left;width:100%;color:#fff;text-decoration:none}#LockedWarning{display:block;float:left;width:100%;margin:0 10px 5px 0;padding:5px 10px;background:#f00;border-radius:7px}#LockedWarning>div{display:block;float:left;width:100%;color:#fff;text-decoration:none}#Application{position:relative;float:left;clear:both;width:100%;margin:10px 0 0 0;padding:0 10px 120px 10px}#Application>.site-image-icon{display:block;float:left;margin:0 10px 0 0}#StartGuide{position:relative;display:block;float:left;width:100%;margin:0 0 10px 0;padding:50px 0 0 0;background-color:#f5f5f5;border-radius:10px}#StartGuide>#StartGuideContents{width:900px;margin:0 auto}#StartGuide>#StartGuideContents>a{display:block;float:left;width:150px;margin:0 37px;padding:5px;text-align:center;border-radius:5px}#StartGuide>#StartGuideContents>a:hover{background-color:#fff}#StartGuide>#StartGuideContents>a>*{display:block;clear:both;text-align:center}#StartGuide>#StartGuideContents>a>img{width:50px;margin:5px 50px}#StartGuide>#DisableStartGuideField{display:block;float:left;clear:both;margin:50px 0 0 20px}#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{color:#d2691e;font-size:20px;font-weight:bold}#Notes>*{float:left;width:100%;margin:0 10px 5px 0}#Notes>.history{display:block;float:left;width:100%;padding:5px 10px;color:#fff;background-color:#00f;border-radius:7px}#Notes>.readonly{display:block;float:left;width:100%;padding:5px 10px;color:#fff;background-color:#ffa500;border-radius:7px}#ViewSelectorField{position:absolute;top:-10px;right:0}#ViewFilters{float:left;width:100%;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{float:left;height:32px;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{float:left;width:100%;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{display:block;float:left;height:26px;margin:2px 5px 0 0;padding:5px 10px;background:#dcdcdc;border-radius:5px}#Aggregations .label.overdue{color:#fff;font-weight:bold;cursor:pointer;background-color:#f00}#Aggregations .data{display:block;float:left;height:26px;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}div.Calendar>.CalendarBody>.grid>thead>tr>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{z-index:20;border:solid 2px #00f}.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{position:relative;top:-1px;left:-30px;width:30px;height:25px;background-color:#fafad2;border-top:solid 1px #c0c0c0;border-bottom:solid 1px #c0c0c0}.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{position:absolute;z-index:2;padding:5px 0;overflow:hidden;white-space:nowrap}.CalendarBody .item .title.sub{display:none}.CalendarBody .item .title>span:not(.ui-icon){margin-right:3px}.CalendarBody .dragging{z-index:50;height:25px;padding:5px;background-color:#fafad2;border-radius:3px}.CalendarBody .dummy{height:25px;margin:5px 0 0 0}.fc .fc-scrollgrid-section-sticky>*{z-index:2}#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{position:sticky;bottom:75px;left:0;width:calc(100% + 20px);height:50px;margin-top:-25px;margin-left:-10px;background-color:rgba(255,255,255,.5)}#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{cursor:pointer;background-color:#f5f5f5}#BurnDownDetails>tbody>tr>td{padding:6px}#BurnDownDetails>tbody>tr>td.warning{color:#f00;font-weight:bold}#BurnDownDetails>tbody>tr>td.difference{color:#00f;font-size:1.3em;font-weight:bold;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{background-color:#fff}.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{position:relative;margin:3px;padding:4px 16px 4px 5px;overflow:hidden;cursor:pointer;background-color:#fafad2;border:solid 1px #c0c0c0;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}.kambanbody .dragging{z-index:50;padding:5px;background-color:#fafad2;border-radius:3px}.dashboard-kamban-header{position:sticky;top:-20px;z-index:1}.dashboard-kamban-header>th{overflow-x:hidden}#ImageLib .item{position:relative;float:left;width:250px;height:250px;margin:10px 10px 0 0;padding:10px;overflow:hidden;border:solid 1px #c0c0c0}#ImageLib .item .image{float:left;width:100%;margin:5px 0 0 0}#ImageLib .item .delete-image{position:absolute;right:5px;bottom:5px;float:left}#RecordHeader{float:left;width:100%;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{display:block;float:left;height:26px;margin:0 1px 0 0;padding:5px;border-radius:5px}#TemplateTabsContainer{float:left;width:100%}#Editor{float:left;clear:both;width:100%}#EditorTabsContainer{float:left;width:73%;margin:0 0 20px 0}#EditorTabsContainer.max{width:100%}#MailEditorTabsContainer{float:left;width:100%;margin:0 0 20px 0;border:none}#EditorComments{float:right;width:27%;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{float:left;width:73%}#OutgoingMailsForm>.item{position:relative;float:left;width:100%;border-radius:10px}#OutgoingMailsForm .content{float:left;width:100%;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{clear:both;margin:0 20px 10px 20px}#StatusControlTabsContainer{clear:both;margin:0 20px 10px 20px}#StatusControlColumnHash .column-control-types{margin:0 0 0 10px}#ViewTabsContainer{clear:both;margin:0 20px 10px 20px}#ExportTabsContainer{clear:both;margin:0 20px 10px 20px}#EditorDetailTabsContainer{clear:both;margin:0 20px 10px 20px}#ColumnAccessControlTabsContainer{clear:both;margin:0 20px 10px 20px}#SearchResults{float:left;width:80%;margin:0 100px}#SearchResults .count{float:left;margin:0 0 10px 0}#SearchResults .count .label{display:block;float:left;height:26px;margin:0 5px 5px 0;padding:5px 10px;background:#dcdcdc;border-radius:5px}#SearchResults .count .data{display:block;float:left;height:26px;margin:0 5px 5px 0;padding:5px}#SearchResults .result{float:left;clear:both;width:100%;padding:15px;border:solid 1px #fff}#SearchResults .result>ul{display:block;float:left;clear:both}#SearchResults .result>h3{display:block;float:left;clear:both;margin:5px 0}#SearchResults .result>h3>a{font-size:1.3em;font-weight:bold}#SearchResults .result>h3>a>span{font-weight:bold}#SearchResults .result>p{display:block;float:left;clear:both}#SearchResults .result:hover{cursor:pointer;border:solid 1px #ffa500}.highlight{background:#ff0}#MainCommandsContainer{position:fixed;bottom:30px;left:0;z-index:90;width:100%;height:47px;padding:7px 0 0 0;background-color:rgba(0,0,0,.65)}#MainCommands{text-align:center}#MainCommands>button{display:inline;float:none;margin:2px 4px}#ApiEditorCommands{padding:0 5px 200px 140px}#ApiEditorCommands>*{margin-right:10px}#BottomMargin{clear:both;height:100px}#Video{display:block;float:left;width:640px;height:480px;margin:0 16px}#Canvas{display:none}#Footer{position:fixed;bottom:0;left:0;z-index:90;display:block;width:100%;height:30px;padding:5px 10px;text-align:right;background-color:#000}#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}#SummaryForm .field-normal[style="display: none;"]+#SummarySetZeroWhenOutOfConditionField{display:none !important}.template{display:block;float:left;width:100%}.template-selectable{display:block;float:left;width:340px}.template-viewer-container{display:block;float:right;width:100%;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{clear:both;margin:0 -10px}.nav-site{position:relative;top:0;left:0;float:left;width:220px;height:70px;margin:10px;border-radius:5px}.nav-site .heading{position:absolute;top:-10px;left:5px;width:50px;height:9px;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{position:absolute;top:1px;left:1px;width:220px;height:70px;border-right:solid 1px #c0c0c0;border-bottom:solid 1px #c0c0c0;border-radius:5px}.nav-site .stacking2{position:absolute;top:4px;left:4px;width:220px;height:70px;border-right:solid 1px #c0c0c0;border-bottom:solid 1px #c0c0c0;border-radius:5px}.nav-site a{display:block;width:100%;height:100%;padding:10px 3px 3px 10px;overflow:hidden;text-decoration:none;word-wrap:break-word}.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{position:absolute;right:1px;bottom:1px;color:#000;font-size:.75em}.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.overdue::before{content:"("}.nav-site .conditions span.overdue::after{content:")"}.nav-site .conditions span.elapsed-time.old{color:#c0c0c0}.nav-site .conditions span.reference{display:none}.error-page{padding:30px 50px;border-top:dotted 1px #808080}.error-page-title{margin:0 0 20px 0;padding:10px 0;color:#f00;font-weight:bold;border-bottom:dotted 1px #f00}.error-page-message{margin:15px 0 0 0;padding:5px 20px;color:#fff;font-weight:bold;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{min-inline-size:0}.fieldset.enclosed{clear:both;margin:0 0 10px 0;padding:10px;border:solid 1px #c0c0c0}.fieldset.enclosed-half{float:left;width:380px;margin:0 0 10px 0;padding:10px;border:solid 1px #c0c0c0}.fieldset.enclosed-thin{clear:both;margin:0 0 10px 0;padding:5px 5px 5px 10px;border:solid 1px #c0c0c0}.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{clear:both;padding:10px 5px 5px 136px;text-align:center}.command-field>button{display:block;float:left;margin:2px 4px}.command-center{clear:both;padding:5px 5px 5px 5px;text-align:center}.command-center>button{display:inline;float:none;margin:2px 4px}.command-left{float:left;clear:both;padding:5px 5px 5px 5px}.command-left>*{display:block;float:left}.command-left>button{margin:2px 4px}.command-left>.ui-icon{margin:7px 3px 0 15px}.command-right{clear:both;padding:5px 5px 5px 5px;text-align:right}.command-right>button{display:inline;float:none;margin:2px 4px}.field-normal{float:left;width:340px;height:45px;padding:0 20px 10px 0}.field-normal>.field-label{float:left;width:120px;margin-right:-120px;padding:7px 7px 7px 0;text-align:right}.field-normal>.field-control{float:right;width:100%}: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{float:left;clear:both;width:100%;min-height:45px;padding:0 10px 10px 0}.field-wide>.field-label{float:left;width:120px;margin-right:-120px;padding:7px 7px 7px 0;text-align:right}.field-wide>.field-control{float:right;width:100%}:not(td)>div.field-wide .container-normal{margin-left:120px}.field-markdown{float:left;clear:both;width:100%;min-height:45px;padding:0 10px 10px 0}.field-markdown>.field-label{float:left;width:120px;margin-right:-120px;padding:7px 7px 7px 0;text-align:right}.field-markdown>.field-control{float:right;width:100%}:not(td)>div.field-markdown .container-normal{margin-left:120px}.field-textarea{float:left;clear:both;width:100%;min-height:45px;padding:0 10px 10px 0}.field-textarea>.field-label{float:left;width:120px;margin-right:-120px;padding:7px 7px 7px 0;text-align:right}.field-textarea>.field-control{float:right;width:100%}:not(td)>div.field-textarea .container-normal{margin-left:120px}.field-auto{display:flex;float:left;width:auto;height:45px;margin-right:35px;padding:0 10px 10px 0}.field-auto>.field-label{float:left;width:120px;padding:7px 7px 7px 0;text-align:right}.field-auto>.field-control{flex:1;float:left;width:auto}.field-auto-thin{float:left;width:auto;height:45px;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{float:left;width:auto}.field-auto-thin select{max-width:120px}.field-vertical{float:left;width:330px;height:100%;padding:0 20px 20px 0}.field-vertical>.field-label{float:left;width:100%;margin-right:-120px;padding:5px 10px;text-align:center}.field-vertical>.field-control{float:left;clear:both;width:100%}.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{display:block;float:left;clear:both;width:100%;margin:15px;padding:2px 5px;font-weight:bold;border-bottom:solid 1px #c0c0c0}.container-normal{position:relative}.container-left{position:relative;float:left;width:340px;margin-right:-340px;padding:0 0 15px 0}.container-right{position:relative;float:right;width:100%}.container-right>*{display:block;margin-left:340px}.control-text{display:block;width:100%;min-height:30px;padding:6px 4px 2px 4px;overflow:hidden;color:#000;background:#f5f5f5;border:solid 1px #c0c0c0;border-radius:5px}.control-textbox{width:100%;height:30px;padding:4px;border:solid 1px #c0c0c0;border-radius:5px}.control-textbox.with-unit{display:block;float:left;width:70%}.control-textbox.anchor{z-index:0;width:100%;height:30px;padding:4px;border:solid 1px #c0c0c0;border-radius:5px}.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{position:absolute;top:50px;height:22px}.control-attachments-upload{display:block;float:left;width:100%;padding:25px 0;text-align:center;border:dotted 2px #d19405;border-radius:3px}.control-attachments-items{display:block;float:left;width:100%}.control-attachments-item{display:block;float:left;width:100%;margin:5px 0 0 0;padding:5px 10px;text-align:left;border:solid 1px #d19405;border-radius:5px}.progress-bar{display:block;float:left;width:100%;height:30px;margin:5px 0 0 0;overflow:hidden;vertical-align:top;border:solid 1px #d19405;border-radius:5px}.progress-bar>div{width:0;height:100%;color:#fff;line-height:22px;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{float:left;width:100%;min-height:100px;padding:4px 25px 4px 6px;color:#000;background:#f5f5f5;border:solid 1px #c0c0c0;border-radius:5px}.md{float:left;width:100%;font-family:Terminal,Hiragino Kaku Gothic Pro;line-height:1.5em;word-break:break-all;word-wrap:break-word}.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{clear:both;margin:0 0 10px 0}.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}.md li p{float:none}.control-markdown{display:none;width:100%;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{display:block;float:left;width:auto;height:22px;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{float:left;width:30px;margin:8px 0 0 12px}.control-slider-ui{float:left;width:140px;margin:11px 0 0 5px}.container-selectable .wrapper{display:block;float:left;width:100%;min-height:300px;overflow:auto;background-color:#f5f5f5;border:solid 1px #c0c0c0;border-radius:5px}.control-selectable{display:block;float:left;width:100%;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{z-index:2;display:block;float:left}.comment{position:relative;display:block;float:left;clear:both;width:100%;margin:0 0 5px 0;padding:5px 10px 10px 20px;background:#fafad2;border:solid 1px #c0c0c0}.comment>*{display:block;float:left}.comment>.time{float:left;margin:0 0 8px -10px;margin-right:10px}.comment>.body{clear:both;width:100%}.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{display:none;width:100%}.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}.center-align{text-align:center;text-align-last:center}.tooltip{position:absolute;display:none}.no-border{border:none}.grid-wrap{clear:both}.grid{margin:0 0 10px 0}.grid.fixed{table-layout:fixed}.grid>thead{position:sticky;top:-1px;z-index:3}.grid>thead>tr>caption{margin:0 0 5px 0}.grid>thead>tr>th{padding:6px;vertical-align:middle;word-wrap:break-word;border-top:solid 1px transparent;border-right:solid 1px #fff;border-bottom:solid 1px transparent;border-left:solid 1px transparent}.grid>thead>tr>th>div{z-index:2;float:left;width:100%;text-align:center}.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;word-wrap:break-word;border-right:dotted 1px #c0c0c0;border-left:dotted 1px #c0c0c0}.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;font-weight:normal;vertical-align:middle;word-wrap:break-word;background-color:#dcdcdc;border-top:solid 1px #fff;border-right:solid 1px transparent;border-bottom:solid 1px #fff;border-left:solid 1px transparent}.grid-row{background-color:#fff;border-bottom:solid 1px #c0c0c0}.grid-row td{overflow:hidden}.grid-row .comment{clear:both;min-width:200px;max-height:100px;margin:0 0 3px 0;padding:3px 6px 3px 15px;overflow:hidden;background:#fafad2;border:solid 1px #fff}.grid-row .comment.one-third{max-height:306px}.grid-row .comment.half{max-height:151px}.grid:not(.not-link) .grid-row:hover{cursor:pointer;background-color:#f5f5f5}.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{clear:both;min-width:200px;max-height:306px;margin:0 0 3px 0;padding:3px 6px;overflow:hidden;background:inherit;border:solid 1px transparent}.grid-title-body>.body{width:100%}.grid-title-body>.title+.body{padding:8px 0 0 10px}.dashboard-grid-header{position:sticky;top:-20px;z-index:3}.links{padding:0 10px}#Links>.fieldset>div .grid{width:max-content;min-width:100%}#Links>.fieldset>div .grid-wrap{margin-bottom:10px;overflow:auto}.link-creations button{display:block;float:left;margin:0 10px 0 0}.text{display:block;float:left;width:250px;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{position:fixed;bottom:78px;left:0;z-index:90;width:100%;text-align:center}.message .body{position:relative;margin-bottom:4px;border-radius:20px}.message .close{position:absolute;top:11px;right:8px;cursor:pointer;background-color:#fff;border-radius:10px}.message-dialog{display:block;float:left;width:100%;margin:0 auto;text-align:center}.message-form-bottom{width:600px;margin:0 auto;text-align:center}.alert-error{display:block;min-height:32px;padding:5px;color:#fff;background-color:rgba(255,0,0,.9);border:solid 1px #f00}.alert-success{display:block;min-height:32px;padding:5px;color:#fff;background-color:rgba(0,128,0,.9);border:solid 1px #008000}.alert-warning{display:block;min-height:32px;padding:5px;color:#000;background-color:#ff0;border:solid 1px #ff0}.alert-information{display:block;min-height:32px;padding:5px;color:#fff;background-color:#00f;border:solid 1px #00f}label.error{top:-5px;left:0;z-index:2;display:block;float:left;width:100%;padding:0 5px;color:#f00;background-color:#fff;border-top:none;border-radius:0 0 5px 5px/0 0 5px 5px}.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{position:absolute;top:25px;width:70%}.button-edit-markdown{position:absolute;top:5px;right:5px;z-index:1;cursor:pointer}.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}.show-password{position:absolute;top:4px;right:-27px;z-index:10;cursor:pointer}#passwordGenerateicon{position:absolute;top:4px;right:-60px;z-index:10;cursor:pointer}input[type="password"]::-ms-reveal{display:none}.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{font-family:Terminal,Hiragino Kaku Gothic Pro;line-height:1.5em}.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;max-height:46px;background:#fff}.ui-widget.ui-state-default.ui-multiselect{display:flex;align-items:center;justify-content:space-between;height:30px;overflow:hidden;background:#fff;border:solid 1px #c0c0c0;border-radius:5px}.field-wide .ui-widget.ui-state-default.ui-multiselect{height:auto;min-height:30px}.ui-widget.ui-state-default.ui-multiselect .ui-multiselect-open{display:block;order:2}.ui-widget.ui-state-default.ui-multiselect .ui-multiselect-open+span{display:block;overflow:hidden;text-overflow:ellipsis;order:1}.field-normal .ui-widget.ui-state-default.ui-multiselect .ui-multiselect-open+span{white-space:nowrap}.field-wide .ui-widget.ui-state-default.ui-multiselect .ui-multiselect-open+span{display:-webkit-box;max-height:4.7em;-webkit-box-orient:vertical;-webkit-line-clamp:3}.ui-multiselect-menu{width:auto !important;min-width:225px;max-width:450px}.ui-multiselect-checkboxes{min-height:300px}.ui-multiselect-checkboxes label{white-space:nowrap}.ui-multiselect-checkboxes input{margin:0 5px}.ui-corner-all.ui-state-hover{border-radius:2px}.ui-icon-white{background-image:url(../styles/plugins/images/ui-icons_ffffff_256x240.png)}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{position:absolute;z-index:10;border-right:solid 1px #fff;border-left:solid 1px #fff}.menu-negative>li{display:block;float:left;clear:both;width:100%;cursor:pointer;border-top:dotted 1px #fff}.menu-sort{position:absolute;z-index:10;border-right:solid 1px #fff;border-left:solid 1px #fff;border-radius:0 0 10px 10px/0 0 10px 10px}.menu-sort>li{display:block;float:left;clear:both;width:100%;cursor:pointer;border-top:dotted 1px #fff}.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;z-index:10;cursor:pointer}.current-user{position:absolute;top:9px;right:-17px;z-index:10;cursor:pointer}.current-dept{position:absolute;top:9px;right:-17px;z-index:10;cursor:pointer}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{position:fixed;right:8px;bottom:280px;z-index:3;width:238px}#SupportBanner{position:fixed;right:8px;bottom:180px;z-index:3;width:238px}#CasesBanner{position:fixed;right:8px;bottom:80px;z-index:3;width:238px}.annonymous .close-announcement{display:none}.grid-stack{margin:10px;background-color:#fff}.grid-stack-item-content{background-color:#f5f5f5}.dashboard-timeline-container{display:flex;flex-direction:column;gap:4px}.dashboard-timeline-item{margin:4px;padding:8px;cursor:pointer;background-color:#fff;border-radius:4px;box-shadow:0 2px 4px rgba(0,0,0,.2);transition:background-color .3s}.dashboard-timeline-item:hover{background-color:#ebebeb}.dashboard-timeline-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:4px}.dashboard-timeline-header a{min-width:40px;overflow:hidden;color:#007bff;font-weight:bold;text-overflow:ellipsis;white-space:nowrap}.dashboard-timeline-header-closed{max-height:0;margin-bottom:0;overflow:hidden}.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{display:flex;margin-left:3px;color:#777;font-size:.8em;font-weight:bold;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{color:#333;font-size:1.2em;font-weight:bold}.dashboard-timeline-body{margin-top:8px;color:#555;line-height:1.5}.dashboard-timeline-body-closed{max-height:0;margin-top:0;overflow:hidden}.dashboard-timeline-item:hover .dashboard-timeline-body-closed{max-height:300px;margin-top:8px;overflow:auto;transition:max-height .5s linear 1s,margin-top 0s;transition-delay:1s}.grid-stack-item-content{display:flex;flex-direction:column;padding:16px;background-color:#f2f2f2;border-radius:5px;box-shadow:0 2px 4px rgba(0,0,0,.1)}.grid-stack>.grid-stack-item>.grid-stack-item-content{overflow-x:auto}.dashboard-part-title{margin-bottom:10px;color:#333;font-size:1.2em;font-weight:bold}.dashboard-part-nav{margin-top:10px}.dashboard-part-nav-menu{display:flex;flex-wrap:wrap;margin:0;padding:0;list-style:none}.dashboard-part-nav-menu>.dashboard-part-nav-item{min-width:120px;max-width:200px;margin-left:10px;padding:4px;overflow:hidden;white-space:nowrap;box-shadow:0 2px 4px rgba(0,0,0,.2)}.dashboard-part-nav-menu-vartical{display:flex;flex-direction:column;margin:0;padding:0;list-style:none}.dashboard-part-nav-item{display:flex;margin-bottom:8px;padding:4px;color:#333;background-color:#fff;border-radius:4px;box-shadow:0 2px 4px rgba(0,0,0,.2)}.dashboard-part-nav-item:hover{background-color:#ddd}.dashboard-part-nav-link{width:100%;padding:4px;color:inherit;text-decoration:none}.dashboard-part-refresh{position:absolute;top:8px;left:8px;z-index:5;padding-top:0;padding-left:0;color:#636363;background-color:transparent;border:none;opacity:0}@keyframes custom-spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}.dashboard-part-road{position:absolute;top:calc(50% - 25px);left:calc(50% - 25px);display:inline-block;color:#636363;font-size:50px;animation:custom-spin 1s linear infinite}#AnalyPartTimePeriodValueField{width:230px}#AnalyPartTimePeriodField{width:110px}#AnalyPartTimePeriodField .field-label{display:none}#AnalyPartTimePeriodField div.container-normal{margin-left:0}.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%}div.lower-search-ui{margin:4px 0 0 0} \ No newline at end of file diff --git a/Implem.Pleasanter/wwwroot/scripts/_elements.js b/Implem.Pleasanter/wwwroot/scripts/_elements.js index 6ff318c8e..44143e8d1 100644 --- a/Implem.Pleasanter/wwwroot/scripts/_elements.js +++ b/Implem.Pleasanter/wwwroot/scripts/_elements.js @@ -75,13 +75,36 @@ $p.getGridRow = function (id) { } $p.getGridCell = function (id, name, excludeHistory) { - return $('#Grid > tbody > tr[data-id="' + id + '"]' + (excludeHistory? ':not([data-history])' : '') + ' td:nth-child(' + ($p.getGridColumnIndex(name) + 1) + ')'); + return $('#Grid > tbody > tr[data-id="' + id + '"]' + (excludeHistory ? ':not([data-history])' : '') + ' td:nth-child(' + ($p.getGridColumnIndex(name) + 1) + ')'); } $p.getGridColumnIndex = function (name) { return $('#Grid > thead > tr > th').index($('#Grid > thead > tr > th[data-name="' + $p.getColumnName(name) + '"]')); } +$p.getValue = function (name) { + let $control = $p.getControl(name); + if ($control === undefined || $control.length === 0) { + return undefined; + } + let element = $control[0]; + let dataRaw = element.getAttribute('data-raw'); + if (dataRaw !== null) { + return dataRaw; + } + switch (element.tagName) { + case 'INPUT': + return (element.type === 'checkbox') + ? element.checked + : element.value; + case 'SELECT': + case 'TEXTAREA': + return element.value; + default: + return element.textContent; + } +} + $p.on = function (events, name, func) { $(document).on(events, '#' + $p.getControl(name).attr('id'), func); } \ No newline at end of file diff --git a/Implem.Pleasanter/wwwroot/scripts/dropdownsearch.js b/Implem.Pleasanter/wwwroot/scripts/dropdownsearch.js index b7670a126..1a038c6a5 100644 --- a/Implem.Pleasanter/wwwroot/scripts/dropdownsearch.js +++ b/Implem.Pleasanter/wwwroot/scripts/dropdownsearch.js @@ -46,7 +46,7 @@ $p.openDropDownSearchDialog = function ($control) { $($('#DropDownSearchDialog')).dialog({ title: $('.field-label label[for="' + id + '"]').text(), modal: true, - width: '750px', + width: '860px', resizable: false, close: function () { $('#' + $target.val()).prop("disabled", false); diff --git a/Implem.Pleasanter/wwwroot/scripts/fieldselectable.js b/Implem.Pleasanter/wwwroot/scripts/fieldselectable.js index a559285ae..5d4c79081 100644 --- a/Implem.Pleasanter/wwwroot/scripts/fieldselectable.js +++ b/Implem.Pleasanter/wwwroot/scripts/fieldselectable.js @@ -15,6 +15,12 @@ $p.moveColumns = function (event, $control, columnHeader, isKeepSource, isJoin, isKeepSource, isJoin !== undefined && isJoin === true ? columnHeader + 'Join' : undefined); }; +$p.moveAllColumns = function (event, $control, columnHeader, isKeepSource, isJoin, type) { + $control.closest('.container-selectable').find('li').removeClass('ui-selected ui-selectee').addClass('ui-selectee').filter(function (index) { + return $(this).data('value').toString().trim() != ''; + }).addClass('ui-selected'); + $p.moveColumns(event, $control, columnHeader, isKeepSource, isJoin, type); +} $p.moveColumnsById = function (event, $control, columnsId, srcColumnsId, isKeepSource, joinId) { if ($p.outsideDialog($control)) { alert("outsideDialog"); diff --git a/Implem.Pleasanter/wwwroot/scripts/plugins/jquery.validate.min.js b/Implem.Pleasanter/wwwroot/scripts/plugins/jquery.validate.min.js index 7f5f510e0..442a41317 100644 --- a/Implem.Pleasanter/wwwroot/scripts/plugins/jquery.validate.min.js +++ b/Implem.Pleasanter/wwwroot/scripts/plugins/jquery.validate.min.js @@ -1,4 +1,4 @@ -/*! jQuery Validation Plugin - v1.19.3 - 1/9/2021 +/*! jQuery Validation Plugin - v1.19.5 - 7/1/2022 * https://jqueryvalidation.org/ - * Copyright (c) 2021 Jörn Zaefferer; Licensed MIT */ -!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.fn,{validate:function(b){if(!this.length)return void(b&&b.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing."));var c=a.data(this[0],"validator");return c?c:(this.attr("novalidate","novalidate"),c=new a.validator(b,this[0]),a.data(this[0],"validator",c),c.settings.onsubmit&&(this.on("click.validate",":submit",function(b){c.submitButton=b.currentTarget,a(this).hasClass("cancel")&&(c.cancelSubmit=!0),void 0!==a(this).attr("formnovalidate")&&(c.cancelSubmit=!0)}),this.on("submit.validate",function(b){function d(){var d,e;return c.submitButton&&(c.settings.submitHandler||c.formSubmitted)&&(d=a("").attr("name",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),!(c.settings.submitHandler&&!c.settings.debug)||(e=c.settings.submitHandler.call(c,c.currentForm,b),d&&d.remove(),void 0!==e&&e)}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c,d;return a(this[0]).is("form")?b=this.validate().form():(d=[],b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b,b||(d=d.concat(c.errorList))}),c.errorList=d),b},rules:function(b,c){var d,e,f,g,h,i,j=this[0],k="undefined"!=typeof this.attr("contenteditable")&&"false"!==this.attr("contenteditable");if(null!=j&&(!j.form&&k&&(j.form=this.closest("form")[0],j.name=this.attr("name")),null!=j.form)){if(b)switch(d=a.data(j.form,"validator").settings,e=d.rules,f=a.validator.staticRules(j),b){case"add":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case"remove":return c?(i={},a.each(c.split(/\s/),function(a,b){i[b]=f[b],delete f[b]}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g)),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}});var b=function(a){return a.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")};a.extend(a.expr.pseudos||a.expr[":"],{blank:function(c){return!b(""+a(c).val())},filled:function(c){var d=a(c).val();return null!==d&&!!b(""+d)},unchecked:function(b){return!a(b).prop("checked")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:void 0===c?b:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp("\\{"+a+"\\}","g"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",pendingClass:"pending",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(b,c){var d=[16,17,18,20,35,36,37,38,39,40,45,144,225];9===c.which&&""===this.elementValue(b)||a.inArray(c.keyCode,d)!==-1||(b.name in this.submitted||b.name in this.invalid)&&this.element(b)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",equalTo:"Please enter the same value again.",maxlength:a.validator.format("Please enter no more than {0} characters."),minlength:a.validator.format("Please enter at least {0} characters."),rangelength:a.validator.format("Please enter a value between {0} and {1} characters long."),range:a.validator.format("Please enter a value between {0} and {1}."),max:a.validator.format("Please enter a value less than or equal to {0}."),min:a.validator.format("Please enter a value greater than or equal to {0}."),step:a.validator.format("Please enter a multiple of {0}.")},autoCreateRanges:!1,prototype:{init:function(){function b(b){var c="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");if(!this.form&&c&&(this.form=a(this).closest("form")[0],this.name=a(this).attr("name")),d===this.form){var e=a.data(this.form,"validator"),f="on"+b.type.replace(/^validate/,""),g=e.settings;g[f]&&!a(this).is(g.ignore)&&g[f].call(e,this,b)}}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.currentForm,e=this.groups={};a.each(this.settings.groups,function(b,c){"string"==typeof c&&(c=c.split(/\s/)),a.each(c,function(a,c){e[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)}),a(this.currentForm).on("focusin.validate focusout.validate keyup.validate",":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], [type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox'], [contenteditable], [type='button']",b).on("click.validate","select, option, [type='radio'], [type='checkbox']",b),this.settings.invalidHandler&&a(this.currentForm).on("invalid-form.validate",this.settings.invalidHandler)},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c,d,e=this.clean(b),f=this.validationTargetFor(e),g=this,h=!0;return void 0===f?delete this.invalid[e.name]:(this.prepareElement(f),this.currentElements=a(f),d=this.groups[f.name],d&&a.each(this.groups,function(a,b){b===d&&a!==f.name&&(e=g.validationTargetFor(g.clean(g.findByName(a))),e&&e.name in g.invalid&&(g.currentElements.push(e),h=g.check(e)&&h))}),c=this.check(f)!==!1,h=h&&c,c?this.invalid[f.name]=!1:this.invalid[f.name]=!0,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),a(b).attr("aria-invalid",!c)),h},showErrors:function(b){if(b){var c=this;a.extend(this.errorMap,b),this.errorList=a.map(this.errorMap,function(a,b){return{message:a,element:c.findByName(b)[0]}}),this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.invalid={},this.submitted={},this.prepareForm(),this.hideErrors();var b=this.elements().removeData("previousValue").removeAttr("aria-invalid");this.resetElements(b)},resetElements:function(a){var b;if(this.settings.unhighlight)for(b=0;a[b];b++)this.settings.unhighlight.call(this,a[b],this.settings.errorClass,""),this.findByName(a[b].name).removeClass(this.settings.validClass);else a.removeClass(this.settings.errorClass).removeClass(this.settings.validClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)void 0!==a[b]&&null!==a[b]&&a[b]!==!1&&c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(""),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").trigger("focus").trigger("focusin")}catch(b){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={};return a(this.currentForm).find("input, select, textarea, [contenteditable]").not(":submit, :reset, :image, :disabled").not(this.settings.ignore).filter(function(){var d=this.name||a(this).attr("name"),e="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");return!d&&b.settings.debug&&window.console&&console.error("%o has no name assigned",this),e&&(this.form=a(this).closest("form")[0],this.name=d),this.form===b.currentForm&&(!(d in c||!b.objectLength(a(this).rules()))&&(c[d]=!0,!0))})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(" ").join(".");return a(this.settings.errorElement+"."+b,this.errorContext)},resetInternals:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([])},reset:function(){this.resetInternals(),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d,e=a(b),f=b.type,g="undefined"!=typeof e.attr("contenteditable")&&"false"!==e.attr("contenteditable");return"radio"===f||"checkbox"===f?this.findByName(b.name).filter(":checked").val():"number"===f&&"undefined"!=typeof b.validity?b.validity.badInput?"NaN":e.val():(c=g?e.text():e.val(),"file"===f?"C:\\fakepath\\"===c.substr(0,12)?c.substr(12):(d=c.lastIndexOf("/"),d>=0?c.substr(d+1):(d=c.lastIndexOf("\\"),d>=0?c.substr(d+1):c)):"string"==typeof c?c.replace(/\r/g,""):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f,g=a(b).rules(),h=a.map(g,function(a,b){return b}).length,i=!1,j=this.elementValue(b);"function"==typeof g.normalizer?f=g.normalizer:"function"==typeof this.settings.normalizer&&(f=this.settings.normalizer),f&&(j=f.call(b,j),delete g.normalizer);for(d in g){e={method:d,parameters:g[d]};try{if(c=a.validator.methods[d].call(this,j,b,e.parameters),"dependency-mismatch"===c&&1===h){i=!0;continue}if(i=!1,"pending"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(k){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+b.id+", check the '"+e.method+"' method.",k),k instanceof TypeError&&(k.message+=". Exception occurred when checking element "+b.id+", check the '"+e.method+"' method."),k}}if(!i)return this.objectLength(g)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data("msg"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data("msg")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;aWarning: No message defined for "+b.name+""),e=/\$?\{(\d+)\}/g;return"function"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,"{$1}"),c.parameters)),d},formatAndAdd:function(a,b){var c=this.defaultMessage(a,b);this.errorList.push({message:c,element:a,method:b.method}),this.errorMap[a.name]=c,this.submitted[a.name]=c},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g,h=this.errorsFor(b),i=this.idOrName(b),j=a(b).attr("aria-describedby");h.length?(h.removeClass(this.settings.validClass).addClass(this.settings.errorClass),h.html(c)):(h=a("<"+this.settings.errorElement+">").attr("id",i+"-error").addClass(this.settings.errorClass).html(c||""),d=h,this.settings.wrapper&&(d=h.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement.call(this,d,a(b)):d.insertAfter(b),h.is("label")?h.attr("for",i):0===h.parents("label[for='"+this.escapeCssMeta(i)+"']").length&&(f=h.attr("id"),j?j.match(new RegExp("\\b"+this.escapeCssMeta(f)+"\\b"))||(j+=" "+f):j=f,a(b).attr("aria-describedby",j),e=this.groups[b.name],e&&(g=this,a.each(g.groups,function(b,c){c===e&&a("[name='"+g.escapeCssMeta(b)+"']",g.currentForm).attr("aria-describedby",h.attr("id"))})))),!c&&this.settings.success&&(h.text(""),"string"==typeof this.settings.success?h.addClass(this.settings.success):this.settings.success(h,b)),this.toShow=this.toShow.add(h)},errorsFor:function(b){var c=this.escapeCssMeta(this.idOrName(b)),d=a(b).attr("aria-describedby"),e="label[for='"+c+"'], label[for='"+c+"'] *";return d&&(e=e+", #"+this.escapeCssMeta(d).replace(/\s+/g,", #")),this.errors().filter(e)},escapeCssMeta:function(a){return a.replace(/([\\!"#$%&'()*+,.\/:;<=>?@\[\]^`{|}~])/g,"\\$1")},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(b){return this.checkable(b)&&(b=this.findByName(b.name)),a(b).not(this.settings.ignore)[0]},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find("[name='"+this.escapeCssMeta(b)+"']")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case"select":return a("option:selected",c).length;case"input":if(this.checkable(c))return this.findByName(c.name).filter(":checked").length}return b.length},depend:function(a,b){return!this.dependTypes[typeof a]||this.dependTypes[typeof a](a,b)},dependTypes:{"boolean":function(a){return a},string:function(b,c){return!!a(b,c.form).length},"function":function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&"dependency-mismatch"},startRequest:function(b){this.pending[b.name]||(this.pendingRequest++,a(b).addClass(this.settings.pendingClass),this.pending[b.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],a(b).removeClass(this.settings.pendingClass),c&&0===this.pendingRequest&&this.formSubmitted&&this.form()?(a(this.currentForm).submit(),this.submitButton&&a("input:hidden[name='"+this.submitButton.name+"']",this.currentForm).remove(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(b,c){return c="string"==typeof c&&c||"remote",a.data(b,"previousValue")||a.data(b,"previousValue",{old:null,valid:!0,message:this.defaultMessage(b,{method:c})})},destroy:function(){this.resetForm(),a(this.currentForm).off(".validate").removeData("validator").find(".validate-equalTo-blur").off(".validate-equalTo").removeClass("validate-equalTo-blur").find(".validate-lessThan-blur").off(".validate-lessThan").removeClass("validate-lessThan-blur").find(".validate-lessThanEqual-blur").off(".validate-lessThanEqual").removeClass("validate-lessThanEqual-blur").find(".validate-greaterThanEqual-blur").off(".validate-greaterThanEqual").removeClass("validate-greaterThanEqual-blur").find(".validate-greaterThan-blur").off(".validate-greaterThan").removeClass("validate-greaterThan-blur")}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr("class");return d&&a.each(d.split(" "),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},normalizeAttributeRule:function(a,b,c,d){/min|max|step/.test(c)&&(null===b||/number|range|text/.test(b))&&(d=Number(d),isNaN(d)&&(d=void 0)),d||0===d?a[c]=d:b===c&&"range"!==b&&(a[c]=!0)},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)"required"===c?(d=b.getAttribute(c),""===d&&(d=!0),d=!!d):d=f.attr(c),this.normalizeAttributeRule(e,g,c,d);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)d=f.data("rule"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),""===d&&(d=!0),this.normalizeAttributeRule(e,g,c,d);return e},staticRules:function(b){var c={},d=a.data(b.form,"validator");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case"string":f=!!a(e.depends,c.form).length;break;case"function":f=e.depends.call(c,c)}f?b[d]=void 0===e.param||e.param:(a.data(c.form,"validator").resetElements(a(c)),delete b[d])}}),a.each(b,function(a,d){b[a]="function"==typeof d&&"normalizer"!==a?d(c):d}),a.each(["minlength","maxlength"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each(["rangelength","range"],function(){var a;b[this]&&(Array.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:"string"==typeof b[this]&&(a=b[this].replace(/[\[\]]/g,"").split(/[\s,]+/),b[this]=[Number(a[0]),Number(a[1])]))}),a.validator.autoCreateRanges&&(null!=b.min&&null!=b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),null!=b.minlength&&null!=b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if("string"==typeof b){var c={};a.each(b.split(/\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return"dependency-mismatch";if("select"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:void 0!==b&&null!==b&&b.length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[\/?#]\S*)?$/i.test(a)},date:function(){var a=!1;return function(b,c){return a||(a=!0,this.settings.debug&&window.console&&console.warn("The `date` method is deprecated and will be removed in version '2.0.0'.\nPlease don't use it, since it relies on the Date constructor, which\nbehaves very differently across browsers and locales. Use `dateISO`\ninstead or one of the locale specific methods in `localizations/`\nand `additional-methods.js`.")),this.optional(c)||!/Invalid|NaN/.test(new Date(b).toString())}}(),dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},minlength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d>=c},maxlength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d<=c},rangelength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d>=c[0]&&d<=c[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||a<=c},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},step:function(b,c,d){var e,f=a(c).attr("type"),g="Step attribute on input type "+f+" is not supported.",h=["text","number","range"],i=new RegExp("\\b"+f+"\\b"),j=f&&!i.test(h.join()),k=function(a){var b=(""+a).match(/(?:\.(\d+))?$/);return b&&b[1]?b[1].length:0},l=function(a){return Math.round(a*Math.pow(10,e))},m=!0;if(j)throw new Error(g);return e=k(d),(k(b)>e||l(b)%l(d)!==0)&&(m=!1),this.optional(c)||m},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-equalTo-blur").length&&e.addClass("validate-equalTo-blur").on("blur.validate-equalTo",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d,e){if(this.optional(c))return"dependency-mismatch";e="string"==typeof e&&e||"remote";var f,g,h,i=this.previousValue(c,e);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),i.originalMessage=i.originalMessage||this.settings.messages[c.name][e],this.settings.messages[c.name][e]=i.message,d="string"==typeof d&&{url:d}||d,h=a.param(a.extend({data:b},d.data)),i.old===h?i.valid:(i.old=h,f=this,this.startRequest(c),g={},g[c.name]=b,a.ajax(a.extend(!0,{mode:"abort",port:"validate"+c.name,dataType:"json",data:g,context:f.currentForm,success:function(a){var d,g,h,j=a===!0||"true"===a;f.settings.messages[c.name][e]=i.originalMessage,j?(h=f.formSubmitted,f.resetInternals(),f.toHide=f.errorsFor(c),f.formSubmitted=h,f.successList.push(c),f.invalid[c.name]=!1,f.showErrors()):(d={},g=a||f.defaultMessage(c,{method:e,parameters:b}),d[c.name]=i.message=g,f.invalid[c.name]=!0,f.showErrors(d)),i.valid=j,f.stopRequest(c,j)}},d)),"pending")}}});var c,d={};return a.ajaxPrefilter?a.ajaxPrefilter(function(a,b,c){var e=a.port;"abort"===a.mode&&(d[e]&&d[e].abort(),d[e]=c)}):(c=a.ajax,a.ajax=function(b){var e=("mode"in b?b:a.ajaxSettings).mode,f=("port"in b?b:a.ajaxSettings).port;return"abort"===e?(d[f]&&d[f].abort(),d[f]=c.apply(this,arguments),d[f]):c.apply(this,arguments)}),a}); \ No newline at end of file + * Copyright (c) 2022 Jörn Zaefferer; Licensed MIT */ +!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.fn,{validate:function(b){if(!this.length)return void(b&&b.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing."));var c=a.data(this[0],"validator");return c?c:(this.attr("novalidate","novalidate"),c=new a.validator(b,this[0]),a.data(this[0],"validator",c),c.settings.onsubmit&&(this.on("click.validate",":submit",function(b){c.submitButton=b.currentTarget,a(this).hasClass("cancel")&&(c.cancelSubmit=!0),void 0!==a(this).attr("formnovalidate")&&(c.cancelSubmit=!0)}),this.on("submit.validate",function(b){function d(){var d,e;return c.submitButton&&(c.settings.submitHandler||c.formSubmitted)&&(d=a("").attr("name",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),!(c.settings.submitHandler&&!c.settings.debug)||(e=c.settings.submitHandler.call(c,c.currentForm,b),d&&d.remove(),void 0!==e&&e)}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c,d;return a(this[0]).is("form")?b=this.validate().form():(d=[],b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b,b||(d=d.concat(c.errorList))}),c.errorList=d),b},rules:function(b,c){var d,e,f,g,h,i,j=this[0],k="undefined"!=typeof this.attr("contenteditable")&&"false"!==this.attr("contenteditable");if(null!=j&&(!j.form&&k&&(j.form=this.closest("form")[0],j.name=this.attr("name")),null!=j.form)){if(b)switch(d=a.data(j.form,"validator").settings,e=d.rules,f=a.validator.staticRules(j),b){case"add":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case"remove":return c?(i={},a.each(c.split(/\s/),function(a,b){i[b]=f[b],delete f[b]}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g)),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}});var b=function(a){return a.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")};a.extend(a.expr.pseudos||a.expr[":"],{blank:function(c){return!b(""+a(c).val())},filled:function(c){var d=a(c).val();return null!==d&&!!b(""+d)},unchecked:function(b){return!a(b).prop("checked")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:void 0===c?b:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp("\\{"+a+"\\}","g"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",pendingClass:"pending",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(b,c){var d=[16,17,18,20,35,36,37,38,39,40,45,144,225];9===c.which&&""===this.elementValue(b)||a.inArray(c.keyCode,d)!==-1||(b.name in this.submitted||b.name in this.invalid)&&this.element(b)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",equalTo:"Please enter the same value again.",maxlength:a.validator.format("Please enter no more than {0} characters."),minlength:a.validator.format("Please enter at least {0} characters."),rangelength:a.validator.format("Please enter a value between {0} and {1} characters long."),range:a.validator.format("Please enter a value between {0} and {1}."),max:a.validator.format("Please enter a value less than or equal to {0}."),min:a.validator.format("Please enter a value greater than or equal to {0}."),step:a.validator.format("Please enter a multiple of {0}.")},autoCreateRanges:!1,prototype:{init:function(){function b(b){var c="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");if(!this.form&&c&&(this.form=a(this).closest("form")[0],this.name=a(this).attr("name")),d===this.form){var e=a.data(this.form,"validator"),f="on"+b.type.replace(/^validate/,""),g=e.settings;g[f]&&!a(this).is(g.ignore)&&g[f].call(e,this,b)}}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.currentForm,e=this.groups={};a.each(this.settings.groups,function(b,c){"string"==typeof c&&(c=c.split(/\s/)),a.each(c,function(a,c){e[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)}),a(this.currentForm).on("focusin.validate focusout.validate keyup.validate",":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], [type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox'], [contenteditable], [type='button']",b).on("click.validate","select, option, [type='radio'], [type='checkbox']",b),this.settings.invalidHandler&&a(this.currentForm).on("invalid-form.validate",this.settings.invalidHandler)},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c,d,e=this.clean(b),f=this.validationTargetFor(e),g=this,h=!0;return void 0===f?delete this.invalid[e.name]:(this.prepareElement(f),this.currentElements=a(f),d=this.groups[f.name],d&&a.each(this.groups,function(a,b){b===d&&a!==f.name&&(e=g.validationTargetFor(g.clean(g.findByName(a))),e&&e.name in g.invalid&&(g.currentElements.push(e),h=g.check(e)&&h))}),c=this.check(f)!==!1,h=h&&c,c?this.invalid[f.name]=!1:this.invalid[f.name]=!0,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),a(b).attr("aria-invalid",!c)),h},showErrors:function(b){if(b){var c=this;a.extend(this.errorMap,b),this.errorList=a.map(this.errorMap,function(a,b){return{message:a,element:c.findByName(b)[0]}}),this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.invalid={},this.submitted={},this.prepareForm(),this.hideErrors();var b=this.elements().removeData("previousValue").removeAttr("aria-invalid");this.resetElements(b)},resetElements:function(a){var b;if(this.settings.unhighlight)for(b=0;a[b];b++)this.settings.unhighlight.call(this,a[b],this.settings.errorClass,""),this.findByName(a[b].name).removeClass(this.settings.validClass);else a.removeClass(this.settings.errorClass).removeClass(this.settings.validClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)void 0!==a[b]&&null!==a[b]&&a[b]!==!1&&c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(""),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").trigger("focus").trigger("focusin")}catch(b){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={};return a(this.currentForm).find("input, select, textarea, [contenteditable]").not(":submit, :reset, :image, :disabled").not(this.settings.ignore).filter(function(){var d=this.name||a(this).attr("name"),e="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");return!d&&b.settings.debug&&window.console&&console.error("%o has no name assigned",this),e&&(this.form=a(this).closest("form")[0],this.name=d),this.form===b.currentForm&&(!(d in c||!b.objectLength(a(this).rules()))&&(c[d]=!0,!0))})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(" ").join(".");return a(this.settings.errorElement+"."+b,this.errorContext)},resetInternals:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([])},reset:function(){this.resetInternals(),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d,e=a(b),f=b.type,g="undefined"!=typeof e.attr("contenteditable")&&"false"!==e.attr("contenteditable");return"radio"===f||"checkbox"===f?this.findByName(b.name).filter(":checked").val():"number"===f&&"undefined"!=typeof b.validity?b.validity.badInput?"NaN":e.val():(c=g?e.text():e.val(),"file"===f?"C:\\fakepath\\"===c.substr(0,12)?c.substr(12):(d=c.lastIndexOf("/"),d>=0?c.substr(d+1):(d=c.lastIndexOf("\\"),d>=0?c.substr(d+1):c)):"string"==typeof c?c.replace(/\r/g,""):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f,g=a(b).rules(),h=a.map(g,function(a,b){return b}).length,i=!1,j=this.elementValue(b);"function"==typeof g.normalizer?f=g.normalizer:"function"==typeof this.settings.normalizer&&(f=this.settings.normalizer),f&&(j=f.call(b,j),delete g.normalizer);for(d in g){e={method:d,parameters:g[d]};try{if(c=a.validator.methods[d].call(this,j,b,e.parameters),"dependency-mismatch"===c&&1===h){i=!0;continue}if(i=!1,"pending"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(k){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+b.id+", check the '"+e.method+"' method.",k),k instanceof TypeError&&(k.message+=". Exception occurred when checking element "+b.id+", check the '"+e.method+"' method."),k}}if(!i)return this.objectLength(g)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data("msg"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data("msg")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;aWarning: No message defined for "+b.name+""),e=/\$?\{(\d+)\}/g;return"function"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,"{$1}"),c.parameters)),d},formatAndAdd:function(a,b){var c=this.defaultMessage(a,b);this.errorList.push({message:c,element:a,method:b.method}),this.errorMap[a.name]=c,this.submitted[a.name]=c},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g,h=this.errorsFor(b),i=this.idOrName(b),j=a(b).attr("aria-describedby");h.length?(h.removeClass(this.settings.validClass).addClass(this.settings.errorClass),h.html(c)):(h=a("<"+this.settings.errorElement+">").attr("id",i+"-error").addClass(this.settings.errorClass).html(c||""),d=h,this.settings.wrapper&&(d=h.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement.call(this,d,a(b)):d.insertAfter(b),h.is("label")?h.attr("for",i):0===h.parents("label[for='"+this.escapeCssMeta(i)+"']").length&&(f=h.attr("id"),j?j.match(new RegExp("\\b"+this.escapeCssMeta(f)+"\\b"))||(j+=" "+f):j=f,a(b).attr("aria-describedby",j),e=this.groups[b.name],e&&(g=this,a.each(g.groups,function(b,c){c===e&&a("[name='"+g.escapeCssMeta(b)+"']",g.currentForm).attr("aria-describedby",h.attr("id"))})))),!c&&this.settings.success&&(h.text(""),"string"==typeof this.settings.success?h.addClass(this.settings.success):this.settings.success(h,b)),this.toShow=this.toShow.add(h)},errorsFor:function(b){var c=this.escapeCssMeta(this.idOrName(b)),d=a(b).attr("aria-describedby"),e="label[for='"+c+"'], label[for='"+c+"'] *";return d&&(e=e+", #"+this.escapeCssMeta(d).replace(/\s+/g,", #")),this.errors().filter(e)},escapeCssMeta:function(a){return void 0===a?"":a.replace(/([\\!"#$%&'()*+,./:;<=>?@\[\]^`{|}~])/g,"\\$1")},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(b){return this.checkable(b)&&(b=this.findByName(b.name)),a(b).not(this.settings.ignore)[0]},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find("[name='"+this.escapeCssMeta(b)+"']")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case"select":return a("option:selected",c).length;case"input":if(this.checkable(c))return this.findByName(c.name).filter(":checked").length}return b.length},depend:function(a,b){return!this.dependTypes[typeof a]||this.dependTypes[typeof a](a,b)},dependTypes:{"boolean":function(a){return a},string:function(b,c){return!!a(b,c.form).length},"function":function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&"dependency-mismatch"},startRequest:function(b){this.pending[b.name]||(this.pendingRequest++,a(b).addClass(this.settings.pendingClass),this.pending[b.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],a(b).removeClass(this.settings.pendingClass),c&&0===this.pendingRequest&&this.formSubmitted&&this.form()&&0===this.pendingRequest?(a(this.currentForm).trigger("submit"),this.submitButton&&a("input:hidden[name='"+this.submitButton.name+"']",this.currentForm).remove(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(b,c){return c="string"==typeof c&&c||"remote",a.data(b,"previousValue")||a.data(b,"previousValue",{old:null,valid:!0,message:this.defaultMessage(b,{method:c})})},destroy:function(){this.resetForm(),a(this.currentForm).off(".validate").removeData("validator").find(".validate-equalTo-blur").off(".validate-equalTo").removeClass("validate-equalTo-blur").find(".validate-lessThan-blur").off(".validate-lessThan").removeClass("validate-lessThan-blur").find(".validate-lessThanEqual-blur").off(".validate-lessThanEqual").removeClass("validate-lessThanEqual-blur").find(".validate-greaterThanEqual-blur").off(".validate-greaterThanEqual").removeClass("validate-greaterThanEqual-blur").find(".validate-greaterThan-blur").off(".validate-greaterThan").removeClass("validate-greaterThan-blur")}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr("class");return d&&a.each(d.split(" "),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},normalizeAttributeRule:function(a,b,c,d){/min|max|step/.test(c)&&(null===b||/number|range|text/.test(b))&&(d=Number(d),isNaN(d)&&(d=void 0)),d||0===d?a[c]=d:b===c&&"range"!==b&&(a["date"===b?"dateISO":c]=!0)},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)"required"===c?(d=b.getAttribute(c),""===d&&(d=!0),d=!!d):d=f.attr(c),this.normalizeAttributeRule(e,g,c,d);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)d=f.data("rule"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),""===d&&(d=!0),this.normalizeAttributeRule(e,g,c,d);return e},staticRules:function(b){var c={},d=a.data(b.form,"validator");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case"string":f=!!a(e.depends,c.form).length;break;case"function":f=e.depends.call(c,c)}f?b[d]=void 0===e.param||e.param:(a.data(c.form,"validator").resetElements(a(c)),delete b[d])}}),a.each(b,function(a,d){b[a]="function"==typeof d&&"normalizer"!==a?d(c):d}),a.each(["minlength","maxlength"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each(["rangelength","range"],function(){var a;b[this]&&(Array.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:"string"==typeof b[this]&&(a=b[this].replace(/[\[\]]/g,"").split(/[\s,]+/),b[this]=[Number(a[0]),Number(a[1])]))}),a.validator.autoCreateRanges&&(null!=b.min&&null!=b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),null!=b.minlength&&null!=b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if("string"==typeof b){var c={};a.each(b.split(/\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return"dependency-mismatch";if("select"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:void 0!==b&&null!==b&&b.length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(?:(?:(?:https?|ftp):)?\/\/)(?:(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})+(?::(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(a)},date:function(){var a=!1;return function(b,c){return a||(a=!0,this.settings.debug&&window.console&&console.warn("The `date` method is deprecated and will be removed in version '2.0.0'.\nPlease don't use it, since it relies on the Date constructor, which\nbehaves very differently across browsers and locales. Use `dateISO`\ninstead or one of the locale specific methods in `localizations/`\nand `additional-methods.js`.")),this.optional(c)||!/Invalid|NaN/.test(new Date(b).toString())}}(),dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},minlength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d>=c},maxlength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d<=c},rangelength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d>=c[0]&&d<=c[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||a<=c},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},step:function(b,c,d){var e,f=a(c).attr("type"),g="Step attribute on input type "+f+" is not supported.",h=["text","number","range"],i=new RegExp("\\b"+f+"\\b"),j=f&&!i.test(h.join()),k=function(a){var b=(""+a).match(/(?:\.(\d+))?$/);return b&&b[1]?b[1].length:0},l=function(a){return Math.round(a*Math.pow(10,e))},m=!0;if(j)throw new Error(g);return e=k(d),(k(b)>e||l(b)%l(d)!==0)&&(m=!1),this.optional(c)||m},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-equalTo-blur").length&&e.addClass("validate-equalTo-blur").on("blur.validate-equalTo",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d,e){if(this.optional(c))return"dependency-mismatch";e="string"==typeof e&&e||"remote";var f,g,h,i=this.previousValue(c,e);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),i.originalMessage=i.originalMessage||this.settings.messages[c.name][e],this.settings.messages[c.name][e]=i.message,d="string"==typeof d&&{url:d}||d,h=a.param(a.extend({data:b},d.data)),i.old===h?i.valid:(i.old=h,f=this,this.startRequest(c),g={},g[c.name]=b,a.ajax(a.extend(!0,{mode:"abort",port:"validate"+c.name,dataType:"json",data:g,context:f.currentForm,success:function(a){var d,g,h,j=a===!0||"true"===a;f.settings.messages[c.name][e]=i.originalMessage,j?(h=f.formSubmitted,f.resetInternals(),f.toHide=f.errorsFor(c),f.formSubmitted=h,f.successList.push(c),f.invalid[c.name]=!1,f.showErrors()):(d={},g=a||f.defaultMessage(c,{method:e,parameters:b}),d[c.name]=i.message=g,f.invalid[c.name]=!0,f.showErrors(d)),i.valid=j,f.stopRequest(c,j)}},d)),"pending")}}});var c,d={};return a.ajaxPrefilter?a.ajaxPrefilter(function(a,b,c){var e=a.port;"abort"===a.mode&&(d[e]&&d[e].abort(),d[e]=c)}):(c=a.ajax,a.ajax=function(b){var e=("mode"in b?b:a.ajaxSettings).mode,f=("port"in b?b:a.ajaxSettings).port;return"abort"===e?(d[f]&&d[f].abort(),d[f]=c.apply(this,arguments),d[f]):c.apply(this,arguments)}),a}); \ No newline at end of file diff --git a/Implem.Pleasanter/wwwroot/styles/plugins/themes/responsive.custom.css b/Implem.Pleasanter/wwwroot/styles/plugins/themes/responsive.custom.css index 47612a8e1..4c1def29b 100644 --- a/Implem.Pleasanter/wwwroot/styles/plugins/themes/responsive.custom.css +++ b/Implem.Pleasanter/wwwroot/styles/plugins/themes/responsive.custom.css @@ -1040,16 +1040,17 @@ &, &.has-image { a { - padding: 0 8px; + gap: 4px; + padding: 0 8px 8px; } } .conditions { - justify-content: flex-end; + gap: 2px; height: auto; - font-size: 11px; + padding: 2px; + font-size: 10px; span { - margin: 4px; - padding: 0 8px; + border-radius: 2px; &.elapsed-time, &.count { display: none; @@ -1062,13 +1063,13 @@ &:not(.to-parent) { span.title { - height: 3em; + height: 2lh; margin-left: 0; - font-size: 12px; + font-size: 11px; } } .site-icon { - margin: 20px 0 0 0; + margin: 26px 0 0 0; img { width: auto; height: 36px; diff --git a/Implem.Pleasanter/wwwroot/styles/plugins/themes/themes.custom.css b/Implem.Pleasanter/wwwroot/styles/plugins/themes/themes.custom.css index 83d21ce50..35ea9b689 100644 --- a/Implem.Pleasanter/wwwroot/styles/plugins/themes/themes.custom.css +++ b/Implem.Pleasanter/wwwroot/styles/plugins/themes/themes.custom.css @@ -1902,6 +1902,7 @@ body:not(:has(#Editor)) { width: 209px; min-height: 140px; margin: 0; + overflow: hidden; background-color: var(--site-panal-bg); border: none; border-radius: 4px; @@ -1938,20 +1939,40 @@ body:not(:has(#Editor)) { } .conditions { top: 0; + bottom: initial; left: 0; display: flex; - flex-direction: row; - align-items: flex-start; - justify-content: flex-start; - height: 40px; - font-size: 13px; + gap: 4px; + justify-content: flex-end; + height: 28px; + padding: 4px; + font-size: 11px; span { - margin: 6px 6px 6px 0; + float: none; + height: 20px; + margin: 0; padding: 0 8px; + overflow: hidden; color: var(--base-text); background: initial; - &:nth-of-type(2) { - margin-left: auto; + &.elapsed-time { + margin-right: auto; + padding: 0 8px; + line-height: 20px; + } + &.reference { + display: flex; + align-items: center; + justify-content: center; + width: 20px; + height: 20px; + color: var(--nonColor16); + font-size: 16px; + font-variation-settings: "FILL" 1, "wght" 400, "GRAD" -25, + "opsz" 24; + text-align: center; + background-color: var(--primarySub01); + border-radius: 2px; } &.count { background-color: var(--primarySub02); @@ -1960,6 +1981,11 @@ body:not(:has(#Editor)) { &.overdue { background-color: var(--warning-color); border: 1px solid var(--warning-color); + &::before, + &::after { + display: none; + content: initial; + } } } } @@ -1976,7 +2002,7 @@ body:not(:has(#Editor)) { margin: 24px 0 0; text-align: center; img { - width: 48px; + height: 48px; } } .heading { diff --git a/Implem.Pleasanter/wwwroot/styles/responsive.css b/Implem.Pleasanter/wwwroot/styles/responsive.css index 523cdca16..489e18023 100644 --- a/Implem.Pleasanter/wwwroot/styles/responsive.css +++ b/Implem.Pleasanter/wwwroot/styles/responsive.css @@ -562,6 +562,12 @@ border-radius: 3vw; } + #SiteMenu .nav-site .conditions .overdue::before, + #SiteMenu .nav-site .conditions .overdue::after { + display: none; + content: initial; + } + #SiteMenu .nav-site[data-type="Wikis"] { position: relative; width: 20vw; diff --git a/Implem.Pleasanter/wwwroot/styles/site.css b/Implem.Pleasanter/wwwroot/styles/site.css index 784c139b6..d628a4047 100644 --- a/Implem.Pleasanter/wwwroot/styles/site.css +++ b/Implem.Pleasanter/wwwroot/styles/site.css @@ -1736,9 +1736,20 @@ th.calendar-header { background-color: red; } +.nav-site .conditions span.overdue::before { + content: "("; +} + +.nav-site .conditions span.overdue::after { + content: ")"; +} + .nav-site .conditions span.elapsed-time.old { color: silver; } +.nav-site .conditions span.reference { + display: none; +} .error-page { padding: 30px 50px; diff --git a/Implem.TestAutomation/implem.TestAutomation.csproj b/Implem.TestAutomation/implem.TestAutomation.csproj index d36ef0f5a..2963c46b6 100644 --- a/Implem.TestAutomation/implem.TestAutomation.csproj +++ b/Implem.TestAutomation/implem.TestAutomation.csproj @@ -3,10 +3,11 @@ Exe net8.0 - Copyright © Implem Inc 2014 - 2024 - 1.4.11.0 - 1.4.11.0 - 1.4.11.0 + $([System.DateTime]::Now.Year.ToString()) + Copyright © Implem Inc 2014 - $(Year) + 1.4.12.0 + 1.4.12.0 + 1.4.12.0 Linux diff --git a/Rds/Implem.IRds/Implem.IRds.csproj b/Rds/Implem.IRds/Implem.IRds.csproj index cf69e9997..4065671ac 100644 --- a/Rds/Implem.IRds/Implem.IRds.csproj +++ b/Rds/Implem.IRds/Implem.IRds.csproj @@ -2,10 +2,11 @@ net8.0 - Copyright © Implem Inc 2014 - 2024 - 1.4.11.0 - 1.4.11.0 - 1.4.11.0 + $([System.DateTime]::Now.Year.ToString()) + Copyright © Implem Inc 2014 - $(Year) + 1.4.12.0 + 1.4.12.0 + 1.4.12.0 disable diff --git a/Rds/Implem.MySql/Implem.MySql.csproj b/Rds/Implem.MySql/Implem.MySql.csproj index 06e0e1d0f..6573ba733 100644 --- a/Rds/Implem.MySql/Implem.MySql.csproj +++ b/Rds/Implem.MySql/Implem.MySql.csproj @@ -2,10 +2,11 @@ net8.0 - Copyright © Implem Inc 2014 - 2024 - 1.4.11.0 - 1.4.11.0 - 1.4.11.0 + $([System.DateTime]::Now.Year.ToString()) + Copyright © Implem Inc 2014 - $(Year) + 1.4.12.0 + 1.4.12.0 + 1.4.12.0 disable diff --git a/Rds/Implem.PostgreSql/Implem.PostgreSql.csproj b/Rds/Implem.PostgreSql/Implem.PostgreSql.csproj index 6b8cf5d2d..03d3e6a63 100644 --- a/Rds/Implem.PostgreSql/Implem.PostgreSql.csproj +++ b/Rds/Implem.PostgreSql/Implem.PostgreSql.csproj @@ -2,10 +2,11 @@ net8.0 - Copyright © Implem Inc 2014 - 2024 - 1.4.11.0 - 1.4.11.0 - 1.4.11.0 + $([System.DateTime]::Now.Year.ToString()) + Copyright © Implem Inc 2014 - $(Year) + 1.4.12.0 + 1.4.12.0 + 1.4.12.0 disable diff --git a/Rds/Implem.SqlServer/Implem.SqlServer.csproj b/Rds/Implem.SqlServer/Implem.SqlServer.csproj index 8904a1da1..f4438f6f9 100644 --- a/Rds/Implem.SqlServer/Implem.SqlServer.csproj +++ b/Rds/Implem.SqlServer/Implem.SqlServer.csproj @@ -2,10 +2,11 @@ net8.0 - Copyright © Implem Inc 2014 - 2024 - 1.4.11.0 - 1.4.11.0 - 1.4.11.0 + $([System.DateTime]::Now.Year.ToString()) + Copyright © Implem Inc 2014 - $(Year) + 1.4.12.0 + 1.4.12.0 + 1.4.12.0 disable