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