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
4a314fa8
Commit
4a314fa8
authored
Apr 13, 2026
by
Mac Stephens
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
v0.8.5 fixes Deployed 0.8.8
parent
071af034
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
569 additions
and
34 deletions
+569
-34
ConnectionModule.pas
emT3Web/ConnectionModule.pas
+1
-1
Utils.pas
emT3Web/Utils.pas
+18
-0
View.TaskItems.pas
emT3Web/View.TaskItems.pas
+0
-0
app.css
emT3Web/css/app.css
+152
-1
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
+7
-5
Api.Database.dfm
emT3XDataServer/Source/Api.Database.dfm
+168
-15
Api.Database.pas
emT3XDataServer/Source/Api.Database.pas
+7
-1
Api.Service.pas
emT3XDataServer/Source/Api.Service.pas
+21
-2
Api.ServiceImpl.pas
emT3XDataServer/Source/Api.ServiceImpl.pas
+0
-0
emT3XDataServer.ini
emT3XDataServer/bin/emT3XDataServer.ini
+2
-2
emT3XDataServer.dproj
emT3XDataServer/emT3XDataServer.dproj
+2
-2
No files found.
emT3Web/ConnectionModule.pas
View file @
4a314fa8
...
...
@@ -20,7 +20,7 @@ type
FUnauthorizedAccessProc
:
TUnauthorizedAccessProc
;
public
const
clientVersion
=
'0.8.
7
'
;
const
clientVersion
=
'0.8.
8
'
;
procedure
InitApp
(
SuccessProc
:
TSuccessProc
;
UnauthorizedAccessProc
:
TUnauthorizedAccessProc
);
procedure
SetClientConfig
(
Callback
:
TVersionCheckCallback
);
...
...
emT3Web/Utils.pas
View file @
4a314fa8
...
...
@@ -14,6 +14,7 @@ procedure ShowToast(const MessageText: string; const ToastType: string = 'succes
procedure
ShowConfirmationModal
(
msg
,
leftLabel
,
rightLabel
:
string
;
ConfirmProc
:
TProc
<
Boolean
>);
procedure
ShowNotificationModal
(
msg
:
string
);
procedure
ShowAppDialog
(
const
Msg
:
string
;
const
Title
:
string
=
'emT3 web app'
;
ReloadOnClose
:
Boolean
=
False
;
ButtonText
:
string
=
'Close'
);
function
NormalizeDateValue
(
const
Value
:
string
):
string
;
implementation
...
...
@@ -281,5 +282,22 @@ begin
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
.
emT3Web/View.TaskItems.pas
View file @
4a314fa8
This diff is collapsed.
Click to expand it.
emT3Web/css/app.css
View file @
4a314fa8
...
...
@@ -62,6 +62,9 @@ input[data-field="itemNum"] {
top
:
0
;
z-index
:
2
;
background
:
var
(
--bs-body-bg
);
white-space
:
nowrap
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
}
.tasks-vscroll
thead
th
.th-resize
{
...
...
@@ -86,7 +89,155 @@ span.card {
user-select
:
none
;
}
.
test-test
{}
.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 @
4a314fa8
...
...
@@ -12,7 +12,8 @@ uses
View.Main in 'View.Main.pas' {FViewMain: TWebForm} {*.html},
Utils in 'Utils.pas',
View.TaskItems in 'View.TaskItems.pas' {FTaskItems: TWebForm} {*.html},
uNameManager in 'uNameManager.pas';
uNameOffCanvas in 'uNameOffCanvas.pas',
uDropdownHelpers in 'uDropdownHelpers.pas';
{$R *.res}
...
...
emT3Web/emT3web.dproj
View file @
4a314fa8
...
...
@@ -94,12 +94,12 @@
<DCC_RemoteDebug>false</DCC_RemoteDebug>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Locale>1033</VerInfo_Locale>
<VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=0.8.
7
.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>
<VerInfo_MajorVer>0</VerInfo_MajorVer>
<VerInfo_MinorVer>8</VerInfo_MinorVer>
<VerInfo_Release>
7
</VerInfo_Release>
<TMSWebBrowser>
1
</TMSWebBrowser>
<VerInfo_Release>
8
</VerInfo_Release>
<TMSWebBrowser>
5
</TMSWebBrowser>
<TMSUseJSDebugger>2</TMSUseJSDebugger>
<TMSWebSingleInstance>1</TMSWebSingleInstance>
<TMSWebOutputPath>..\emT3XDataServer\bin\static</TMSWebOutputPath>
...
...
@@ -142,7 +142,8 @@
<FormType>dfm</FormType>
<DesignClass>TWebForm</DesignClass>
</DCCReference>
<DCCReference Include="uNameManager.pas"/>
<DCCReference Include="uNameOffCanvas.pas"/>
<DCCReference Include="uDropdownHelpers.pas"/>
<None Include="index.html"/>
<None Include="css\app.css"/>
<None Include="config\config.json"/>
...
...
emT3Web/uDropdownHelpers.pas
0 → 100644
View file @
4a314fa8
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 @
4a314fa8
unit
uName
Manager
;
unit
uName
OffCanvas
;
interface
...
...
@@ -257,7 +257,7 @@ begin
Exit
;
end
;
if
not
(
SameText
(
FCurrentField
,
'assignedTo'
)
or
SameText
(
FCurrentField
,
'application'
))
then
if
not
(
SameText
(
FCurrentField
,
'assignedTo'
)
or
SameText
(
FCurrentField
,
'application'
)
or
SameText
(
FCurrentField
,
'reportedBy'
)
)
then
Exit
;
if
FCurrentEditName
<>
''
then
...
...
@@ -356,7 +356,7 @@ begin
Event
.
preventDefault
;
Event
.
stopPropagation
;
if
not
(
SameText
(
FCurrentField
,
'assignedTo'
)
or
SameText
(
FCurrentField
,
'application'
))
then
if
not
(
SameText
(
FCurrentField
,
'assignedTo'
)
or
SameText
(
FCurrentField
,
'application'
)
or
SameText
(
FCurrentField
,
'reportedBy'
)
)
then
Exit
;
el
:=
TJSHTMLElement
(
Event
.
currentTarget
);
...
...
@@ -383,7 +383,7 @@ begin
Event
.
preventDefault
;
Event
.
stopPropagation
;
if
not
(
SameText
(
FCurrentField
,
'assignedTo'
)
or
SameText
(
FCurrentField
,
'application'
))
then
if
not
(
SameText
(
FCurrentField
,
'assignedTo'
)
or
SameText
(
FCurrentField
,
'application'
)
or
SameText
(
FCurrentField
,
'reportedBy'
)
)
then
Exit
;
el
:=
TJSHTMLElement
(
Event
.
currentTarget
);
...
...
@@ -401,7 +401,7 @@ procedure TNameManager.OpenManager(const AFieldName: string; const ARowIndex: In
var
titleEl
:
TJSHTMLElement
;
begin
if
not
(
SameText
(
AFieldName
,
'assignedTo'
)
or
SameText
(
AFieldName
,
'application'
))
then
if
not
(
SameText
(
AFieldName
,
'assignedTo'
)
or
SameText
(
AFieldName
,
'application'
)
or
SameText
(
AFieldName
,
'reportedBy'
)
)
then
Exit
;
FCurrentField
:=
AFieldName
;
...
...
@@ -414,6 +414,8 @@ begin
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
;
...
...
emT3XDataServer/Source/Api.Database.dfm
View file @
4a314fa8
object ApiDatabase: TApiDatabase
OnCreate = DataModuleCreate
Height = 475
Width =
803
Width =
996
object ucETaskApi: TUniConnection
AutoCommit = False
ProviderName = 'MySQL'
...
...
@@ -236,17 +236,17 @@ object ApiDatabase: TApiDatabase
'values ('
' :TASK_ID,'
' :ITEM_NUM,'
'
'#39#39'
,'
'
'#39#39'
,'
'
curdate()
,'
'
curdate()
,'
'
'#39#39'
,'
'
'#39#39'
,'
'
'#39#39'
,'
'
'#39#39'
,'
'
'#39#39'
,'
'
'#39#39'
,'
'
'#39#39
'
null
,'
'
null
,'
'
null
,'
'
null
,'
'
null
,'
'
null
,'
'
null
,'
'
null
,'
'
null
,'
'
null
,'
'
null'
')')
Left = 536
Top = 282
...
...
@@ -580,7 +580,8 @@ object ApiDatabase: TApiDatabase
object uqProjectReportedUsers: TUniQuery
Connection = ucETaskApi
SQL.Strings = (
'select distinct'
'select'
' min(tiu.TASK_ITEM_USER_ID) as TASK_ITEM_USER_ID,'
' tiu.NAME'
'from task_item_user tiu'
'join tasks project_tasks'
...
...
@@ -589,6 +590,7 @@ object ApiDatabase: TApiDatabase
' on target_task.PROJECT_ID = project_tasks.PROJECT_ID'
'where target_task.TASK_ID = :TASK_ID'
' and tiu.USER_TYPE = '#39'Reported'#39
'group by tiu.NAME'
'order by tiu.NAME')
Left = 58
Top = 256
...
...
@@ -598,6 +600,11 @@ object ApiDatabase: TApiDatabase
Name = 'TASK_ID'
Value = nil
end>
object uqProjectReportedUsersTASK_ITEM_USER_ID: TStringField
FieldName = 'TASK_ITEM_USER_ID'
ReadOnly = True
Size = 50
end
object uqProjectReportedUsersNAME: TStringField
FieldName = 'NAME'
Required = True
...
...
@@ -758,7 +765,7 @@ object ApiDatabase: TApiDatabase
Connection = ucETaskApi
SQL.Strings = (
'update task_items'
'set ASSIGNED_TO =
'#39#39
'set ASSIGNED_TO =
null'
'where TASK_ID = :TASK_ID'
' and lower(ASSIGNED_TO) = lower(:NAME)')
Left = 388
...
...
@@ -914,7 +921,7 @@ object ApiDatabase: TApiDatabase
'update task_items ti'
'join tasks t'
' on t.TASK_ID = ti.TASK_ID'
'set ti.APPLICATION =
'#39#39
'set ti.APPLICATION =
null'
'where t.PROJECT_ID = :PROJECT_ID'
' and lower(ti.APPLICATION) = lower(:NAME)')
Left = 696
...
...
@@ -931,4 +938,150 @@ object ApiDatabase: TApiDatabase
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
emT3XDataServer/Source/Api.Database.pas
View file @
4a314fa8
...
...
@@ -68,7 +68,6 @@ type
uqAssignedDelete
:
TUniQuery
;
uqRenameAssignedTo
:
TUniQuery
;
uqBlankAssignedTo
:
TUniQuery
;
uqProjectReportedUsersNAME
:
TStringField
;
uqTaskAssignedUsersTASK_ITEM_USER_ID
:
TStringField
;
uqTaskAssignedUsersTASK_ID
:
TStringField
;
uqTaskAssignedUsersUSER_TYPE
:
TStringField
;
...
...
@@ -82,6 +81,13 @@ type
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
uqUsersCalcFields
(
DataSet
:
TDataSet
);
private
...
...
emT3XDataServer/Source/Api.Service.pas
View file @
4a314fa8
...
...
@@ -76,6 +76,7 @@ type
TTaskUserOptionsResponse
=
class
public
assignedToOptions
:
TList
<
TTaskUserOption
>;
reportedByOptions
:
TList
<
TTaskUserOption
>;
constructor
Create
;
destructor
Destroy
;
override
;
end
;
...
...
@@ -105,21 +106,37 @@ type
notes
:
string
;
end
;
TTaskItemFieldSave
=
class
public
taskItemId
:
Integer
;
fieldName
:
string
;
value
:
string
;
end
;
type
[
ServiceContract
,
Model
(
API_MODEL
)]
IApiService
=
interface
(
IInvokable
)
[
'{0EFB33D7-8C4C-4F3C-9BC3-8B4D444B5F69}'
]
function
GetTaskItems
(
taskId
:
string
):
TTaskItemsResponse
;
[
HttpPost
]
function
AddTaskRow
(
taskId
:
string
;
insertAfterItemNum
:
Integer
):
Boolean
;
[
HttpPost
]
function
SaveTaskRow
(
Item
:
TTaskRowSave
):
Boolean
;
[
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
;
[
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
);
function
DeleteTaskRow
(
const
taskId
:
Integer
;
const
taskItemId
:
Integer
):
Boolean
;
function
SaveTaskItemField
(
const
Item
:
TTaskItemFieldSave
):
Boolean
;
end
;
implementation
...
...
@@ -148,11 +165,13 @@ constructor TTaskUserOptionsResponse.Create;
begin
inherited
;
assignedToOptions
:=
TList
<
TTaskUserOption
>.
Create
;
reportedByOptions
:=
TList
<
TTaskUserOption
>.
Create
;
end
;
destructor
TTaskUserOptionsResponse
.
Destroy
;
begin
assignedToOptions
.
Free
;
assignedToOptions
:=
TList
<
TTaskUserOption
>.
Create
;
reportedByOptions
:=
TList
<
TTaskUserOption
>.
Create
;
inherited
;
end
;
...
...
emT3XDataServer/Source/Api.ServiceImpl.pas
View file @
4a314fa8
This diff is collapsed.
Click to expand it.
emT3XDataServer/bin/emT3XDataServer.ini
View file @
4a314fa8
[Settings]
MemoLogLevel
=
4
FileLogLevel
=
4
webClientVersion
=
0.8.
7
LogFileNum
=
1
55
webClientVersion
=
0.8.
8
LogFileNum
=
1
60
[Database]
Server
=
192.168.102.131
...
...
emT3XDataServer/emT3XDataServer.dproj
View file @
4a314fa8
...
...
@@ -114,10 +114,10 @@
<VerInfo_Locale>1033</VerInfo_Locale>
<DCC_ExeOutput>.\bin</DCC_ExeOutput>
<DCC_UnitSearchPath>C:\RADTOOLS\FastMM4;$(DCC_UnitSearchPath)</DCC_UnitSearchPath>
<VerInfo_Keys>CompanyName=EM Systems;FileDescription=$(MSBuildProjectName);FileVersion=0.8.
7
.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_MinorVer>8</VerInfo_MinorVer>
<VerInfo_Release>
7
</VerInfo_Release>
<VerInfo_Release>
8
</VerInfo_Release>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win64)'!=''">
<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