Skip to content

Commit de9d031

Browse files
authored
Merge pull request #23 from cybertec-postgresql/20_task_toolbar
[+] add chain and task navigation toolbars
2 parents eb81440 + f78da33 commit de9d031

10 files changed

Lines changed: 755 additions & 199 deletions

forms/fmmain.lfm

Lines changed: 539 additions & 115 deletions
Large diffs are not rendered by default.

forms/fmmain.pas

Lines changed: 132 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,34 @@ interface
77
uses
88
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, Menus,
99
StdCtrls, DBGrids, DBCtrls, ExtCtrls, RTTIGrids, RTTICtrls, uObjects,
10-
PropEdits, ObjectInspector, VirtualTrees, DB, Grids, ActnList, DBActns;
10+
PropEdits, ObjectInspector, VirtualTrees, DB, Grids, ActnList, Buttons;
1111

1212
type
1313

1414
{ TfmMain }
1515

1616
TfmMain = class(TForm)
1717
acConnect: TAction;
18-
alChains: TActionList;
19-
acChainInsert: TDataSetInsert;
20-
acChainDelete: TDataSetDelete;
21-
acChainEdit: TDataSetEdit;
22-
acChainRefresh: TDataSetRefresh;
23-
acChainPost: TDataSetPost;
24-
acChainCancel: TDataSetCancel;
18+
acMoveTaskUp: TAction;
19+
acMoveTaskDown: TAction;
20+
acTaskDelete: TAction;
21+
acTaskAdd: TAction;
22+
acTaskEdit: TAction;
23+
acTaskPost: TAction;
24+
acTaskCancel: TAction;
25+
acTaskRefresh: TAction;
26+
acChainAdd: TAction;
27+
acChainDelete: TAction;
28+
acChainEdit: TAction;
29+
acChainPost: TAction;
30+
acChainCancel: TAction;
31+
acChainRefresh: TAction;
32+
alToolbars: TActionList;
33+
btnTaskMoveUp: TToolButton;
2534
gridTasks: TDBGrid;
2635
gridChains: TDBGrid;
27-
imglNavigatorDisabled: TImageList;
28-
imglNavigator: TImageList;
36+
imglToolbarsDisabled: TImageList;
37+
imglToolbars: TImageList;
2938
imglGrids: TImageList;
3039
miConnect: TMenuItem;
3140
mmLog: TMemo;
@@ -34,24 +43,43 @@ TfmMain = class(TForm)
3443
miClose: TMenuItem;
3544
miHelp: TMenuItem;
3645
miAbout: TMenuItem;
46+
pnlMainToolbar: TPanel;
3747
pnlChains: TPanel;
3848
pnlDetails: TPanel;
39-
splitSidebar: TSplitter;
49+
splitChain: TSplitter;
4050
splitDetails: TSplitter;
51+
toolbarChains: TToolBar;
4152
toolbarMain: TToolBar;
4253
btnConnect: TToolButton;
43-
btnChainInsert: TToolButton;
44-
btnSep1: TToolButton;
54+
toolbarTasks: TToolBar;
55+
btnTaskMoveDown: TToolButton;
56+
btnTaskAdd: TToolButton;
57+
btnTaskSep1: TToolButton;
58+
btnTaskDelete: TToolButton;
59+
btnTaskEdit: TToolButton;
60+
btnTaskPost: TToolButton;
61+
btnTaskCancel: TToolButton;
62+
btnTaskRefresh: TToolButton;
63+
btnChainAdd: TToolButton;
4564
btnChainDelete: TToolButton;
4665
btnChainEdit: TToolButton;
47-
btnChainRefresh: TToolButton;
4866
btnChainPost: TToolButton;
4967
btnChainCancel: TToolButton;
50-
btnSep2: TToolButton;
51-
procedure acConnectUpdate(Sender: TObject);
52-
procedure acDisconnectExecute(Sender: TObject);
53-
procedure acDisconnectUpdate(Sender: TObject);
54-
procedure btnCancelClick(Sender: TObject);
68+
btnChainRefresh: TToolButton;
69+
procedure acChainAddExecute(Sender: TObject);
70+
procedure acChainCancelExecute(Sender: TObject);
71+
procedure acChainDeleteExecute(Sender: TObject);
72+
procedure acChainEditExecute(Sender: TObject);
73+
procedure acChainPostExecute(Sender: TObject);
74+
procedure acChainRefreshExecute(Sender: TObject);
75+
procedure acChainToolbarUpdate(Sender: TObject);
76+
procedure acTaskAddExecute(Sender: TObject);
77+
procedure acTaskCancelExecute(Sender: TObject);
78+
procedure acTaskDeleteExecute(Sender: TObject);
79+
procedure acTaskEditExecute(Sender: TObject);
80+
procedure acTaskPostExecute(Sender: TObject);
81+
procedure acTaskRefreshExecute(Sender: TObject);
82+
procedure acTaskToolbarUpdate(Sender: TObject);
5583
procedure acConnectClick(Sender: TObject);
5684
procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
5785
procedure gridChainsEditingDone(Sender: TObject);
@@ -88,10 +116,12 @@ procedure TfmMain.gridChainsEditingDone(Sender: TObject);
88116
F: TField;
89117
begin
90118
F := gridChains.SelectedField;
91-
if not Assigned(F) or (F.FieldName <> 'run_at') or gridChains.EditorMode then Exit;
119+
if not Assigned(F) or (F.FieldName <> 'run_at') or gridChains.EditorMode then
120+
Exit;
92121
S := F.AsString;
93122
if not dmPgEngine.IsCronValueValid(S) then
94-
MessageDlg('Cron Syntax Error', 'You have error in the cron value: ' + S, mtError, [mbOK], 0);
123+
MessageDlg('Cron Syntax Error', 'You have error in the cron value: ' + S,
124+
mtError, [mbOK], 0);
95125
end;
96126

97127
procedure TfmMain.gridChainsTitleClick(Column: TColumn);
@@ -178,26 +208,94 @@ procedure TfmMain.UpdateSortIndication(ACol: TColumn);
178208
FLastColumn := ACol;
179209
end;
180210

181-
procedure TfmMain.btnCancelClick(Sender: TObject);
211+
procedure TfmMain.acChainToolbarUpdate(Sender: TObject);
212+
var
213+
CanModify: boolean;
214+
begin
215+
CanModify := dmPgEngine.IsConnected() and dmPgEngine.qryTasks.CanModify;
216+
acChainAdd.Enabled := CanModify;
217+
acChainDelete.Enabled := CanModify and
218+
(not (dmPgEngine.qryChains.BOF and dmPgEngine.qryChains.EOF));
219+
acChainEdit.Enabled := CanModify and not (dmPgEngine.qryChains.State in dsEditModes);
220+
acChainPost.Enabled := CanModify and (dmPgEngine.qryChains.State in dsEditModes);
221+
acChainCancel.Enabled := CanModify and (dmPgEngine.qryChains.State in dsEditModes);
222+
acChainRefresh.Enabled := CanModify;
223+
end;
224+
225+
procedure TfmMain.acChainAddExecute(Sender: TObject);
226+
begin
227+
dmPgEngine.qryChains.Append;
228+
end;
229+
230+
procedure TfmMain.acChainCancelExecute(Sender: TObject);
182231
begin
183232
dmPgEngine.qryChains.Cancel;
184233
end;
185234

186-
procedure TfmMain.acConnectUpdate(Sender: TObject);
235+
procedure TfmMain.acChainDeleteExecute(Sender: TObject);
187236
begin
188-
//(Sender as TAction).Enabled := not dmPgEngine.PQConn.Connected;
189-
btnConnect.Down := dmPgEngine.PQConn.Connected;
190-
miConnect.Checked := btnConnect.Down;
237+
dmPgEngine.qryChains.Delete;
191238
end;
192239

193-
procedure TfmMain.acDisconnectExecute(Sender: TObject);
240+
procedure TfmMain.acChainEditExecute(Sender: TObject);
194241
begin
195-
dmPgEngine.Disconnect;
242+
dmPgEngine.qryChains.Edit;
243+
end;
244+
245+
procedure TfmMain.acChainPostExecute(Sender: TObject);
246+
begin
247+
dmPgEngine.qryChains.Post;
248+
end;
249+
250+
procedure TfmMain.acChainRefreshExecute(Sender: TObject);
251+
begin
252+
dmPgEngine.qryChains.Refresh;
253+
end;
254+
255+
procedure TfmMain.acTaskAddExecute(Sender: TObject);
256+
begin
257+
dmPgEngine.qryTasks.Append;
258+
end;
259+
260+
procedure TfmMain.acTaskCancelExecute(Sender: TObject);
261+
begin
262+
dmPgEngine.qryTasks.Cancel;
263+
end;
264+
265+
procedure TfmMain.acTaskDeleteExecute(Sender: TObject);
266+
begin
267+
dmPgEngine.qryTasks.Delete;
268+
end;
269+
270+
procedure TfmMain.acTaskEditExecute(Sender: TObject);
271+
begin
272+
dmPgEngine.qryTasks.Edit;
196273
end;
197274

198-
procedure TfmMain.acDisconnectUpdate(Sender: TObject);
275+
procedure TfmMain.acTaskPostExecute(Sender: TObject);
199276
begin
200-
(Sender as TAction).Enabled := dmPgEngine.PQConn.Connected;
277+
dmPgEngine.qryTasks.Post;
278+
end;
279+
280+
procedure TfmMain.acTaskRefreshExecute(Sender: TObject);
281+
begin
282+
dmPgEngine.qryTasks.Refresh;
283+
end;
284+
285+
procedure TfmMain.acTaskToolbarUpdate(Sender: TObject);
286+
var
287+
CanModify: boolean;
288+
begin
289+
CanModify := dmPgEngine.IsConnected() and dmPgEngine.qryTasks.CanModify;
290+
acTaskAdd.Enabled := CanModify;
291+
acMoveTaskUp.Enabled := CanModify and not dmPgEngine.qryTasks.BOF;
292+
acMoveTaskDown.Enabled := CanModify and not dmPgEngine.qryTasks.EOF;
293+
acTaskDelete.Enabled := CanModify and
294+
(not (dmPgEngine.qryTasks.BOF and dmPgEngine.qryTasks.EOF));
295+
acTaskEdit.Enabled := CanModify and not (dmPgEngine.qryTasks.State in dsEditModes);
296+
acTaskPost.Enabled := CanModify and (dmPgEngine.qryTasks.State in dsEditModes);
297+
acTaskCancel.Enabled := CanModify and (dmPgEngine.qryTasks.State in dsEditModes);
298+
acTaskRefresh.Enabled := CanModify;
201299
end;
202300

203301
procedure TfmMain.acConnectClick(Sender: TObject);
@@ -212,10 +310,10 @@ procedure TfmMain.acConnectClick(Sender: TObject);
212310
MessageDlg('PostgreSQL Error', E.Message, mtError, [mbOK], 0);
213311
end
214312
else
215-
begin
216-
dmPgEngine.Disconnect;
217-
UpdateSortIndication(nil);
218-
end;
313+
begin
314+
dmPgEngine.Disconnect;
315+
UpdateSortIndication(nil);
316+
end;
219317
end;
220318

221319
end.

res/nav-down-24px.png

169 Bytes
Loading

res/nav-down-disabled-24px.png

194 Bytes
Loading

res/nav-next-24px.png

203 Bytes
Loading

res/nav-prev-24px.png

217 Bytes
Loading

res/nav-up-24px.png

159 Bytes
Loading

res/nav-up-disabled-24px.png

183 Bytes
Loading

udatamodule.lfm

Lines changed: 52 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
object dmPgEngine: TdmPgEngine
22
OldCreateOrder = False
33
Height = 524
4-
HorizontalOffset = 1650
5-
VerticalOffset = 828
4+
HorizontalOffset = 2019
5+
VerticalOffset = 712
66
Width = 668
77
PPI = 144
88
object dsChains: TDataSource
@@ -113,57 +113,58 @@ object dmPgEngine: TdmPgEngine
113113
PacketRecords = -1
114114
IndexName = 'DEFAULT_ORDER'
115115
MaxIndexesCount = 4
116-
FieldDefs = <
117-
item
118-
Name = 'task_id'
119-
DataType = ftLargeint
120-
Precision = -1
121-
end
122-
item
123-
Name = 'command'
124-
DataType = ftMemo
125-
Precision = -1
126-
end
127-
item
128-
Name = 'kind'
129-
DataType = ftString
130-
Precision = -1
131-
Size = 64
132-
end
133-
item
134-
Name = 'run_as'
135-
DataType = ftMemo
136-
Precision = -1
137-
end
138-
item
139-
Name = 'ignore_error'
140-
DataType = ftBoolean
141-
Precision = -1
142-
end
143-
item
144-
Name = 'autonomous'
145-
DataType = ftBoolean
146-
Precision = -1
147-
end
148-
item
149-
Name = 'connect_string'
150-
DataType = ftMemo
151-
Precision = -1
152-
end>
116+
FieldDefs = <>
153117
Database = PQConn
154118
Transaction = transChains
155119
SQL.Strings = (
156-
'WITH RECURSIVE x'
157-
'(task_id, command, kind, run_as, ignore_error, autonomous, connect_string)'
158-
'AS ('
159-
#9'SELECT tc.task_id, tc.command, tc.kind, tc.run_as, tc.ignore_error, tc.autonomous, tc.database_connection'
160-
#9'FROM timetable.task tc'
161-
#9'WHERE tc.parent_id IS NULL AND tc.task_id = :"task_id"'
162-
'UNION ALL'
163-
#9'SELECT tc.task_id, tc.command, tc.kind, tc.run_as, tc.ignore_error, tc.autonomous, tc.database_connection'
164-
#9'FROM timetable.task tc JOIN x ON (x.task_id = tc.parent_id)'
165-
')'
166-
#9'SELECT * FROM x'
120+
'WITH RECURSIVE x ('
121+
' parent_id,'
122+
' task_id,'
123+
' command,'
124+
' kind,'
125+
' run_as,'
126+
' ignore_error,'
127+
' autonomous,'
128+
' connect_string'
129+
') AS ('
130+
' SELECT'
131+
' NULL::bigint,'
132+
' tc.task_id,'
133+
' tc.command,'
134+
' tc.kind,'
135+
' tc.run_as,'
136+
' tc.ignore_error,'
137+
' tc.autonomous,'
138+
' tc.database_connection'
139+
' FROM'
140+
' timetable.task tc'
141+
' WHERE'
142+
' tc.parent_id IS NULL'
143+
' AND tc.task_id = :"task_id"'
144+
' UNION ALL'
145+
' SELECT'
146+
' tc.parent_id,'
147+
' tc.task_id,'
148+
' tc.command,'
149+
' tc.kind,'
150+
' tc.run_as,'
151+
' tc.ignore_error,'
152+
' tc.autonomous,'
153+
' tc.database_connection'
154+
' FROM'
155+
' timetable.task tc'
156+
' JOIN x ON (x.task_id = tc.parent_id))'
157+
'SELECT'
158+
' *'
159+
'FROM'
160+
' x'
161+
)
162+
InsertSQL.Strings = (
163+
'INSERT INTO timetable.task'
164+
'(parent_id, task_name, kind, command, run_as, database_connection, ignore_error, autonomous, timeout)'
165+
'VALUES'
166+
'(0, '''',''SQL'', '''', '''', '''', false, false, 0)'
167+
''
167168
)
168169
Options = [sqoKeepOpenOnCommit, sqoAutoApplyUpdates, sqoAutoCommit, sqoRefreshUsingSelect]
169170
Params = <
@@ -173,6 +174,7 @@ object dmPgEngine: TdmPgEngine
173174
ParamType = ptInput
174175
Size = 8
175176
end>
177+
ParseSQL = False
176178
UpdateMode = upWhereAll
177179
DataSource = dsChains
178180
Left = 192

0 commit comments

Comments
 (0)