Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
emT3web
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Mac Stephens
emT3web
Commits
9ca47a7c
Commit
9ca47a7c
authored
Apr 14, 2026
by
Mac Stephens
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' into dev
parents
8a2f5e16
72262daa
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
822 additions
and
72 deletions
+822
-72
.gitignore
.gitignore
+3
-1
ConnectionModule.pas
emT3Web/ConnectionModule.pas
+1
-1
Utils.pas
emT3Web/Utils.pas
+18
-0
View.TaskItems.dfm
emT3Web/View.TaskItems.dfm
+14
-0
View.TaskItems.html
emT3Web/View.TaskItems.html
+6
-5
View.TaskItems.pas
emT3Web/View.TaskItems.pas
+0
-0
app.css
emT3Web/css/app.css
+153
-0
emT3web.dpr
emT3Web/emT3web.dpr
+2
-1
emT3web.dproj
emT3Web/emT3web.dproj
+5
-4
uDropdownHelpers.pas
emT3Web/uDropdownHelpers.pas
+184
-0
uNameOffCanvas.pas
emT3Web/uNameOffCanvas.pas
+34
-27
Api.Database.dfm
emT3XDataServer/Source/Api.Database.dfm
+328
-19
Api.Database.pas
emT3XDataServer/Source/Api.Database.pas
+16
-1
Api.Service.pas
emT3XDataServer/Source/Api.Service.pas
+50
-5
Api.ServiceImpl.pas
emT3XDataServer/Source/Api.ServiceImpl.pas
+0
-0
Auth.ServiceImpl.pas
emT3XDataServer/Source/Auth.ServiceImpl.pas
+2
-2
emT3XDataServer.ini
emT3XDataServer/bin/emT3XDataServer.ini
+4
-4
emT3XDataServer.dproj
emT3XDataServer/emT3XDataServer.dproj
+2
-2
No files found.
.gitignore
View file @
9ca47a7c
emT3VCLDemo/__history/
emT3VCLDemo/__history/
emT3VCLDemo/__recovery/
emT3VCLDemo/Win64x/
emT3VCLDemo/Win64x/
emT3Web/__history/
emT3Web/__history/
emT3Web/__recovery/
emT3Web/__recovery/
...
@@ -19,4 +20,5 @@ emT3XDataServer/Win32/
...
@@ -19,4 +20,5 @@ emT3XDataServer/Win32/
*.txt
*.txt
*.zip
*.zip
emT3VCLDemo/__recovery/
emT3Web/css/__history/
emT3Web/ConnectionModule.pas
View file @
9ca47a7c
...
@@ -20,7 +20,7 @@ type
...
@@ -20,7 +20,7 @@ type
FUnauthorizedAccessProc
:
TUnauthorizedAccessProc
;
FUnauthorizedAccessProc
:
TUnauthorizedAccessProc
;
public
public
const
clientVersion
=
'0.8.
6
'
;
const
clientVersion
=
'0.8.
8
'
;
procedure
InitApp
(
SuccessProc
:
TSuccessProc
;
procedure
InitApp
(
SuccessProc
:
TSuccessProc
;
UnauthorizedAccessProc
:
TUnauthorizedAccessProc
);
UnauthorizedAccessProc
:
TUnauthorizedAccessProc
);
procedure
SetClientConfig
(
Callback
:
TVersionCheckCallback
);
procedure
SetClientConfig
(
Callback
:
TVersionCheckCallback
);
...
...
emT3Web/Utils.pas
View file @
9ca47a7c
...
@@ -14,6 +14,7 @@ procedure ShowToast(const MessageText: string; const ToastType: string = 'succes
...
@@ -14,6 +14,7 @@ procedure ShowToast(const MessageText: string; const ToastType: string = 'succes
procedure
ShowConfirmationModal
(
msg
,
leftLabel
,
rightLabel
:
string
;
ConfirmProc
:
TProc
<
Boolean
>);
procedure
ShowConfirmationModal
(
msg
,
leftLabel
,
rightLabel
:
string
;
ConfirmProc
:
TProc
<
Boolean
>);
procedure
ShowNotificationModal
(
msg
:
string
);
procedure
ShowNotificationModal
(
msg
:
string
);
procedure
ShowAppDialog
(
const
Msg
:
string
;
const
Title
:
string
=
'emT3 web app'
;
ReloadOnClose
:
Boolean
=
False
;
ButtonText
:
string
=
'Close'
);
procedure
ShowAppDialog
(
const
Msg
:
string
;
const
Title
:
string
=
'emT3 web app'
;
ReloadOnClose
:
Boolean
=
False
;
ButtonText
:
string
=
'Close'
);
function
NormalizeDateValue
(
const
Value
:
string
):
string
;
implementation
implementation
...
@@ -281,5 +282,22 @@ begin
...
@@ -281,5 +282,22 @@ begin
end
;
end
;
function
NormalizeDateValue
(
const
Value
:
string
):
string
;
var
normalizedValue
:
string
;
begin
normalizedValue
:=
Trim
(
Value
);
if
(
normalizedValue
=
''
)
or
SameText
(
normalizedValue
,
'1899-12-30'
)
or
SameText
(
normalizedValue
,
'12/30/1899'
)
or
SameText
(
normalizedValue
,
'1899-12-30T00:00:00'
)
or
SameText
(
normalizedValue
,
'1899-12-30 00:00:00'
)
then
Result
:=
''
else
Result
:=
normalizedValue
;
end
;
end
.
end
.
emT3Web/View.TaskItems.dfm
View file @
9ca47a7c
...
@@ -44,6 +44,20 @@ object FTaskItems: TFTaskItems
...
@@ -44,6 +44,20 @@ object FTaskItems: TFTaskItems
WidthPercent = 100.000000000000000000
WidthPercent = 100.000000000000000000
OnClick = btnDeleteRowClick
OnClick = btnDeleteRowClick
end
end
object btnInsertRow: TWebButton
Left = 78
Top = 178
Width = 96
Height = 25
Caption = 'Insert Row'
ChildOrder = 3
ElementID = 'btn_insert_row'
ElementFont = efCSS
HeightStyle = ssAuto
HeightPercent = 100.000000000000000000
WidthPercent = 100.000000000000000000
OnClick = btnInsertRowClick
end
object xdwcTasks: TXDataWebClient
object xdwcTasks: TXDataWebClient
Connection = DMConnection.ApiConnection
Connection = DMConnection.ApiConnection
Left = 506
Left = 506
...
...
emT3Web/View.TaskItems.html
View file @
9ca47a7c
...
@@ -5,11 +5,12 @@
...
@@ -5,11 +5,12 @@
<div
class=
"d-flex align-items-center gap-3"
>
<div
class=
"d-flex align-items-center gap-3"
>
<div
id=
"lbl_total_rows"
></div>
<div
id=
"lbl_total_rows"
></div>
<div
class=
"d-flex gap-2"
>
<div
class=
"d-flex gap-2"
>
<button
id=
"btn_add_row"
class=
"btn btn-sm btn-success"
>
Add Row
</button>
<button
id=
"btn_add_row"
class=
"btn btn-sm btn-success"
>
Add Row
</button>
<button
id=
"btn_delete_row"
class=
"btn btn-sm btn-danger"
>
Delete Row
</button>
<button
id=
"btn_delete_row"
class=
"btn btn-sm btn-danger"
>
Delete Row
</button>
<button
id=
"btn_reload"
class=
"btn btn-sm btn-primary"
>
Reload
</button>
<button
id=
"btn_insert_row"
class=
"btn btn-sm btn-success"
>
Insert Row
</button>
</div>
<button
id=
"btn_reload"
class=
"btn btn-sm btn-primary"
>
Reload
</button>
</div>
</div>
</div>
</div>
</div>
...
...
emT3Web/View.TaskItems.pas
View file @
9ca47a7c
This diff is collapsed.
Click to expand it.
emT3Web/css/app.css
View file @
9ca47a7c
...
@@ -62,6 +62,9 @@ input[data-field="itemNum"] {
...
@@ -62,6 +62,9 @@ input[data-field="itemNum"] {
top
:
0
;
top
:
0
;
z-index
:
2
;
z-index
:
2
;
background
:
var
(
--bs-body-bg
);
background
:
var
(
--bs-body-bg
);
white-space
:
nowrap
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
}
}
.tasks-vscroll
thead
th
.th-resize
{
.tasks-vscroll
thead
th
.th-resize
{
...
@@ -86,5 +89,155 @@ span.card {
...
@@ -86,5 +89,155 @@ span.card {
user-select
:
none
;
user-select
:
none
;
}
}
.tasks-table
{
table-layout
:
fixed
;
}
.tasks-table
th
{
overflow
:
hidden
;
}
.tasks-table
td
{
overflow
:
visible
;
}
.nowrap-cell
,
.wrap-cell
{
overflow
:
visible
;
}
.tasks-table
.dropdown
,
.task-dd-toggle
,
.task-dd-label
,
.cell-input
,
.cell-textarea
{
min-width
:
0
;
}
.dropdown-menu
{
z-index
:
1055
;
}
.task-dd-toggle.status-cannot-duplicate
{
--bs-btn-color
:
#41464b
;
--bs-btn-bg
:
#e2e3e5
;
--bs-btn-border-color
:
#c4c8cb
;
--bs-btn-hover-color
:
#41464b
;
--bs-btn-hover-bg
:
#d3d4d5
;
--bs-btn-hover-border-color
:
#b9bcc0
;
--bs-btn-active-color
:
#41464b
;
--bs-btn-active-bg
:
#c6c7c8
;
--bs-btn-active-border-color
:
#b9bcc0
;
}
.task-dd-toggle.status-cannot-test
{
--bs-btn-color
:
#842029
;
--bs-btn-bg
:
#f8d7da
;
--bs-btn-border-color
:
#f1aeb5
;
--bs-btn-hover-color
:
#842029
;
--bs-btn-hover-bg
:
#f1c2c7
;
--bs-btn-hover-border-color
:
#ea9ca6
;
--bs-btn-active-color
:
#842029
;
--bs-btn-active-bg
:
#eaadb5
;
--bs-btn-active-border-color
:
#e68592
;
}
.task-dd-toggle.status-future-enhancement
{
--bs-btn-color
:
#055160
;
--bs-btn-bg
:
#cff4fc
;
--bs-btn-border-color
:
#9eeaf9
;
--bs-btn-hover-color
:
#055160
;
--bs-btn-hover-bg
:
#b6effb
;
--bs-btn-hover-border-color
:
#86e5f8
;
--bs-btn-active-color
:
#055160
;
--bs-btn-active-bg
:
#9eeaf9
;
--bs-btn-active-border-color
:
#74dff6
;
}
.task-dd-toggle.status-fixed-verified
{
--bs-btn-color
:
#0f5132
;
--bs-btn-bg
:
#d1e7dd
;
--bs-btn-border-color
:
#a3cfbb
;
--bs-btn-hover-color
:
#0f5132
;
--bs-btn-hover-bg
:
#badbcc
;
--bs-btn-hover-border-color
:
#8fc5a9
;
--bs-btn-active-color
:
#0f5132
;
--bs-btn-active-bg
:
#a3cfbb
;
--bs-btn-active-border-color
:
#7db89d
;
}
.task-dd-toggle.status-fixed
{
--bs-btn-color
:
#146c43
;
--bs-btn-bg
:
#d1e7dd
;
--bs-btn-border-color
:
#a3cfbb
;
--bs-btn-hover-color
:
#146c43
;
--bs-btn-hover-bg
:
#badbcc
;
--bs-btn-hover-border-color
:
#8fc5a9
;
--bs-btn-active-color
:
#146c43
;
--bs-btn-active-bg
:
#a3cfbb
;
--bs-btn-active-border-color
:
#7db89d
;
}
.task-dd-toggle.status-investigating
{
--bs-btn-color
:
#664d03
;
--bs-btn-bg
:
#fff3cd
;
--bs-btn-border-color
:
#ffe69c
;
--bs-btn-hover-color
:
#664d03
;
--bs-btn-hover-bg
:
#ffecb5
;
--bs-btn-hover-border-color
:
#ffdf7e
;
--bs-btn-active-color
:
#664d03
;
--bs-btn-active-bg
:
#ffe69c
;
--bs-btn-active-border-color
:
#ffd966
;
}
.task-dd-toggle.status-not-fixed
{
--bs-btn-color
:
#842029
;
--bs-btn-bg
:
#f8d7da
;
--bs-btn-border-color
:
#f1aeb5
;
--bs-btn-hover-color
:
#842029
;
--bs-btn-hover-bg
:
#f1c2c7
;
--bs-btn-hover-border-color
:
#ea9ca6
;
--bs-btn-active-color
:
#842029
;
--bs-btn-active-bg
:
#eaadb5
;
--bs-btn-active-border-color
:
#e68592
;
}
.task-dd-toggle.status-non-issue
{
--bs-btn-color
:
#432874
;
--bs-btn-bg
:
#e2d9f3
;
--bs-btn-border-color
:
#cbbbe8
;
--bs-btn-hover-color
:
#432874
;
--bs-btn-hover-bg
:
#d6caee
;
--bs-btn-hover-border-color
:
#bea9e2
;
--bs-btn-active-color
:
#432874
;
--bs-btn-active-bg
:
#cbbbe8
;
--bs-btn-active-border-color
:
#b89ddd
;
}
.task-dd-toggle.status-possibly-a-problem
{
--bs-btn-color
:
#7a3e00
;
--bs-btn-bg
:
#ffe5d0
;
--bs-btn-border-color
:
#f7c79d
;
--bs-btn-hover-color
:
#7a3e00
;
--bs-btn-hover-bg
:
#ffd7b8
;
--bs-btn-hover-border-color
:
#f2ba88
;
--bs-btn-active-color
:
#7a3e00
;
--bs-btn-active-bg
:
#f7c79d
;
--bs-btn-active-border-color
:
#eeaf69
;
}
.task-dd-toggle.status-default
{
--bs-btn-color
:
#212529
;
--bs-btn-bg
:
#f8f9fa
;
--bs-btn-border-color
:
#dee2e6
;
--bs-btn-hover-color
:
#212529
;
--bs-btn-hover-bg
:
#e9ecef
;
--bs-btn-hover-border-color
:
#ced4da
;
--bs-btn-active-color
:
#212529
;
--bs-btn-active-bg
:
#dee2e6
;
--bs-btn-active-border-color
:
#ced4da
;
}
emT3Web/emT3web.dpr
View file @
9ca47a7c
...
@@ -12,7 +12,8 @@ uses
...
@@ -12,7 +12,8 @@ uses
View.Main in 'View.Main.pas' {FViewMain: TWebForm} {*.html},
View.Main in 'View.Main.pas' {FViewMain: TWebForm} {*.html},
Utils in 'Utils.pas',
Utils in 'Utils.pas',
View.TaskItems in 'View.TaskItems.pas' {FTaskItems: TWebForm} {*.html},
View.TaskItems in 'View.TaskItems.pas' {FTaskItems: TWebForm} {*.html},
uNameManager in 'uNameManager.pas';
uNameOffCanvas in 'uNameOffCanvas.pas',
uDropdownHelpers in 'uDropdownHelpers.pas';
{$R *.res}
{$R *.res}
...
...
emT3Web/emT3web.dproj
View file @
9ca47a7c
...
@@ -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.
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>
<VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=0.8.
8
.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>6</VerInfo_Release>
<VerInfo_Release>8</VerInfo_Release>
<TMSWebBrowser>5</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>
...
@@ -142,7 +142,8 @@
...
@@ -142,7 +142,8 @@
<FormType>dfm</FormType>
<FormType>dfm</FormType>
<DesignClass>TWebForm</DesignClass>
<DesignClass>TWebForm</DesignClass>
</DCCReference>
</DCCReference>
<DCCReference Include="uNameManager.pas"/>
<DCCReference Include="uNameOffCanvas.pas"/>
<DCCReference Include="uDropdownHelpers.pas"/>
<None Include="index.html"/>
<None Include="index.html"/>
<None Include="css\app.css"/>
<None Include="css\app.css"/>
<None Include="config\config.json"/>
<None Include="config\config.json"/>
...
...
emT3Web/uDropdownHelpers.pas
0 → 100644
View file @
9ca47a7c
unit
uDropdownHelpers
;
interface
uses
System
.
SysUtils
,
System
.
Classes
,
JS
,
Web
,
WEBLib
.
Graphics
,
WEBLib
.
Controls
,
WEBLib
.
Forms
,
WEBLib
.
Dialogs
;
function
GetTaskStatusClass
(
const
AStatus
:
string
):
string
;
procedure
ClearTaskStatusClasses
(
const
AElement
:
TJSHTMLElement
);
procedure
ApplyTaskStatusClass
(
const
AElement
:
TJSHTMLElement
;
const
AStatus
:
string
);
function
ExtractOptionNames
(
const
SourceArray
:
TJSArray
):
TJSArray
;
function
ExtractCodeDescs
(
const
SourceArray
:
TJSArray
):
TJSArray
;
function
ExtractAssignedOptionNames
(
const
ResponseResult
:
TJSObject
):
TJSArray
;
function
ExtractReportedOptionNames
(
const
ResponseResult
:
TJSObject
):
TJSArray
;
function
ExtractApplicationOptionNames
(
const
ResponseResult
:
TJSObject
):
TJSArray
;
function
FindOptionIgnoreCase
(
const
AItems
:
TJSArray
;
const
AName
:
string
):
string
;
function
GetOptionsForField
(
const
AFieldName
:
string
;
const
AApplicationOptions
,
AReportedByOptions
,
AAssignedToOptions
:
TJSArray
):
TJSArray
;
procedure
FocusTrigger
(
const
ATriggerId
:
string
);
implementation
function
GetTaskStatusClass
(
const
AStatus
:
string
):
string
;
var
statusText
:
string
;
begin
statusText
:=
Trim
(
AStatus
);
if
SameText
(
statusText
,
'Cannot Duplicate'
)
then
Result
:=
'status-cannot-duplicate'
else
if
SameText
(
statusText
,
'Cannot Test'
)
then
Result
:=
'status-cannot-test'
else
if
SameText
(
statusText
,
'Future Enhancement'
)
then
Result
:=
'status-future-enhancement'
else
if
SameText
(
statusText
,
'Fixed - Verified'
)
then
Result
:=
'status-fixed-verified'
else
if
SameText
(
statusText
,
'Fixed'
)
then
Result
:=
'status-fixed'
else
if
SameText
(
statusText
,
'Investigating'
)
then
Result
:=
'status-investigating'
else
if
SameText
(
statusText
,
'Not Fixed'
)
then
Result
:=
'status-not-fixed'
else
if
SameText
(
statusText
,
'Non-Issue'
)
then
Result
:=
'status-non-issue'
else
if
SameText
(
statusText
,
'Possibly a Problem'
)
then
Result
:=
'status-possibly-a-problem'
else
Result
:=
'status-default'
;
end
;
procedure
ClearTaskStatusClasses
(
const
AElement
:
TJSHTMLElement
);
begin
if
not
Assigned
(
AElement
)
then
Exit
;
AElement
.
classList
.
remove
(
'status-cannot-duplicate'
);
AElement
.
classList
.
remove
(
'status-cannot-test'
);
AElement
.
classList
.
remove
(
'status-future-enhancement'
);
AElement
.
classList
.
remove
(
'status-fixed-verified'
);
AElement
.
classList
.
remove
(
'status-fixed'
);
AElement
.
classList
.
remove
(
'status-investigating'
);
AElement
.
classList
.
remove
(
'status-not-fixed'
);
AElement
.
classList
.
remove
(
'status-non-issue'
);
AElement
.
classList
.
remove
(
'status-possibly-a-problem'
);
AElement
.
classList
.
remove
(
'status-default'
);
end
;
procedure
ApplyTaskStatusClass
(
const
AElement
:
TJSHTMLElement
;
const
AStatus
:
string
);
begin
if
not
Assigned
(
AElement
)
then
Exit
;
ClearTaskStatusClasses
(
AElement
);
AElement
.
classList
.
add
(
GetTaskStatusClass
(
AStatus
));
end
;
function
ExtractOptionNames
(
const
SourceArray
:
TJSArray
):
TJSArray
;
var
i
:
Integer
;
optionObj
:
TJSObject
;
begin
Result
:=
TJSArray
.
new
;
if
not
Assigned
(
SourceArray
)
then
Exit
;
for
i
:=
0
to
SourceArray
.
length
-
1
do
begin
optionObj
:=
TJSObject
(
SourceArray
[
i
]);
if
Assigned
(
optionObj
)
then
Result
.
push
(
string
(
optionObj
[
'name'
]));
end
;
end
;
function
ExtractCodeDescs
(
const
SourceArray
:
TJSArray
):
TJSArray
;
var
i
:
Integer
;
optionObj
:
TJSObject
;
begin
Result
:=
TJSArray
.
new
;
if
not
Assigned
(
SourceArray
)
then
Exit
;
for
i
:=
0
to
SourceArray
.
length
-
1
do
begin
optionObj
:=
TJSObject
(
SourceArray
[
i
]);
if
Assigned
(
optionObj
)
then
Result
.
push
(
string
(
optionObj
[
'codeDesc'
]));
end
;
end
;
function
ExtractAssignedOptionNames
(
const
ResponseResult
:
TJSObject
):
TJSArray
;
begin
if
not
Assigned
(
ResponseResult
)
then
Exit
(
TJSArray
.
new
);
Result
:=
ExtractOptionNames
(
TJSArray
(
ResponseResult
[
'assignedToOptions'
]));
end
;
function
ExtractReportedOptionNames
(
const
ResponseResult
:
TJSObject
):
TJSArray
;
begin
if
not
Assigned
(
ResponseResult
)
then
Exit
(
TJSArray
.
new
);
Result
:=
ExtractOptionNames
(
TJSArray
(
ResponseResult
[
'reportedByOptions'
]));
end
;
function
ExtractApplicationOptionNames
(
const
ResponseResult
:
TJSObject
):
TJSArray
;
begin
if
not
Assigned
(
ResponseResult
)
then
Exit
(
TJSArray
.
new
);
Result
:=
ExtractOptionNames
(
TJSArray
(
ResponseResult
[
'applicationOptions'
]));
end
;
function
FindOptionIgnoreCase
(
const
AItems
:
TJSArray
;
const
AName
:
string
):
string
;
var
i
:
Integer
;
itemText
:
string
;
begin
Result
:=
''
;
if
not
Assigned
(
AItems
)
then
Exit
;
for
i
:=
0
to
AItems
.
length
-
1
do
begin
itemText
:=
string
(
AItems
[
i
]);
if
SameText
(
itemText
,
Trim
(
AName
))
then
Exit
(
itemText
);
end
;
end
;
function
GetOptionsForField
(
const
AFieldName
:
string
;
const
AApplicationOptions
,
AReportedByOptions
,
AAssignedToOptions
:
TJSArray
):
TJSArray
;
begin
if
SameText
(
AFieldName
,
'application'
)
then
Result
:=
AApplicationOptions
else
if
SameText
(
AFieldName
,
'reportedBy'
)
then
Result
:=
AReportedByOptions
else
if
SameText
(
AFieldName
,
'assignedTo'
)
then
Result
:=
AAssignedToOptions
else
Result
:=
nil
;
end
;
procedure
FocusTrigger
(
const
ATriggerId
:
string
);
var
el
:
TJSHTMLElement
;
begin
if
ATriggerId
=
''
then
Exit
;
el
:=
TJSHTMLElement
(
document
.
getElementById
(
ATriggerId
));
if
Assigned
(
el
)
then
el
.
focus
;
end
;
end
.
emT3Web/uName
Manager
.pas
→
emT3Web/uName
OffCanvas
.pas
View file @
9ca47a7c
unit
uName
Manager
;
unit
uName
OffCanvas
;
interface
interface
...
@@ -8,9 +8,9 @@ uses
...
@@ -8,9 +8,9 @@ uses
type
type
TGetOptionsEvent
=
reference
to
function
(
const
AFieldName
:
string
):
TJSArray
;
TGetOptionsEvent
=
reference
to
function
(
const
AFieldName
:
string
):
TJSArray
;
TFocusTriggerEvent
=
reference
to
procedure
(
const
ATriggerId
:
string
);
TFocusTriggerEvent
=
reference
to
procedure
(
const
ATriggerId
:
string
);
TAdd
AssignedNameEvent
=
reference
to
procedure
(
const
ARowIndex
:
Integer
;
const
ANewName
:
string
);
TAdd
ManagedNameEvent
=
reference
to
procedure
(
const
AFieldName
:
string
;
const
ARowIndex
:
Integer
;
const
ANewName
:
string
);
TRename
AssignedNameEvent
=
reference
to
procedure
(
const
AOldName
,
ANewName
:
string
);
TRename
ManagedNameEvent
=
reference
to
procedure
(
const
AFieldName
,
AOldName
,
ANewName
:
string
);
TDelete
AssignedNameEvent
=
reference
to
procedure
(
const
AName
:
string
);
TDelete
ManagedNameEvent
=
reference
to
procedure
(
const
AFieldName
,
AName
:
string
);
TNameManager
=
class
TNameManager
=
class
private
private
...
@@ -20,9 +20,9 @@ type
...
@@ -20,9 +20,9 @@ type
FCurrentEditName
:
string
;
FCurrentEditName
:
string
;
FGetOptions
:
TGetOptionsEvent
;
FGetOptions
:
TGetOptionsEvent
;
FFocusTrigger
:
TFocusTriggerEvent
;
FFocusTrigger
:
TFocusTriggerEvent
;
FAdd
AssignedName
:
TAddAssign
edNameEvent
;
FAdd
ManagedName
:
TAddManag
edNameEvent
;
FRename
AssignedName
:
TRenameAssign
edNameEvent
;
FRename
ManagedName
:
TRenameManag
edNameEvent
;
FDelete
AssignedName
:
TDeleteAssign
edNameEvent
;
FDelete
ManagedName
:
TDeleteManag
edNameEvent
;
procedure
AddAnotherClick
(
Event
:
TJSEvent
);
procedure
AddAnotherClick
(
Event
:
TJSEvent
);
procedure
SaveClick
(
Event
:
TJSEvent
);
procedure
SaveClick
(
Event
:
TJSEvent
);
procedure
NameInputKeyDown
(
Event
:
TJSEvent
);
procedure
NameInputKeyDown
(
Event
:
TJSEvent
);
...
@@ -40,9 +40,9 @@ type
...
@@ -40,9 +40,9 @@ type
constructor
Create
(
constructor
Create
(
const
AGetOptions
:
TGetOptionsEvent
;
const
AGetOptions
:
TGetOptionsEvent
;
const
AFocusTrigger
:
TFocusTriggerEvent
;
const
AFocusTrigger
:
TFocusTriggerEvent
;
const
AAdd
AssignedName
:
TAddAssign
edNameEvent
;
const
AAdd
ManagedName
:
TAddManag
edNameEvent
;
const
ARename
AssignedName
:
TRenameAssign
edNameEvent
;
const
ARename
ManagedName
:
TRenameManag
edNameEvent
;
const
ADelete
AssignedName
:
TDeleteAssign
edNameEvent
const
ADelete
ManagedName
:
TDeleteManag
edNameEvent
);
);
procedure
BindControls
;
procedure
BindControls
;
...
@@ -70,17 +70,17 @@ end;
...
@@ -70,17 +70,17 @@ end;
constructor
TNameManager
.
Create
(
constructor
TNameManager
.
Create
(
const
AGetOptions
:
TGetOptionsEvent
;
const
AGetOptions
:
TGetOptionsEvent
;
const
AFocusTrigger
:
TFocusTriggerEvent
;
const
AFocusTrigger
:
TFocusTriggerEvent
;
const
AAdd
AssignedName
:
TAddAssign
edNameEvent
;
const
AAdd
ManagedName
:
TAddManag
edNameEvent
;
const
ARename
AssignedName
:
TRenameAssign
edNameEvent
;
const
ARename
ManagedName
:
TRenameManag
edNameEvent
;
const
ADelete
AssignedName
:
TDeleteAssign
edNameEvent
const
ADelete
ManagedName
:
TDeleteManag
edNameEvent
);
);
begin
begin
inherited
Create
;
inherited
Create
;
FGetOptions
:=
AGetOptions
;
FGetOptions
:=
AGetOptions
;
FFocusTrigger
:=
AFocusTrigger
;
FFocusTrigger
:=
AFocusTrigger
;
FAdd
AssignedName
:=
AAddAssign
edName
;
FAdd
ManagedName
:=
AAddManag
edName
;
FRename
AssignedName
:=
ARenameAssign
edName
;
FRename
ManagedName
:=
ARenameManag
edName
;
FDelete
AssignedName
:=
ADeleteAssign
edName
;
FDelete
ManagedName
:=
ADeleteManag
edName
;
FCurrentField
:=
''
;
FCurrentField
:=
''
;
FCurrentRowIndex
:=
-
1
;
FCurrentRowIndex
:=
-
1
;
FCurrentTriggerId
:=
''
;
FCurrentTriggerId
:=
''
;
...
@@ -257,18 +257,18 @@ begin
...
@@ -257,18 +257,18 @@ begin
Exit
;
Exit
;
end
;
end
;
if
not
SameText
(
FCurrentField
,
'assignedTo'
)
then
if
not
(
SameText
(
FCurrentField
,
'assignedTo'
)
or
SameText
(
FCurrentField
,
'application'
)
or
SameText
(
FCurrentField
,
'reportedBy'
)
)
then
Exit
;
Exit
;
if
FCurrentEditName
<>
''
then
if
FCurrentEditName
<>
''
then
begin
begin
if
Assigned
(
FRename
Assign
edName
)
then
if
Assigned
(
FRename
Manag
edName
)
then
FRename
AssignedName
(
FCurrentEditName
,
newName
);
FRename
ManagedName
(
FCurrentField
,
FCurrentEditName
,
newName
);
end
end
else
else
begin
begin
if
Assigned
(
FAdd
Assign
edName
)
then
if
Assigned
(
FAdd
Manag
edName
)
then
FAdd
AssignedName
(
FCurrentRowIndex
,
newName
);
FAdd
ManagedName
(
FCurrentField
,
FCurrentRowIndex
,
newName
);
end
;
end
;
CloseManager
;
CloseManager
;
...
@@ -356,7 +356,7 @@ begin
...
@@ -356,7 +356,7 @@ begin
Event
.
preventDefault
;
Event
.
preventDefault
;
Event
.
stopPropagation
;
Event
.
stopPropagation
;
if
not
SameText
(
FCurrentField
,
'assignedTo'
)
then
if
not
(
SameText
(
FCurrentField
,
'assignedTo'
)
or
SameText
(
FCurrentField
,
'application'
)
or
SameText
(
FCurrentField
,
'reportedBy'
)
)
then
Exit
;
Exit
;
el
:=
TJSHTMLElement
(
Event
.
currentTarget
);
el
:=
TJSHTMLElement
(
Event
.
currentTarget
);
...
@@ -383,7 +383,7 @@ begin
...
@@ -383,7 +383,7 @@ begin
Event
.
preventDefault
;
Event
.
preventDefault
;
Event
.
stopPropagation
;
Event
.
stopPropagation
;
if
not
SameText
(
FCurrentField
,
'assignedTo'
)
then
if
not
(
SameText
(
FCurrentField
,
'assignedTo'
)
or
SameText
(
FCurrentField
,
'application'
)
or
SameText
(
FCurrentField
,
'reportedBy'
)
)
then
Exit
;
Exit
;
el
:=
TJSHTMLElement
(
Event
.
currentTarget
);
el
:=
TJSHTMLElement
(
Event
.
currentTarget
);
...
@@ -391,8 +391,8 @@ begin
...
@@ -391,8 +391,8 @@ begin
if
nameToDelete
=
''
then
if
nameToDelete
=
''
then
Exit
;
Exit
;
if
Assigned
(
FDelete
Assign
edName
)
then
if
Assigned
(
FDelete
Manag
edName
)
then
FDelete
AssignedName
(
nameToDelete
);
FDelete
ManagedName
(
FCurrentField
,
nameToDelete
);
CloseManager
;
CloseManager
;
end
;
end
;
...
@@ -401,7 +401,7 @@ procedure TNameManager.OpenManager(const AFieldName: string; const ARowIndex: In
...
@@ -401,7 +401,7 @@ procedure TNameManager.OpenManager(const AFieldName: string; const ARowIndex: In
var
var
titleEl
:
TJSHTMLElement
;
titleEl
:
TJSHTMLElement
;
begin
begin
if
not
SameText
(
AFieldName
,
'assignedTo'
)
then
if
not
(
SameText
(
AFieldName
,
'assignedTo'
)
or
SameText
(
AFieldName
,
'application'
)
or
SameText
(
AFieldName
,
'reportedBy'
)
)
then
Exit
;
Exit
;
FCurrentField
:=
AFieldName
;
FCurrentField
:=
AFieldName
;
...
@@ -411,7 +411,14 @@ begin
...
@@ -411,7 +411,14 @@ begin
titleEl
:=
GetElement
(
'nm_title'
);
titleEl
:=
GetElement
(
'nm_title'
);
if
Assigned
(
titleEl
)
then
if
Assigned
(
titleEl
)
then
titleEl
.
innerHTML
:=
'Manage Assigned To'
;
begin
if
SameText
(
AFieldName
,
'application'
)
then
titleEl
.
innerHTML
:=
'Manage Application'
else
if
SameText
(
AFieldName
,
'reportedBy'
)
then
titleEl
.
innerHTML
:=
'Manage Reported By'
else
titleEl
.
innerHTML
:=
'Manage Assigned To'
;
end
;
ResetInputArea
;
ResetInputArea
;
RenderExistingList
;
RenderExistingList
;
...
...
emT3XDataServer/Source/Api.Database.dfm
View file @
9ca47a7c
object ApiDatabase: TApiDatabase
object ApiDatabase: TApiDatabase
OnCreate = DataModuleCreate
OnCreate = DataModuleCreate
Height = 4
53
Height = 4
75
Width =
641
Width =
996
object ucETaskApi: TUniConnection
object ucETaskApi: TUniConnection
AutoCommit = False
AutoCommit = False
ProviderName = 'MySQL'
ProviderName = 'MySQL'
Database = 'eTask'
Database = 'eTask'
LoginPrompt = False
LoginPrompt = False
Left = 2
55
Left = 2
67
Top = 3
79
Top = 3
95
end
end
object MySQLUniProvider1: TMySQLUniProvider
object MySQLUniProvider1: TMySQLUniProvider
Left =
354
Left =
416
Top = 3
7
8
Top = 3
9
8
end
end
object uqUsers: TUniQuery
object uqUsers: TUniQuery
Connection = ucETaskApi
Connection = ucETaskApi
...
@@ -236,17 +236,17 @@ object ApiDatabase: TApiDatabase
...
@@ -236,17 +236,17 @@ object ApiDatabase: TApiDatabase
'values ('
'values ('
' :TASK_ID,'
' :TASK_ID,'
' :ITEM_NUM,'
' :ITEM_NUM,'
'
'#39#39'
,'
'
null
,'
'
'#39#39'
,'
'
null
,'
'
curdate()
,'
'
null
,'
'
curdate()
,'
'
null
,'
'
'#39#39'
,'
'
null
,'
'
'#39#39'
,'
'
null
,'
'
'#39#39'
,'
'
null
,'
'
'#39#39'
,'
'
null
,'
'
'#39#39'
,'
'
null
,'
'
'#39#39'
,'
'
null
,'
'
'#39#39
'
null'
')')
')')
Left = 536
Left = 536
Top = 282
Top = 282
...
@@ -580,7 +580,8 @@ object ApiDatabase: TApiDatabase
...
@@ -580,7 +580,8 @@ object ApiDatabase: TApiDatabase
object uqProjectReportedUsers: TUniQuery
object uqProjectReportedUsers: TUniQuery
Connection = ucETaskApi
Connection = ucETaskApi
SQL.Strings = (
SQL.Strings = (
'select distinct'
'select'
' min(tiu.TASK_ITEM_USER_ID) as TASK_ITEM_USER_ID,'
' tiu.NAME'
' tiu.NAME'
'from task_item_user tiu'
'from task_item_user tiu'
'join tasks project_tasks'
'join tasks project_tasks'
...
@@ -589,6 +590,7 @@ object ApiDatabase: TApiDatabase
...
@@ -589,6 +590,7 @@ object ApiDatabase: TApiDatabase
' on target_task.PROJECT_ID = project_tasks.PROJECT_ID'
' on target_task.PROJECT_ID = project_tasks.PROJECT_ID'
'where target_task.TASK_ID = :TASK_ID'
'where target_task.TASK_ID = :TASK_ID'
' and tiu.USER_TYPE = '#39'Reported'#39
' and tiu.USER_TYPE = '#39'Reported'#39
'group by tiu.NAME'
'order by tiu.NAME')
'order by tiu.NAME')
Left = 58
Left = 58
Top = 256
Top = 256
...
@@ -598,6 +600,11 @@ object ApiDatabase: TApiDatabase
...
@@ -598,6 +600,11 @@ object ApiDatabase: TApiDatabase
Name = 'TASK_ID'
Name = 'TASK_ID'
Value = nil
Value = nil
end>
end>
object uqProjectReportedUsersTASK_ITEM_USER_ID: TStringField
FieldName = 'TASK_ITEM_USER_ID'
ReadOnly = True
Size = 50
end
object uqProjectReportedUsersNAME: TStringField
object uqProjectReportedUsersNAME: TStringField
FieldName = 'NAME'
FieldName = 'NAME'
Required = True
Required = True
...
@@ -758,7 +765,7 @@ object ApiDatabase: TApiDatabase
...
@@ -758,7 +765,7 @@ object ApiDatabase: TApiDatabase
Connection = ucETaskApi
Connection = ucETaskApi
SQL.Strings = (
SQL.Strings = (
'update task_items'
'update task_items'
'set ASSIGNED_TO =
'#39#39
'set ASSIGNED_TO =
null'
'where TASK_ID = :TASK_ID'
'where TASK_ID = :TASK_ID'
' and lower(ASSIGNED_TO) = lower(:NAME)')
' and lower(ASSIGNED_TO) = lower(:NAME)')
Left = 388
Left = 388
...
@@ -775,4 +782,306 @@ object ApiDatabase: TApiDatabase
...
@@ -775,4 +782,306 @@ object ApiDatabase: TApiDatabase
Value = nil
Value = nil
end>
end>
end
end
object uqProjectApplications: TUniQuery
Connection = ucETaskApi
SQL.Strings = (
'select distinct'
' tia.TASK_ITEM_APPLICATION_ID,'
' tia.PROJECT_ID,'
' tia.NAME'
'from task_item_application tia'
'join tasks target_task'
' on target_task.PROJECT_ID = tia.PROJECT_ID'
'where target_task.TASK_ID = :TASK_ID'
'order by tia.NAME')
Left = 58
Top = 314
ParamData = <
item
DataType = ftUnknown
Name = 'TASK_ID'
Value = nil
end>
object uqProjectApplicationsTASK_ITEM_APPLICATION_ID: TIntegerField
FieldName = 'TASK_ITEM_APPLICATION_ID'
end
object uqProjectApplicationsPROJECT_ID: TStringField
FieldName = 'PROJECT_ID'
Required = True
Size = 7
end
object uqProjectApplicationsNAME: TStringField
FieldName = 'NAME'
Required = True
Size = 255
end
end
object uqApplicationInsert: TUniQuery
Connection = ucETaskApi
SQL.Strings = (
'insert into task_item_application ('
' PROJECT_ID,'
' NAME'
')'
'values ('
' :PROJECT_ID,'
' :NAME'
')')
Left = 700
Top = 28
ParamData = <
item
DataType = ftUnknown
Name = 'PROJECT_ID'
Value = nil
end
item
DataType = ftUnknown
Name = 'NAME'
Value = nil
end>
end
object uqApplicationRename: TUniQuery
Connection = ucETaskApi
SQL.Strings = (
'update task_item_application'
'set NAME = :NEW_NAME'
'where TASK_ITEM_APPLICATION_ID = :TASK_ITEM_APPLICATION_ID'
' and PROJECT_ID = :PROJECT_ID')
Left = 700
Top = 82
ParamData = <
item
DataType = ftUnknown
Name = 'NEW_NAME'
Value = nil
end
item
DataType = ftUnknown
Name = 'TASK_ITEM_APPLICATION_ID'
Value = nil
end
item
DataType = ftUnknown
Name = 'PROJECT_ID'
Value = nil
end>
end
object uqApplicationDelete: TUniQuery
Connection = ucETaskApi
SQL.Strings = (
'delete from task_item_application'
'where TASK_ITEM_APPLICATION_ID = :TASK_ITEM_APPLICATION_ID'
' and PROJECT_ID = :PROJECT_ID')
Left = 700
Top = 136
ParamData = <
item
DataType = ftUnknown
Name = 'TASK_ITEM_APPLICATION_ID'
Value = nil
end
item
DataType = ftUnknown
Name = 'PROJECT_ID'
Value = nil
end>
end
object uqRenameTaskItemApplication: TUniQuery
Connection = ucETaskApi
SQL.Strings = (
'update task_items ti'
'join tasks t'
' on t.TASK_ID = ti.TASK_ID'
'set ti.APPLICATION = :NEW_NAME'
'where t.PROJECT_ID = :PROJECT_ID'
' and lower(ti.APPLICATION) = lower(:OLD_NAME)')
Left = 698
Top = 188
ParamData = <
item
DataType = ftUnknown
Name = 'NEW_NAME'
Value = nil
end
item
DataType = ftUnknown
Name = 'PROJECT_ID'
Value = nil
end
item
DataType = ftUnknown
Name = 'OLD_NAME'
Value = nil
end>
end
object uqBlankTaskItemApplication: TUniQuery
Connection = ucETaskApi
SQL.Strings = (
'update task_items ti'
'join tasks t'
' on t.TASK_ID = ti.TASK_ID'
'set ti.APPLICATION = null'
'where t.PROJECT_ID = :PROJECT_ID'
' and lower(ti.APPLICATION) = lower(:NAME)')
Left = 696
Top = 244
ParamData = <
item
DataType = ftUnknown
Name = 'PROJECT_ID'
Value = nil
end
item
DataType = ftUnknown
Name = 'NAME'
Value = nil
end>
end
object uqReportedInsert: 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'Reported'#39','
' :NAME'
')')
Left = 858
Top = 32
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 uqReportedRename: TUniQuery
Connection = ucETaskApi
SQL.Strings = (
'update task_item_user tiu'
'join tasks t'
' on t.TASK_ID = tiu.TASK_ID'
'join tasks target_task'
' on target_task.PROJECT_ID = t.PROJECT_ID'
'set tiu.NAME = :NEW_NAME'
'where target_task.TASK_ID = :TASK_ID'
' and tiu.USER_TYPE = '#39'Reported'#39
' and tiu.TASK_ITEM_USER_ID = :TASK_ITEM_USER_ID')
Left = 858
Top = 88
ParamData = <
item
DataType = ftUnknown
Name = 'NEW_NAME'
Value = nil
end
item
DataType = ftUnknown
Name = 'TASK_ID'
Value = nil
end
item
DataType = ftUnknown
Name = 'TASK_ITEM_USER_ID'
Value = nil
end>
end
object uqReportedDelete: TUniQuery
Connection = ucETaskApi
SQL.Strings = (
'delete tiu'
'from task_item_user tiu'
'join tasks t'
' on t.TASK_ID = tiu.TASK_ID'
'join tasks target_task'
' on target_task.PROJECT_ID = t.PROJECT_ID'
'where target_task.TASK_ID = :TASK_ID'
' and tiu.USER_TYPE = '#39'Reported'#39
' and tiu.TASK_ITEM_USER_ID = :TASK_ITEM_USER_ID')
Left = 858
Top = 144
ParamData = <
item
DataType = ftUnknown
Name = 'TASK_ID'
Value = nil
end
item
DataType = ftUnknown
Name = 'TASK_ITEM_USER_ID'
Value = nil
end>
end
object uqBlankTaskItemReportedBy: TUniQuery
Connection = ucETaskApi
SQL.Strings = (
'update task_items ti'
'join tasks t'
' on t.TASK_ID = ti.TASK_ID'
'join tasks target_task'
' on target_task.PROJECT_ID = t.PROJECT_ID'
'set ti.REPORTED_BY = null'
'where target_task.TASK_ID = :TASK_ID'
' and lower(ti.REPORTED_BY) = lower(:NAME)')
Left = 860
Top = 264
ParamData = <
item
DataType = ftUnknown
Name = 'TASK_ID'
Value = nil
end
item
DataType = ftUnknown
Name = 'NAME'
Value = nil
end>
end
object uqRenameTaskItemReportedBy: TUniQuery
Connection = ucETaskApi
SQL.Strings = (
'update task_items ti'
'join tasks t'
' on t.TASK_ID = ti.TASK_ID'
'join tasks target_task'
' on target_task.PROJECT_ID = t.PROJECT_ID'
'set ti.REPORTED_BY = :NEW_NAME'
'where target_task.TASK_ID = :TASK_ID'
' and lower(ti.REPORTED_BY) = lower(:OLD_NAME)')
Left = 858
Top = 202
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
end
end
emT3XDataServer/Source/Api.Database.pas
View file @
9ca47a7c
...
@@ -68,11 +68,26 @@ type
...
@@ -68,11 +68,26 @@ type
uqAssignedDelete
:
TUniQuery
;
uqAssignedDelete
:
TUniQuery
;
uqRenameAssignedTo
:
TUniQuery
;
uqRenameAssignedTo
:
TUniQuery
;
uqBlankAssignedTo
:
TUniQuery
;
uqBlankAssignedTo
:
TUniQuery
;
uqProjectReportedUsersNAME
:
TStringField
;
uqTaskAssignedUsersTASK_ITEM_USER_ID
:
TStringField
;
uqTaskAssignedUsersTASK_ITEM_USER_ID
:
TStringField
;
uqTaskAssignedUsersTASK_ID
:
TStringField
;
uqTaskAssignedUsersTASK_ID
:
TStringField
;
uqTaskAssignedUsersUSER_TYPE
:
TStringField
;
uqTaskAssignedUsersUSER_TYPE
:
TStringField
;
uqTaskAssignedUsersNAME
:
TStringField
;
uqTaskAssignedUsersNAME
:
TStringField
;
uqProjectApplications
:
TUniQuery
;
uqApplicationInsert
:
TUniQuery
;
uqApplicationRename
:
TUniQuery
;
uqApplicationDelete
:
TUniQuery
;
uqRenameTaskItemApplication
:
TUniQuery
;
uqBlankTaskItemApplication
:
TUniQuery
;
uqProjectApplicationsTASK_ITEM_APPLICATION_ID
:
TIntegerField
;
uqProjectApplicationsPROJECT_ID
:
TStringField
;
uqProjectApplicationsNAME
:
TStringField
;
uqReportedInsert
:
TUniQuery
;
uqReportedRename
:
TUniQuery
;
uqReportedDelete
:
TUniQuery
;
uqBlankTaskItemReportedBy
:
TUniQuery
;
uqRenameTaskItemReportedBy
:
TUniQuery
;
uqProjectReportedUsersTASK_ITEM_USER_ID
:
TStringField
;
uqProjectReportedUsersNAME
:
TStringField
;
procedure
DataModuleCreate
(
Sender
:
TObject
);
procedure
DataModuleCreate
(
Sender
:
TObject
);
procedure
uqUsersCalcFields
(
DataSet
:
TDataSet
);
procedure
uqUsersCalcFields
(
DataSet
:
TDataSet
);
private
private
...
...
emT3XDataServer/Source/Api.Service.pas
View file @
9ca47a7c
...
@@ -48,7 +48,11 @@ type
...
@@ -48,7 +48,11 @@ type
name
:
string
;
name
:
string
;
end
;
end
;
type
TTaskApplicationOption
=
class
public
name
:
string
;
end
;
TTaskItemCode
=
class
TTaskItemCode
=
class
public
public
code
:
string
;
code
:
string
;
...
@@ -61,6 +65,7 @@ type
...
@@ -61,6 +65,7 @@ type
count
:
integer
;
count
:
integer
;
task
:
TTaskHeader
;
task
:
TTaskHeader
;
items
:
TList
<
TTaskItem
>;
items
:
TList
<
TTaskItem
>;
applicationOptions
:
TList
<
TTaskApplicationOption
>;
reportedByOptions
:
TList
<
TTaskUserOption
>;
reportedByOptions
:
TList
<
TTaskUserOption
>;
assignedToOptions
:
TList
<
TTaskUserOption
>;
assignedToOptions
:
TList
<
TTaskUserOption
>;
statusOptions
:
TList
<
TTaskItemCode
>;
statusOptions
:
TList
<
TTaskItemCode
>;
...
@@ -71,6 +76,14 @@ type
...
@@ -71,6 +76,14 @@ type
TTaskUserOptionsResponse
=
class
TTaskUserOptionsResponse
=
class
public
public
assignedToOptions
:
TList
<
TTaskUserOption
>;
assignedToOptions
:
TList
<
TTaskUserOption
>;
reportedByOptions
:
TList
<
TTaskUserOption
>;
constructor
Create
;
destructor
Destroy
;
override
;
end
;
TTaskApplicationOptionsResponse
=
class
public
applicationOptions
:
TList
<
TTaskApplicationOption
>;
constructor
Create
;
constructor
Create
;
destructor
Destroy
;
override
;
destructor
Destroy
;
override
;
end
;
end
;
...
@@ -93,21 +106,37 @@ type
...
@@ -93,21 +106,37 @@ type
notes
:
string
;
notes
:
string
;
end
;
end
;
TTaskItemFieldSave
=
class
public
taskItemId
:
Integer
;
fieldName
:
string
;
value
:
string
;
end
;
type
type
[
ServiceContract
,
Model
(
API_MODEL
)]
[
ServiceContract
,
Model
(
API_MODEL
)]
IApiService
=
interface
(
IInvokable
)
IApiService
=
interface
(
IInvokable
)
[
'{0EFB33D7-8C4C-4F3C-9BC3-8B4D444B5F69}'
]
[
'{0EFB33D7-8C4C-4F3C-9BC3-8B4D444B5F69}'
]
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
AddAssignedName
(
taskId
:
string
;
name
:
string
):
TTaskUserOptionsResponse
;
[
HttpPost
]
function
AddAssignedName
(
taskId
:
string
;
name
:
string
):
TTaskUserOptionsResponse
;
[
HttpPost
]
function
RenameAssignedName
(
taskId
:
string
;
oldName
:
string
;
newName
:
string
):
TTaskUserOptionsResponse
;
[
HttpPost
]
function
RenameAssignedName
(
taskId
:
string
;
oldName
:
string
;
newName
:
string
):
TTaskUserOptionsResponse
;
[
HttpPost
]
function
DeleteAssignedName
(
taskId
:
string
;
name
:
string
):
TTaskUserOptionsResponse
;
[
HttpPost
]
function
DeleteAssignedName
(
taskId
:
string
;
name
:
string
):
TTaskUserOptionsResponse
;
[
HttpPost
]
function
AddReportedName
(
taskId
:
string
;
name
:
string
):
TTaskUserOptionsResponse
;
[
HttpPost
]
function
RenameReportedName
(
taskId
:
string
;
oldName
:
string
;
newName
:
string
):
TTaskUserOptionsResponse
;
[
HttpPost
]
function
DeleteReportedName
(
taskId
:
string
;
name
:
string
):
TTaskUserOptionsResponse
;
[
HttpPost
]
function
AddApplicationName
(
taskId
:
string
;
name
:
string
):
TTaskApplicationOptionsResponse
;
[
HttpPost
]
function
RenameApplicationName
(
taskId
:
string
;
oldName
:
string
;
newName
:
string
):
TTaskApplicationOptionsResponse
;
[
HttpPost
]
function
DeleteApplicationName
(
taskId
:
string
;
name
:
string
):
TTaskApplicationOptionsResponse
;
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
;
function
SaveTaskItemField
(
const
Item
:
TTaskItemFieldSave
):
Boolean
;
end
;
end
;
implementation
implementation
...
@@ -116,6 +145,7 @@ constructor TTaskItemsResponse.Create;
...
@@ -116,6 +145,7 @@ constructor TTaskItemsResponse.Create;
begin
begin
inherited
;
inherited
;
items
:=
TList
<
TTaskItem
>.
Create
;
items
:=
TList
<
TTaskItem
>.
Create
;
applicationOptions
:=
TList
<
TTaskApplicationOption
>.
Create
;
reportedByOptions
:=
TList
<
TTaskUserOption
>.
Create
;
reportedByOptions
:=
TList
<
TTaskUserOption
>.
Create
;
assignedToOptions
:=
TList
<
TTaskUserOption
>.
Create
;
assignedToOptions
:=
TList
<
TTaskUserOption
>.
Create
;
statusOptions
:=
TList
<
TTaskItemCode
>.
Create
;
statusOptions
:=
TList
<
TTaskItemCode
>.
Create
;
...
@@ -124,6 +154,7 @@ end;
...
@@ -124,6 +154,7 @@ end;
destructor
TTaskItemsResponse
.
Destroy
;
destructor
TTaskItemsResponse
.
Destroy
;
begin
begin
items
.
Free
;
items
.
Free
;
applicationOptions
.
Free
;
reportedByOptions
.
Free
;
reportedByOptions
.
Free
;
assignedToOptions
.
Free
;
assignedToOptions
.
Free
;
statusOptions
.
Free
;
statusOptions
.
Free
;
...
@@ -134,11 +165,25 @@ constructor TTaskUserOptionsResponse.Create;
...
@@ -134,11 +165,25 @@ constructor TTaskUserOptionsResponse.Create;
begin
begin
inherited
;
inherited
;
assignedToOptions
:=
TList
<
TTaskUserOption
>.
Create
;
assignedToOptions
:=
TList
<
TTaskUserOption
>.
Create
;
reportedByOptions
:=
TList
<
TTaskUserOption
>.
Create
;
end
;
end
;
destructor
TTaskUserOptionsResponse
.
Destroy
;
destructor
TTaskUserOptionsResponse
.
Destroy
;
begin
begin
assignedToOptions
.
Free
;
assignedToOptions
:=
TList
<
TTaskUserOption
>.
Create
;
reportedByOptions
:=
TList
<
TTaskUserOption
>.
Create
;
inherited
;
end
;
constructor
TTaskApplicationOptionsResponse
.
Create
;
begin
inherited
;
applicationOptions
:=
TList
<
TTaskApplicationOption
>.
Create
;
end
;
destructor
TTaskApplicationOptionsResponse
.
Destroy
;
begin
applicationOptions
.
Free
;
inherited
;
inherited
;
end
;
end
;
...
...
emT3XDataServer/Source/Api.ServiceImpl.pas
View file @
9ca47a7c
This diff is collapsed.
Click to expand it.
emT3XDataServer/Source/Auth.ServiceImpl.pas
View file @
9ca47a7c
...
@@ -190,8 +190,8 @@ begin
...
@@ -190,8 +190,8 @@ begin
if
userState
=
0
then
if
userState
=
0
then
begin
begin
Logger
.
Log
(
2
,
'Login Error: Invalid
code
'
);
Logger
.
Log
(
2
,
'Login Error: Invalid
url parameters
'
);
raise
EXDataHttpUnauthorized
.
Create
(
'Invalid
code
'
);
raise
EXDataHttpUnauthorized
.
Create
(
'Invalid
url parameters
'
);
end
;
end
;
if
userState
=
1
then
if
userState
=
1
then
...
...
emT3XDataServer/bin/emT3XDataServer.ini
View file @
9ca47a7c
[Settings]
[Settings]
MemoLogLevel
=
4
MemoLogLevel
=
4
FileLogLevel
=
4
FileLogLevel
=
4
webClientVersion
=
0.8.
6
webClientVersion
=
0.8.
8
LogFileNum
=
1
52
LogFileNum
=
1
61
[Database]
[Database]
--Server
=
192.168.116.131
--Server
=
192.168.116.128
Server
=
192.168.102.131
Server
=
192.168.102.131
--Server
=
192.168.116.128
--Server
=
192.168.102.131
--Server
=
192.168.159.10
--Server
=
192.168.159.10
Database
=
eTask
Database
=
eTask
Username
=
root
Username
=
root
...
...
emT3XDataServer/emT3XDataServer.dproj
View file @
9ca47a7c
...
@@ -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.
6
.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.
8
.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>
6
</VerInfo_Release>
<VerInfo_Release>
8
</VerInfo_Release>
</PropertyGroup>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win64)'!=''">
<PropertyGroup Condition="'$(Cfg_1_Win64)'!=''">
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment