Commit 8a2f5e16 by Mac Stephens

Refactor emT3 reported/assigned dropdown flow and server-backed assigned-name management.

Simplify name manager and update date handling for nullable fields.
parent 9cdecee0
...@@ -20,7 +20,7 @@ type ...@@ -20,7 +20,7 @@ type
FUnauthorizedAccessProc: TUnauthorizedAccessProc; FUnauthorizedAccessProc: TUnauthorizedAccessProc;
public public
const clientVersion = '0.8.5'; const clientVersion = '0.8.6';
procedure InitApp(SuccessProc: TSuccessProc; procedure InitApp(SuccessProc: TSuccessProc;
UnauthorizedAccessProc: TUnauthorizedAccessProc); UnauthorizedAccessProc: TUnauthorizedAccessProc);
procedure SetClientConfig(Callback: TVersionCheckCallback); procedure SetClientConfig(Callback: TVersionCheckCallback);
......
...@@ -72,5 +72,19 @@ span.card { ...@@ -72,5 +72,19 @@ span.card {
border: none; border: none;
} }
.th-resize {
position: relative;
}
.th-resize-handle {
position: absolute;
top: 0;
right: 0;
width: 8px;
height: 100%;
cursor: col-resize;
user-select: none;
}
...@@ -94,13 +94,13 @@ ...@@ -94,13 +94,13 @@
<DCC_RemoteDebug>false</DCC_RemoteDebug> <DCC_RemoteDebug>false</DCC_RemoteDebug>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo> <VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Locale>1033</VerInfo_Locale> <VerInfo_Locale>1033</VerInfo_Locale>
<VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=0.8.5.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=0.9.8.0;Comments=;LastCompiledTime=2018/08/27 15:18:29</VerInfo_Keys> <VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=0.8.6.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=0.9.8.0;Comments=;LastCompiledTime=2018/08/27 15:18:29</VerInfo_Keys>
<AppDPIAwarenessMode>PerMonitor</AppDPIAwarenessMode> <AppDPIAwarenessMode>PerMonitor</AppDPIAwarenessMode>
<VerInfo_MajorVer>0</VerInfo_MajorVer> <VerInfo_MajorVer>0</VerInfo_MajorVer>
<VerInfo_MinorVer>8</VerInfo_MinorVer> <VerInfo_MinorVer>8</VerInfo_MinorVer>
<VerInfo_Release>5</VerInfo_Release> <VerInfo_Release>6</VerInfo_Release>
<TMSWebBrowser>1</TMSWebBrowser>
<TMSUseJSDebugger>2</TMSUseJSDebugger> <TMSUseJSDebugger>2</TMSUseJSDebugger>
<TMSWebBrowser>1</TMSWebBrowser>
<TMSWebSingleInstance>1</TMSWebSingleInstance> <TMSWebSingleInstance>1</TMSWebSingleInstance>
<TMSWebOutputPath>..\emT3XDataServer\bin\static</TMSWebOutputPath> <TMSWebOutputPath>..\emT3XDataServer\bin\static</TMSWebOutputPath>
</PropertyGroup> </PropertyGroup>
......
object ApiDatabase: TApiDatabase object ApiDatabase: TApiDatabase
OnCreate = DataModuleCreate OnCreate = DataModuleCreate
Height = 358 Height = 453
Width = 519 Width = 641
object ucETaskApi: TUniConnection object ucETaskApi: TUniConnection
AutoCommit = False AutoCommit = False
ProviderName = 'MySQL' ProviderName = 'MySQL'
Database = 'eTask' Database = 'eTask'
LoginPrompt = False LoginPrompt = False
Left = 51 Left = 255
Top = 67 Top = 379
end end
object MySQLUniProvider1: TMySQLUniProvider object MySQLUniProvider1: TMySQLUniProvider
Left = 56 Left = 354
Top = 14 Top = 378
end end
object uqUsers: TUniQuery object uqUsers: TUniQuery
Connection = ucETaskApi Connection = ucETaskApi
SQL.Strings = ( SQL.Strings = (
'SELECT USER_ID, NAME, STATUS from users ORDER BY NAME') 'SELECT USER_ID, NAME, STATUS from users ORDER BY NAME')
OnCalcFields = uqUsersCalcFields OnCalcFields = uqUsersCalcFields
Left = 408 Left = 538
Top = 20 Top = 24
object uqUsersUSER_ID: TIntegerField object uqUsersUSER_ID: TIntegerField
FieldName = 'USER_ID' FieldName = 'USER_ID'
Required = True Required = True
...@@ -56,8 +56,8 @@ object ApiDatabase: TApiDatabase ...@@ -56,8 +56,8 @@ object ApiDatabase: TApiDatabase
' ISSUE = :ISSUE,' ' ISSUE = :ISSUE,'
' NOTES = :NOTES' ' NOTES = :NOTES'
'WHERE TASK_ITEM_ID = :TASK_ITEM_ID') 'WHERE TASK_ITEM_ID = :TASK_ITEM_ID')
Left = 408 Left = 538
Top = 242 Top = 232
ParamData = < ParamData = <
item item
DataType = ftUnknown DataType = ftUnknown
...@@ -141,8 +141,8 @@ object ApiDatabase: TApiDatabase ...@@ -141,8 +141,8 @@ object ApiDatabase: TApiDatabase
'from task_items' 'from task_items'
'where TASK_ID = :TASK_ID' 'where TASK_ID = :TASK_ID'
'order by ITEM_NUM') 'order by ITEM_NUM')
Left = 62 Left = 56
Top = 138 Top = 26
ParamData = < ParamData = <
item item
DataType = ftUnknown DataType = ftUnknown
...@@ -248,8 +248,8 @@ object ApiDatabase: TApiDatabase ...@@ -248,8 +248,8 @@ object ApiDatabase: TApiDatabase
' '#39#39',' ' '#39#39','
' '#39#39 ' '#39#39
')') ')')
Left = 412 Left = 536
Top = 300 Top = 282
ParamData = < ParamData = <
item item
DataType = ftUnknown DataType = ftUnknown
...@@ -281,8 +281,8 @@ object ApiDatabase: TApiDatabase ...@@ -281,8 +281,8 @@ object ApiDatabase: TApiDatabase
'left join project p' 'left join project p'
' on p.PROJECT_ID = t.PROJECT_ID' ' on p.PROJECT_ID = t.PROJECT_ID'
'where t.TASK_ID = :TASK_ID') 'where t.TASK_ID = :TASK_ID')
Left = 60 Left = 54
Top = 242 Top = 82
ParamData = < ParamData = <
item item
DataType = ftUnknown DataType = ftUnknown
...@@ -330,46 +330,6 @@ object ApiDatabase: TApiDatabase ...@@ -330,46 +330,6 @@ object ApiDatabase: TApiDatabase
Size = 30 Size = 30
end end
end end
object uqTaskItemUsers: TUniQuery
Connection = ucETaskApi
SQL.Strings = (
'select'
' TASK_ITEM_USER_ID,'
' TASK_ID,'
' USER_TYPE,'
' NAME'
'from task_item_user'
'where TASK_ID = :TASK_ID'
'order by USER_TYPE, NAME')
Left = 62
Top = 188
ParamData = <
item
DataType = ftUnknown
Name = 'TASK_ID'
Value = nil
end>
object uqTaskItemUsersTASK_ITEM_USER_ID: TStringField
FieldName = 'TASK_ITEM_USER_ID'
Required = True
Size = 50
end
object uqTaskItemUsersTASK_ID: TStringField
FieldName = 'TASK_ID'
Required = True
Size = 7
end
object uqTaskItemUsersUSER_TYPE: TStringField
FieldName = 'USER_TYPE'
Required = True
Size = 8
end
object uqTaskItemUsersNAME: TStringField
FieldName = 'NAME'
Required = True
Size = 50
end
end
object uqTaskItemCodes: TUniQuery object uqTaskItemCodes: TUniQuery
Connection = ucETaskApi Connection = ucETaskApi
SQL.Strings = ( SQL.Strings = (
...@@ -381,7 +341,7 @@ object ApiDatabase: TApiDatabase ...@@ -381,7 +341,7 @@ object ApiDatabase: TApiDatabase
'WHERE CODE_TYPE = '#39'STATUS'#39 'WHERE CODE_TYPE = '#39'STATUS'#39
'ORDER BY CODE') 'ORDER BY CODE')
Left = 60 Left = 60
Top = 296 Top = 140
object uqTaskItemCodesCODE: TStringField object uqTaskItemCodesCODE: TStringField
FieldName = 'CODE' FieldName = 'CODE'
Required = True Required = True
...@@ -521,7 +481,7 @@ object ApiDatabase: TApiDatabase ...@@ -521,7 +481,7 @@ object ApiDatabase: TApiDatabase
'where TASK_ITEM_ID = :TASK_ITEM_ID' 'where TASK_ITEM_ID = :TASK_ITEM_ID'
' and TASK_ID = :TASK_ID') ' and TASK_ID = :TASK_ID')
Left = 234 Left = 234
Top = 232 Top = 242
ParamData = < ParamData = <
item item
DataType = ftUnknown DataType = ftUnknown
...@@ -546,8 +506,8 @@ object ApiDatabase: TApiDatabase ...@@ -546,8 +506,8 @@ object ApiDatabase: TApiDatabase
' coalesce(max(ITEM_NUM), 0) as MAX_ITEM_NUM' ' coalesce(max(ITEM_NUM), 0) as MAX_ITEM_NUM'
'from task_items' 'from task_items'
'where TASK_ID = :TASK_ID') 'where TASK_ID = :TASK_ID')
Left = 236 Left = 234
Top = 290 Top = 296
ParamData = < ParamData = <
item item
DataType = ftUnknown DataType = ftUnknown
...@@ -561,8 +521,8 @@ object ApiDatabase: TApiDatabase ...@@ -561,8 +521,8 @@ object ApiDatabase: TApiDatabase
'delete from task_items' 'delete from task_items'
'where TASK_ITEM_ID = :TASK_ITEM_ID' 'where TASK_ITEM_ID = :TASK_ITEM_ID'
' and TASK_ID = :TASK_ID') ' and TASK_ID = :TASK_ID')
Left = 408 Left = 536
Top = 182 Top = 180
ParamData = < ParamData = <
item item
DataType = ftUnknown DataType = ftUnknown
...@@ -582,8 +542,8 @@ object ApiDatabase: TApiDatabase ...@@ -582,8 +542,8 @@ object ApiDatabase: TApiDatabase
'set ITEM_NUM = ITEM_NUM - 1' 'set ITEM_NUM = ITEM_NUM - 1'
'where TASK_ID = :TASK_ID' 'where TASK_ID = :TASK_ID'
' and ITEM_NUM > :OLD_ITEM_NUM') ' and ITEM_NUM > :OLD_ITEM_NUM')
Left = 408 Left = 536
Top = 130 Top = 126
ParamData = < ParamData = <
item item
DataType = ftUnknown DataType = ftUnknown
...@@ -603,8 +563,8 @@ object ApiDatabase: TApiDatabase ...@@ -603,8 +563,8 @@ object ApiDatabase: TApiDatabase
'set ITEM_NUM = ITEM_NUM + 1' 'set ITEM_NUM = ITEM_NUM + 1'
'where TASK_ID = :TASK_ID' 'where TASK_ID = :TASK_ID'
' and ITEM_NUM > :INSERT_AFTER_ITEM_NUM') ' and ITEM_NUM > :INSERT_AFTER_ITEM_NUM')
Left = 408 Left = 538
Top = 80 Top = 76
ParamData = < ParamData = <
item item
DataType = ftUnknown DataType = ftUnknown
...@@ -617,4 +577,202 @@ object ApiDatabase: TApiDatabase ...@@ -617,4 +577,202 @@ object ApiDatabase: TApiDatabase
Value = nil Value = nil
end> end>
end end
object uqProjectReportedUsers: TUniQuery
Connection = ucETaskApi
SQL.Strings = (
'select distinct'
' tiu.NAME'
'from task_item_user tiu'
'join tasks project_tasks'
' on project_tasks.TASK_ID = tiu.TASK_ID'
'join tasks target_task'
' on target_task.PROJECT_ID = project_tasks.PROJECT_ID'
'where target_task.TASK_ID = :TASK_ID'
' and tiu.USER_TYPE = '#39'Reported'#39
'order by tiu.NAME')
Left = 58
Top = 256
ParamData = <
item
DataType = ftUnknown
Name = 'TASK_ID'
Value = nil
end>
object uqProjectReportedUsersNAME: TStringField
FieldName = 'NAME'
Required = True
Size = 50
end
end
object uqTaskAssignedUsers: TUniQuery
Connection = ucETaskApi
SQL.Strings = (
'select distinct'
' TASK_ITEM_USER_ID,'
' TASK_ID,'
' USER_TYPE,'
' NAME'
'from task_item_user'
'where TASK_ID = :TASK_ID'
' and USER_TYPE = '#39'Assigned'#39
'order by NAME')
Left = 60
Top = 200
ParamData = <
item
DataType = ftUnknown
Name = 'TASK_ID'
Value = nil
end>
object uqTaskAssignedUsersTASK_ITEM_USER_ID: TStringField
FieldName = 'TASK_ITEM_USER_ID'
Required = True
Size = 50
end
object uqTaskAssignedUsersTASK_ID: TStringField
FieldName = 'TASK_ID'
Required = True
Size = 7
end
object uqTaskAssignedUsersUSER_TYPE: TStringField
FieldName = 'USER_TYPE'
Required = True
Size = 8
end
object uqTaskAssignedUsersNAME: TStringField
FieldName = 'NAME'
Required = True
Size = 50
end
end
object uqAssignedInsert: TUniQuery
Connection = ucETaskApi
SQL.Strings = (
'insert into task_item_user ('
' TASK_ITEM_USER_ID,'
' TASK_ID,'
' USER_TYPE,'
' NAME'
')'
'values ('
' :TASK_ITEM_USER_ID,'
' :TASK_ID,'
' '#39'Assigned'#39','
' :NAME'
')')
Left = 382
Top = 24
ParamData = <
item
DataType = ftUnknown
Name = 'TASK_ITEM_USER_ID'
Value = nil
end
item
DataType = ftUnknown
Name = 'TASK_ID'
Value = nil
end
item
DataType = ftUnknown
Name = 'NAME'
Value = nil
end>
end
object uqAssignedRename: TUniQuery
LocalUpdate = True
Connection = ucETaskApi
SQL.Strings = (
'update task_item_user'
'set NAME = :NEW_NAME'
'where TASK_ITEM_USER_ID = :TASK_ITEM_USER_ID'
' and TASK_ID = :TASK_ID'
' and USER_TYPE = '#39'Assigned'#39)
Left = 382
Top = 84
ParamData = <
item
DataType = ftUnknown
Name = 'NEW_NAME'
Value = nil
end
item
DataType = ftUnknown
Name = 'TASK_ITEM_USER_ID'
Value = nil
end
item
DataType = ftUnknown
Name = 'TASK_ID'
Value = nil
end>
end
object uqAssignedDelete: TUniQuery
Connection = ucETaskApi
SQL.Strings = (
'delete from task_item_user'
'where TASK_ITEM_USER_ID = :TASK_ITEM_USER_ID'
' and TASK_ID = :TASK_ID'
' and USER_TYPE = '#39'Assigned'#39)
Left = 384
Top = 140
ParamData = <
item
DataType = ftUnknown
Name = 'TASK_ITEM_USER_ID'
Value = nil
end
item
DataType = ftUnknown
Name = 'TASK_ID'
Value = nil
end>
end
object uqRenameAssignedTo: TUniQuery
Connection = ucETaskApi
SQL.Strings = (
'update task_items'
'set ASSIGNED_TO = :NEW_NAME'
'where TASK_ID = :TASK_ID'
' and lower(ASSIGNED_TO) = lower(:OLD_NAME)')
Left = 386
Top = 196
ParamData = <
item
DataType = ftUnknown
Name = 'NEW_NAME'
Value = nil
end
item
DataType = ftUnknown
Name = 'TASK_ID'
Value = nil
end
item
DataType = ftUnknown
Name = 'OLD_NAME'
Value = nil
end>
end
object uqBlankAssignedTo: TUniQuery
Connection = ucETaskApi
SQL.Strings = (
'update task_items'
'set ASSIGNED_TO = '#39#39
'where TASK_ID = :TASK_ID'
' and lower(ASSIGNED_TO) = lower(:NAME)')
Left = 388
Top = 254
ParamData = <
item
DataType = ftUnknown
Name = 'TASK_ID'
Value = nil
end
item
DataType = ftUnknown
Name = 'NAME'
Value = nil
end>
end
end end
...@@ -44,11 +44,6 @@ type ...@@ -44,11 +44,6 @@ type
uqTaskHeaderPROJECT_ID: TStringField; uqTaskHeaderPROJECT_ID: TStringField;
uqTaskHeaderSUBJECT: TStringField; uqTaskHeaderSUBJECT: TStringField;
uqTaskHeaderPROJECT_NAME: TStringField; uqTaskHeaderPROJECT_NAME: TStringField;
uqTaskItemUsers: TUniQuery;
uqTaskItemUsersTASK_ITEM_USER_ID: TStringField;
uqTaskItemUsersTASK_ID: TStringField;
uqTaskItemUsersUSER_TYPE: TStringField;
uqTaskItemUsersNAME: TStringField;
uqTaskItemCodes: TUniQuery; uqTaskItemCodes: TUniQuery;
uqTaskItemCodesCODE: TStringField; uqTaskItemCodesCODE: TStringField;
uqTaskItemCodesCODE_DESC: TStringField; uqTaskItemCodesCODE_DESC: TStringField;
...@@ -66,6 +61,18 @@ type ...@@ -66,6 +61,18 @@ type
uqDeleteTaskRow: TUniQuery; uqDeleteTaskRow: TUniQuery;
uqShiftTaskRowsAfterDelete: TUniQuery; uqShiftTaskRowsAfterDelete: TUniQuery;
uqShiftTaskRowsForInsert: TUniQuery; uqShiftTaskRowsForInsert: TUniQuery;
uqProjectReportedUsers: TUniQuery;
uqTaskAssignedUsers: TUniQuery;
uqAssignedInsert: TUniQuery;
uqAssignedRename: TUniQuery;
uqAssignedDelete: TUniQuery;
uqRenameAssignedTo: TUniQuery;
uqBlankAssignedTo: TUniQuery;
uqProjectReportedUsersNAME: TStringField;
uqTaskAssignedUsersTASK_ITEM_USER_ID: TStringField;
uqTaskAssignedUsersTASK_ID: TStringField;
uqTaskAssignedUsersUSER_TYPE: TStringField;
uqTaskAssignedUsersNAME: TStringField;
procedure DataModuleCreate(Sender: TObject); procedure DataModuleCreate(Sender: TObject);
procedure uqUsersCalcFields(DataSet: TDataSet); procedure uqUsersCalcFields(DataSet: TDataSet);
private private
......
...@@ -26,7 +26,7 @@ type ...@@ -26,7 +26,7 @@ type
reportedBy: string; reportedBy: string;
assignedTo: string; assignedTo: string;
status: string; status: string;
statusDate: Variant; statusDate: TDateTime;
fixedVersion: string; fixedVersion: string;
formSection: string; formSection: string;
issue: string; issue: string;
...@@ -68,6 +68,13 @@ type ...@@ -68,6 +68,13 @@ type
destructor Destroy; override; destructor Destroy; override;
end; end;
TTaskUserOptionsResponse = class
public
assignedToOptions: TList<TTaskUserOption>;
constructor Create;
destructor Destroy; override;
end;
TTaskRowSave = class TTaskRowSave = class
public public
taskItemId: integer; taskItemId: integer;
...@@ -87,6 +94,8 @@ type ...@@ -87,6 +94,8 @@ type
end; end;
type type
[ServiceContract, Model(API_MODEL)] [ServiceContract, Model(API_MODEL)]
IApiService = interface(IInvokable) IApiService = interface(IInvokable)
...@@ -94,7 +103,9 @@ type ...@@ -94,7 +103,9 @@ type
function GetTaskItems(taskId: string): TTaskItemsResponse; function GetTaskItems(taskId: string): TTaskItemsResponse;
[HttpPost] function AddTaskRow(taskId: string; insertAfterItemNum: Integer): Boolean; [HttpPost] function AddTaskRow(taskId: string; insertAfterItemNum: Integer): Boolean;
[HttpPost] function SaveTaskRow(Item: TTaskRowSave): Boolean; [HttpPost] function SaveTaskRow(Item: TTaskRowSave): Boolean;
function TestApi(messageText: string): TJSONObject; [HttpPost] function AddAssignedName(taskId: string; name: string): TTaskUserOptionsResponse;
[HttpPost] function RenameAssignedName(taskId: string; oldName: string; newName: string): TTaskUserOptionsResponse;
[HttpPost] function DeleteAssignedName(taskId: string; name: string): TTaskUserOptionsResponse;
procedure MoveTaskRow(const taskId: Integer; const taskItemId: Integer; const newItemNum: Integer); procedure MoveTaskRow(const taskId: Integer; const taskItemId: Integer; const newItemNum: Integer);
function DeleteTaskRow(const taskId: Integer; const taskItemId: Integer): Boolean; function DeleteTaskRow(const taskId: Integer; const taskItemId: Integer): Boolean;
end; end;
...@@ -119,6 +130,18 @@ begin ...@@ -119,6 +130,18 @@ begin
inherited; inherited;
end; end;
constructor TTaskUserOptionsResponse.Create;
begin
inherited;
assignedToOptions := TList<TTaskUserOption>.Create;
end;
destructor TTaskUserOptionsResponse.Destroy;
begin
assignedToOptions.Free;
inherited;
end;
initialization initialization
RegisterServiceType(TypeInfo(IApiService)); RegisterServiceType(TypeInfo(IApiService));
......
[Settings] [Settings]
MemoLogLevel=4 MemoLogLevel=4
FileLogLevel=4 FileLogLevel=4
webClientVersion=0.8.5 webClientVersion=0.8.6
LogFileNum=146 LogFileNum=152
[Database] [Database]
--Server=192.168.116.131 --Server=192.168.116.131
......
...@@ -114,10 +114,10 @@ ...@@ -114,10 +114,10 @@
<VerInfo_Locale>1033</VerInfo_Locale> <VerInfo_Locale>1033</VerInfo_Locale>
<DCC_ExeOutput>.\bin</DCC_ExeOutput> <DCC_ExeOutput>.\bin</DCC_ExeOutput>
<DCC_UnitSearchPath>C:\RADTOOLS\FastMM4;$(DCC_UnitSearchPath)</DCC_UnitSearchPath> <DCC_UnitSearchPath>C:\RADTOOLS\FastMM4;$(DCC_UnitSearchPath)</DCC_UnitSearchPath>
<VerInfo_Keys>CompanyName=EM Systems;FileDescription=$(MSBuildProjectName);FileVersion=0.8.5.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=0.9.11;Comments=</VerInfo_Keys> <VerInfo_Keys>CompanyName=EM Systems;FileDescription=$(MSBuildProjectName);FileVersion=0.8.6.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=0.9.11;Comments=</VerInfo_Keys>
<VerInfo_MajorVer>0</VerInfo_MajorVer> <VerInfo_MajorVer>0</VerInfo_MajorVer>
<VerInfo_MinorVer>8</VerInfo_MinorVer> <VerInfo_MinorVer>8</VerInfo_MinorVer>
<VerInfo_Release>5</VerInfo_Release> <VerInfo_Release>6</VerInfo_Release>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win64)'!=''"> <PropertyGroup Condition="'$(Cfg_1_Win64)'!=''">
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode> <AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment