• R/O
  • SSH
  • HTTPS

mantisbtmonitor: Commit


Commit MetaInfo

Revision75 (tree)
Zeit2022-01-26 06:51:17
Autorderekwildstar

Log Message

Ações de rejeição, impedimento e execução implementadas e testadas
Implementada uma forma de adicionar comentários privados em determinadas ocasiões
Criada a propriedade ImpedimentsCount
Criado o método Refresh em TDamoPrincipal com o intuito de atualizar o menu de contexto de forma forçada
Criados os métodos SendToHomologation e SendToTest, mas eles ainda não foram implementados
TDamoTask agora tem acesso a TDamoPrincipal
Criado o checkbox que permite criar comentários privados
Criado o modo especial "Execute" na tela de gerenciamento de comentários. Para cada mudança de estado simples deve existir um modo especial

Ändern Zusammenfassung

Diff

--- trunk/client/prj/MantisBTMonitor.dproj (revision 74)
+++ trunk/client/prj/MantisBTMonitor.dproj (revision 75)
@@ -119,7 +119,7 @@
119119 <VerInfo_MinorVer>0</VerInfo_MinorVer>
120120 <VerInfo_Release>0</VerInfo_Release>
121121 <VerInfo_Locale>1033</VerInfo_Locale>
122- <VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.626;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName)</VerInfo_Keys>
122+ <VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.652;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName)</VerInfo_Keys>
123123 <Debugger_RunParams>/desenvolvimento</Debugger_RunParams>
124124 <VerInfo_AutoGenVersion>false</VerInfo_AutoGenVersion>
125125 <VerInfo_AutoIncVersion>true</VerInfo_AutoIncVersion>
@@ -126,7 +126,7 @@
126126 <DCC_DebugInformation>2</DCC_DebugInformation>
127127 <DCC_SymbolReferenceInfo>2</DCC_SymbolReferenceInfo>
128128 <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
129- <VerInfo_Build>626</VerInfo_Build>
129+ <VerInfo_Build>652</VerInfo_Build>
130130 <DCC_MapFile>3</DCC_MapFile>
131131 </PropertyGroup>
132132 <ItemGroup>
--- trunk/client/src/lib/UScrapFunctions.pas (revision 74)
+++ trunk/client/src/lib/UScrapFunctions.pas (revision 75)
@@ -15,8 +15,8 @@
1515 function GetCommentForEdition(AHandle: Cardinal; ACommentId: Cardinal; out AComment: String; out AUpdateToken: String): Boolean;
1616 function PrepareCommentForJavaScriptString(AComment: String): String; deprecated 'Não acho que vou usar isso no futuro, mas mantenha por ora';
1717 function UpdateComment(AHandle: Cardinal; ACommentId: Cardinal; AComment: String; AUpdateToken: String): Boolean;
18-function AddComment(AHandle: Cardinal; ATask: TTask; AComment: String; AAttachments: array of String; out AError: String): Boolean;
19-function ChangeStatus(AHandle: Cardinal; ATaskId: Cardinal; ANewStatusId: Word; AComment: String = ''): Boolean;
18+function AddComment(AHandle: Cardinal; ATask: TTask; AComment: String; ACommentIsPrivate: Boolean; AAttachments: array of String; out AError: String): Boolean;
19+function ChangeStatus(AHandle: Cardinal; ATaskId: Cardinal; ANewStatusId: Word; AComment: String = ''; ACommentIsPrivate: Boolean = False): Boolean;
2020
2121 implementation
2222
@@ -1831,7 +1831,7 @@
18311831 // end;
18321832 end;
18331833
1834-function AddComment(AHandle: Cardinal; ATask: TTask; AComment: String; AAttachments: array of String; out AError: String): Boolean;
1834+function AddComment(AHandle: Cardinal; ATask: TTask; AComment: String; ACommentIsPrivate: Boolean; AAttachments: array of String; out AError: String): Boolean;
18351835 const
18361836 BOUNDARY: RawByteString = 'MantisBTMonitor-2A57FA77-3372-47B1-B365-5C9F38ACF786';
18371837 var
@@ -1856,7 +1856,13 @@
18561856 AddTextMultiPartFormData(TMemoryStream(Req.Content),'form-data','bug_id',RawByteString(ATask.Id.ToString),BOUNDARY);
18571857 AddTextMultiPartFormData(TMemoryStream(Req.Content),'form-data','bugnote_text',UTF8Encode(AComment),BOUNDARY);
18581858
1859- if Length(AAttachments) = 0 then
1859+ if ACommentIsPrivate then
1860+ AddTextMultiPartFormData(TMemoryStream(Req.Content),'form-data','private','on',BOUNDARY);
1861+
1862+ // Segundo o Mantis, ao marcar o checkbox "Privado" a região onde se
1863+ // anexariam arquivos some, portanto, quando o comentário é privado, não é
1864+ // possível anexar arquivos
1865+ if (Length(AAttachments) = 0) or ACommentIsPrivate then
18601866 AddTextMultiPartFormData(TMemoryStream(Req.Content),'form-data','max_file_size',RawByteString(ATask.MaxFileSize.ToString),BOUNDARY,'',True)
18611867 else
18621868 begin
@@ -2024,7 +2030,7 @@
20242030 end;
20252031 end;
20262032
2027-function ChangeStatus(AHandle: Cardinal; ATaskId: Cardinal; ANewStatusId: Word; AComment: String = ''): Boolean;
2033+function ChangeStatus(AHandle: Cardinal; ATaskId: Cardinal; ANewStatusId: Word; AComment: String = ''; ACommentIsPrivate: Boolean = False): Boolean;
20282034 const
20292035 BOUNDARY: RawByteString = 'MantisBTMonitor-1F00CBD1-5117-49A0-84F0-A3A4102DE66E';
20302036 var
@@ -2057,6 +2063,10 @@
20572063 AddTextMultiPartFormData(TMemoryStream(Req.Content),'form-data','status',RawByteString(ANewStatusId.ToString),BOUNDARY);
20582064 AddTextMultiPartFormData(TMemoryStream(Req.Content),'form-data','last_updated',RawByteString(LastUpdated),BOUNDARY);
20592065 AddTextMultiPartFormData(TMemoryStream(Req.Content),'form-data','handler_id',RawByteString(Configurations.UserInfo.Id.ToString),BOUNDARY);
2066+
2067+ if ACommentIsPrivate then
2068+ AddTextMultiPartFormData(TMemoryStream(Req.Content),'form-data','private','on',BOUNDARY);
2069+
20602070 AddTextMultiPartFormData(TMemoryStream(Req.Content),'form-data','bugnote_text',UTF8Encode(AComment),BOUNDARY);
20612071 AddTextMultiPartFormData(TMemoryStream(Req.Content),'form-data','action_type','change_status',BOUNDARY);
20622072
--- trunk/client/src/lib/UTypes.pas (revision 74)
+++ trunk/client/src/lib/UTypes.pas (revision 75)
@@ -226,6 +226,7 @@
226226 function GetStatusChangeIsPossible(AStatusId: Word): Boolean;
227227 function GetExecutionsCount: Word;
228228 function GetRejectionsCount: Word;
229+ function GetImpedimentsCount: Word;
229230 public
230231 procedure Clear(AAllButId: Boolean = True);
231232
@@ -260,6 +261,7 @@
260261 property RelatedTasksCount: Word read GetRelatedTasksCount;
261262 property ExecutionsCount: Word read GetExecutionsCount;
262263 property RejectionsCount: Word read GetRejectionsCount;
264+ property ImpedimentsCount: Word read GetImpedimentsCount;
263265 end;
264266
265267 TTasks = array of TTask;
@@ -556,6 +558,15 @@
556558 Inc(Result);
557559 end;
558560
561+function TTask.GetImpedimentsCount: Word;
562+begin
563+ Result := 0;
564+
565+ for var i: Cardinal := 0 to High(History) do
566+ if (History[i].Action = HISTORY_ACTION_STATE) and (History[i].AsStatusChange.ToStatus.Id = Configurations.MantisConfigs.GetStatusByName(STATUS_IMPEDIMENT).Id) then
567+ Inc(Result);
568+end;
569+
559570 function TTask.GetRelatedTasksCount: Word;
560571 begin
561572 Result := Length(FRelatedTasks);
--- trunk/client/src/UDamoPrincipal.pas (revision 74)
+++ trunk/client/src/UDamoPrincipal.pas (revision 75)
@@ -93,6 +93,9 @@
9393 { Public declarations }
9494 constructor Create(AOwner: TComponent); override;
9595 destructor Destroy; override;
96+
97+ procedure Refresh;
98+
9699 property SplashTimeOut: Cardinal read FSplashTimeOut write FSplashTimeOut;
97100 property Initializing: Boolean read FInitializing;
98101 end;
@@ -126,8 +129,7 @@
126129
127130 procedure TDamoPrincipal.ACTNRefreshExecute(Sender: TObject);
128131 begin
129- // Interrompe o tempo de espera da thread, o que a força a executar sua tarefa
130- FTasksChecking.ForceTimeOut;
132+ Refresh;
131133 end;
132134
133135 constructor TDamoPrincipal.Create(AOwner: TComponent);
@@ -175,6 +177,12 @@
175177 AddMyTasksToPopUpMenu;
176178 end;
177179
180+procedure TDamoPrincipal.Refresh;
181+begin
182+ // Interrompe o tempo de espera da thread, o que a força a executar sua tarefa
183+ FTasksChecking.ForceTimeOut;
184+end;
185+
178186 procedure TDamoPrincipal.ClearPopUpMenu;
179187 //--////////////////////////////////////////////////////////////////////////////
180188 function TraverseMenuItem(AMenuItem: TMenuItem): TMenuItem;
@@ -375,7 +383,7 @@
375383 ShowInfoBalloon('Eu sou o ' + Application.Title + ' e irei monitorar as suas tarefas. Dentro de alguns segundos mostrarei suas atribuições. Aguarde...'
376384 ,'Olá ' + Configurations.UserInfo.FirstName + '!');
377385 // teste
378- TFormTask.ShowMe(83766);
386+ TFormTask.ShowMe(Self,83766);
379387
380388 StartTasksChecking(Configurations.NotificationTimeOut);
381389 end;
@@ -383,7 +391,7 @@
383391
384392 procedure TDamoPrincipal.DoOpenTask(Sender: TObject);
385393 begin
386- TFormTask.ShowMe(TComponent(Sender).Tag);
394+ TFormTask.ShowMe(Self,TComponent(Sender).Tag);
387395 end;
388396
389397 procedure TDamoPrincipal.DoOpenWithMantis(Sender: TObject);
--- trunk/client/src/UDamoTask.pas (revision 74)
+++ trunk/client/src/UDamoTask.pas (revision 75)
@@ -6,7 +6,7 @@
66 System.SysUtils, System.Classes, Data.DB, Datasnap.DBClient, Vcl.Dialogs,
77 Vcl.Menus, Vcl.ActnPopup, Vcl.XPStyleActnCtrls, Vcl.ActnMan, System.Actions,
88 Vcl.ActnList, System.ImageList, Vcl.ImgList, Vcl.Controls, UPngImageList,
9- Winapi.Windows, UScrapFunctions, UTypes;
9+ Winapi.Windows, UScrapFunctions, UTypes, UDamoPrincipal;
1010
1111 type
1212 TDamoTask = class(TDataModule)
@@ -66,22 +66,47 @@
6666 private
6767 { Private declarations }
6868 FTask: TTask;
69+ FDamoPrincipal: TDamoPrincipal;
70+
6971 procedure NewComment;
7072 procedure UploadAttachments;
7173 public
7274 { Public declarations }
75+ constructor Create(ADamoPrincipal: TDamoPrincipal; AOwner: TComponent); reintroduce;
76+
7377 procedure EditComment(ACommentId: Cardinal);
7478 procedure DownloadAttachment(AAttachmentId: Cardinal; AFileName: String; AOpen: Boolean);
7579 procedure Refresh;
7680 procedure ParseTaskIdAndCommentId(AUri: String; out ATaskId: Cardinal; out ACommentId: Cardinal);
81+ //: Coloca uma tarefa em execução. Uma tarefa está em execução quando aquilo
82+ //: que ela solicita está sendo feito
7783 procedure Execute;
7884 //: Rejeita uma tarefa de forma genérica, isto é, pode ser usado por
79- //: qualquer unidade a qualquer momento. Rejeições com carater de reprovação
85+ //: qualquer unidade a qualquer momento. Rejeições com caráter de reprovação
8086 //: de tarefas sendo testadas são feitas por meio do método Disapprove
8187 procedure Reject;
88+ //: Aprova uma tarefa que está sendo testada, seja pela unidadade de testes
89+ //: (primeiro nível), seja pela unidade solicitante (homologação/segundo
90+ //: nível). O efeito de uma aprovação é o envio da tarefa para a próxima
91+ //: etapa e isso sempre passa pela gerência de configuração, portanto, o ato
92+ //: de aprovar, DENTRE OUTRAS COISAS, atribui a tarefa a GC
8293 procedure Approve;
94+ //: Reprova uma tarefa que está sendo testada, seja pela unidadade de testes
95+ //: (primeiro nível), seja pela unidade solicitante (homologação/segundo
96+ //: nível). O efeito de uma reprovação é o envio da tarefa para o indivíduo
97+ //: que a executou por último, sem passar por GC e por meio de uma rejeição,
98+ //: portanto a reprovação de uma tarefa é em sua essência, DENTRE OUTRAS
99+ //: COISAS, uma rejeição associada com a atribuição da mesma a alguém
83100 procedure Disapprove;
101+ //: Coloca uma tarefa em impedimento. Uma tarefa pode ser impedida por
102+ //: vários motivos, mas basicamente quando o desenvolvimento ou teste de uma
103+ //: tarefa não pode continuar por algum motivo, o impedimento serve para
104+ //: indicar exatamente isso
105+ procedure Impede;
84106
107+ procedure SendToTest;
108+ procedure SendToHomologation;
109+
85110 property Task: TTask read FTask write FTask;
86111 end;
87112
@@ -166,6 +191,12 @@
166191 Text := FormatDateTime('dd/mm/yyyy "às" hh:nn:ss',Sender.AsDateTime);
167192 end;
168193
194+constructor TDamoTask.Create(ADamoPrincipal: TDamoPrincipal; AOwner: TComponent);
195+begin
196+ inherited Create(AOwner);
197+ FDamoPrincipal := ADamoPrincipal;
198+end;
199+
169200 procedure TDamoTask.Disapprove;
170201 begin
171202 // Implementar!
@@ -193,10 +224,11 @@
193224 procedure TDamoTask.EditComment(ACommentId: Cardinal);
194225 var
195226 Comment: String;
227+ Dummy1: Boolean;
196228 CommentToken: String;
197- Dummy: TArray<String>;
229+ Dummy2: TArray<String>;
198230 begin
199- if TFormManageNote.ShowMeModal(Self,FTask,ACommentId,Comment,Dummy,CommentToken) = mrOk then
231+ if TFormManageNote.ShowMeModal(Self,FTask,ACommentId,Comment,Dummy1,Dummy2,CommentToken) = mrOk then
200232 begin
201233 CommentBackupCreate(ACommentId,Comment);
202234
@@ -212,7 +244,44 @@
212244 end;
213245
214246 procedure TDamoTask.Execute;
247+var
248+ Comment: String;
249+ CommentIsPrivate: Boolean;
215250 begin
251+ if TFormManageNote.ShowMeModal(Self.Owner,TSpecialMode.Execute,FTask.Id,Comment,CommentIsPrivate) = mrOk then
252+ begin
253+ CommentBackupCreate(0,Comment);
254+
255+ var DefaultText: String := '<p>' + GetDefaultStatusChangeText(AnsiUpperCase(STATUS_IN_PROGRESS)) + ' (' + Succ(FTask.ExecutionsCount).ToString + ')</p>';
256+
257+ if Comment <> '' then
258+ Comment := DefaultText + '<hr>' + Comment
259+ else
260+ Comment := DefaultText;
261+
262+ if ChangeStatus(Application.Handle,FTask.Id,Configurations.MantisConfigs.StatusByName[STATUS_IN_PROGRESS].Id,Comment,CommentIsPrivate) then
263+ begin
264+ CommentBackupDelete(0);
265+ Application.MessageBox('Tarefa iniciada com sucesso!','Execução bem sucedida',MB_ICONINFORMATION);
266+ end
267+ else
268+ Application.MessageBox('Não foi possível iniciar a tarefa. Tente novamente','Erro ao iniciar a tarefa',MB_ICONERROR);
269+
270+ Refresh;
271+ end;
272+
273+
274+
275+
276+
277+
278+
279+
280+
281+// testar rejeição, impedimento e execução bem como o checkbox
282+// implementar a execução = rejeição, cm abertura de comentário
283+// possivelmente vc vai precisar incluir mais um caso especial
284+// CommentIsPrivate := False;
216285 // Colocar a tarefa em execução pode acontecer em dois momentos. A primeira
217286 // execução seria a "primeira vez em que a tarefa foi posta em execução" e
218287 // todas as outras execuções subsequentes, por exemplo, quando se reinicia uma
@@ -220,18 +289,53 @@
220289 // é possível saber se esta é a primeira execução ou uma execução posterior.
221290 // Todas as execuções tem um cabeçalho e um texto padrão. Eu resolvi
222291 // padronizar dessa forma
223- ChangeStatus(Application.Handle,FTask.Id,Configurations.MantisConfigs.StatusByName[STATUS_IN_PROGRESS].Id,GetDefaultStatusChangeText(AnsiUpperCase(STATUS_IN_PROGRESS)) + ' (' + Succ(FTask.ExecutionsCount).ToString + ')');
292+// ChangeStatus(Application.Handle,FTask.Id,Configurations.MantisConfigs.StatusByName[STATUS_IN_PROGRESS].Id,GetDefaultStatusChangeText(AnsiUpperCase(STATUS_IN_PROGRESS)) + ' (' + Succ(FTask.ExecutionsCount).ToString + ')',CommentIsPrivate);
224293
225- Refresh;
294+// Refresh;
226295 end;
227296
297+procedure TDamoTask.Impede;
298+var
299+ Comment: String;
300+ CommentIsPrivate: Boolean;
301+begin
302+ if TFormManageNote.ShowMeModal(Self.Owner,TSpecialMode.Impede,FTask.Id,Comment,CommentIsPrivate) = mrOk then
303+ begin
304+ CommentBackupCreate(0,Comment);
305+
306+ var DefaultText: String := '<p>' + GetDefaultStatusChangeText(UpperCase(STATUS_IMPEDIMENT)) + ' (' + Succ(FTask.ImpedimentsCount).ToString + ')</p>';
307+
308+ // Caso o comentário não esteja em branco, adiciona um <hr> a fim de
309+ // separá-lo do texto padrão de mudança de status. Caso o comentário esteja
310+ // em branco, usa somente o texto padrão de mudança de status
311+ if Comment <> '' then
312+ Comment := DefaultText + '<hr>' + Comment
313+ else
314+ Comment := DefaultText;
315+
316+ if ChangeStatus(Application.Handle,FTask.Id,Configurations.MantisConfigs.StatusByName[STATUS_IMPEDIMENT].Id,Comment,CommentIsPrivate) then
317+ begin
318+ CommentBackupDelete(0);
319+ Application.MessageBox('Tarefa impedida com sucesso!','Impedimento bem sucedido',MB_ICONINFORMATION);
320+ end
321+ else
322+ Application.MessageBox('Não foi possível impedir a tarefa. Tente novamente','Erro ao impedir a tarefa',MB_ICONERROR);
323+ // Acredito que um dos motivos pelos quais o impedimento possa falhar, seja
324+ // porque alguém possa ter mudado o status da tarefa antes de nós, fazendo
325+ // com que ela fique em um status que não permite um impedimento (por
326+ // exemplo, se alguém impediu a tarefa antes de nós). Neste caso, achei mais
327+ // coerente, sempre atualizar as informações, independentemente de ter
328+ // havido erro ou não
329+ Refresh;
330+ end;
331+end;
332+
228333 procedure TDamoTask.Reject;
229334 var
230335 Comment: String;
336+ CommentIsPrivate: Boolean;
231337 begin
232-// implemente a logica abaixo para impedimento e qqr outra mudança de status simples
233-// verifique como resolver o problema do botão na barra de tarefas sem usar o trick de CreateParams, pois ao usa-lo o form secundário exibido de forma modal é coberto por seu pai
234- if TFormManageNote.ShowMeModal(Self.Owner,TSpecialMode.Reject,FTask.Id,Comment) = mrOk then
338+ if TFormManageNote.ShowMeModal(Self.Owner,TSpecialMode.Reject,FTask.Id,Comment,CommentIsPrivate) = mrOk then
235339 begin
236340 CommentBackupCreate(0,Comment);
237341
@@ -245,7 +349,7 @@
245349 else
246350 Comment := DefaultText;
247351
248- if ChangeStatus(Application.Handle,FTask.Id,Configurations.MantisConfigs.StatusByName[STATUS_REJECTED].Id,Comment) then
352+ if ChangeStatus(Application.Handle,FTask.Id,Configurations.MantisConfigs.StatusByName[STATUS_REJECTED].Id,Comment,CommentIsPrivate) then
249353 begin
250354 CommentBackupDelete(0);
251355 Application.MessageBox('Tarefa rejeitada com sucesso!','Rejeição bem sucedida',MB_ICONINFORMATION);
@@ -255,7 +359,7 @@
255359 // Acredito que um dos motivos pelos quais a rejeição possa falhar, seja
256360 // porque alguém possa ter mudado o status da tarefa antes de nós, fazendo
257361 // com que ela fique em um status que não permite uma rejeição (por exemplo,
258- // se alguém rejeito a tarefa antes de nós). Neste caso, achei mais
362+ // se alguém rejeitou a tarefa antes de nós). Neste caso, achei mais
259363 // coerente, sempre atualizar as informações, independentemente de ter
260364 // havido erro ou não
261365 Refresh;
@@ -262,19 +366,43 @@
262366 end;
263367 end;
264368
369+procedure TDamoTask.SendToHomologation;
370+begin
371+
372+end;
373+
374+procedure TDamoTask.SendToTest;
375+begin
376+rejeição, impedimento e execução estão funcionando e contando a quantidade de vezes que eles aparecem
377+se precisar de mais alguma mudança de estado simples, copie de um desses
378+
379+chegou a hora de agrupar tudo que tiver no diretorio do mantis em uma unica pasta
380+css, js, php e tinymce devem ser colocados dentro de uma pasta MantisBTMonitor a
381+fim de facilitar a desinstalação do mesmo. incluir um manual que mostra todos os
382+arquivos do mantis que foram modificados, depois disso feito, veja uma forma de
383+colocar estes arquivos no repositorio junto com o MantisBTMonitor. Talvez usar
384+links simbólicos...
385+
386+Quando a etapa anterior acabar, volte pra cá e finalmente implemente enviar para
387+testes, pois tem um tag especial ([ufs-ii][T] e [UFS-II][H]). Voce vai ter que
388+criar um tag especial pra isso, tal como existem os tags especiais pra rejeição
389+e aprovação
390+end;
391+
265392 procedure TDamoTask.NewComment;
266393 var
267394 Comment: String;
395+ CommentIsPrivate: Boolean;
268396 Files: TArray<String>;
269397 Dummy: String;
270398 begin
271- if TFormManageNote.ShowMeModal(Self,FTask,0,Comment,Files,Dummy) = mrOk then
399+ if TFormManageNote.ShowMeModal(Self,FTask,0,Comment,CommentIsPrivate,Files,Dummy) = mrOk then
272400 begin
273401 var Error: String;
274402
275403 CommentBackupCreate(0,Comment);
276404
277- if AddComment(Application.Handle,FTask,Comment,Files,Error) then
405+ if AddComment(Application.Handle,FTask,Comment,CommentIsPrivate,Files,Error) then
278406 begin
279407 CommentBackupDelete(0);
280408 Application.MessageBox('Seu comentário foi inserido com sucesso. Caso você tenha adicionado anexos, eles também foram salvos','Comentário inserido com sucesso',MB_ICONINFORMATION);
@@ -294,14 +422,14 @@
294422 var
295423 Dummy1: String;
296424 Files: TArray<String>;
297- Dummy2: String;
298-
425+ Dummy2: Boolean;
426+ Dummy3: String;
299427 begin
300- if TFormManageNote.ShowMeModal(Self,FTask,0,Dummy1,Files,Dummy2,True) = mrOk then
428+ if TFormManageNote.ShowMeModal(Self,FTask,0,Dummy1,Dummy2,Files,Dummy3,True) = mrOk then
301429 begin
302430 var Error: String;
303431
304- if AddComment(Application.Handle,FTask,Dummy1,Files,Error) then
432+ if AddComment(Application.Handle,FTask,Dummy1,Dummy2,Files,Error) then
305433 begin
306434 Application.MessageBox('Arquivos anexados com sucesso!','Arquivos anexados com sucesso!',MB_ICONINFORMATION);
307435 Refresh;
@@ -336,6 +464,9 @@
336464 // necessário chamar aqui o método usado neste evento para configurar
337465 // corretamente o Caption
338466 TFormTask(Owner).ConfigureCaption;
467+ // Força a rechecagem de todas as tarefas que montam o menu de contexto de
468+ // tarefas
469+ FDamoPrincipal.Refresh;
339470 end;
340471
341472 end.
--- trunk/client/src/UFormManageNote.pas (revision 74)
+++ trunk/client/src/UFormManageNote.pas (revision 75)
@@ -10,7 +10,7 @@
1010 UTypes, UDamoTask;
1111
1212 type
13- TSpecialMode = (None,Reject,Impede);
13+ TSpecialMode = (None,Reject,Impede,Execute);
1414
1515 TFormManageNote = class(TFormBasicDialog)
1616 PACO: TPageControl;
@@ -22,6 +22,7 @@
2222 PUABAttachments: TPopupActionBar;
2323 MNUICopyReferenceToFile: TMenuItem;
2424 PANEAttachments: TPanel;
25+ CHBXPrivate: TCheckBox;
2526 procedure EDBRExecuteScript(Sender: TCustomEdgeBrowser; AResult: HRESULT; const AResultObjectAsJson: string);
2627 procedure EDBRCreateWebViewCompleted(Sender: TCustomEdgeBrowser; AResult: HRESULT);
2728 procedure FormCreate(Sender: TObject);
@@ -32,6 +33,7 @@
3233 procedure LIVIAttachmentsKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
3334 procedure MNUICopyReferenceToFileClick(Sender: TObject);
3435 procedure PANEAttachmentsClick(Sender: TObject);
36+ procedure CHBXPrivateClick(Sender: TObject);
3537 private
3638 { Private declarations }
3739 FDamoTask: TDamoTask;
@@ -48,12 +50,13 @@
4850 procedure ConfigureCommentsPage;
4951 procedure ConfigureAttachmentsPage;
5052 procedure AddAttachment(AFileName: String; AFileSize: Cardinal);
53+ function AttachmentsTabIsVisible: Boolean;
5154 protected
5255 procedure ValidateSave; override;
5356 public
5457 { Public declarations }
55- class function ShowMeModal(ADamoTask: TDamoTask; ATask: TTask; ACommentId: Cardinal; out AComment: String; out AAttachments: TArray<String>; out AUpdateToken: String; AAttacmentshOnly: Boolean = False): TModalResult; reintroduce; overload;
56- class function ShowMeModal(AOwner: TComponent; ASpecialMode: TSpecialMode; ATaskId: Cardinal; out AComment: String): TModalResult; reintroduce; overload;
58+ class function ShowMeModal(ADamoTask: TDamoTask; ATask: TTask; ACommentId: Cardinal; out AComment: String; out APrivate: Boolean; out AAttachments: TArray<String>; out AUpdateToken: String; AAttacmentshOnly: Boolean = False): TModalResult; reintroduce; overload;
59+ class function ShowMeModal(AOwner: TComponent; ASpecialMode: TSpecialMode; ATaskId: Cardinal; out AComment: String; out APrivate: Boolean): TModalResult; reintroduce; overload;
5760 end;
5861
5962 implementation
@@ -115,12 +118,23 @@
115118 end;
116119 end;
117120
121+function TFormManageNote.AttachmentsTabIsVisible: Boolean;
122+begin
123+ Result := (((not FUpdating) and (FSpecialMode = TSpecialMode.None)) or (FTask.CommentById[FCommentId].AttachmentsCount > 0)) and (not CHBXPrivate.Checked);
124+end;
125+
126+procedure TFormManageNote.CHBXPrivateClick(Sender: TObject);
127+begin
128+ inherited;
129+ TASHAttachments.TabVisible := AttachmentsTabIsVisible;
130+end;
131+
118132 procedure TFormManageNote.ConfigureAttachmentsPage;
119133 begin
120134 // A aba de anexos só é visível se estamos no modo de inserção, ou no modo de
121135 // edição quando há anexos associados ao comentário ou caso estejamos
122136 // executando algum modo especial
123- TASHAttachments.TabVisible := ((not FUpdating) and (FSpecialMode = TSpecialMode.None)) or (FTask.CommentById[FCommentId].AttachmentsCount > 0);
137+ TASHAttachments.TabVisible := AttachmentsTabIsVisible;
124138 // Caso a aba de anexos esteja visível e estivermos no modo de edição,
125139 // precisamos carregar os anexos no ListView, que, neste caso, não aceitará
126140 // mais anexos, servido apenas para que possamos copiar referências a eles
@@ -150,6 +164,8 @@
150164 TASHComment.TabVisible := False
151165 else
152166 PACO.ActivePage := TASHComment;
167+
168+ CHBXPrivate.Visible := (not FUpdating) and (not FAttachmentsOnly);
153169 end;
154170
155171 procedure TFormManageNote.DoDropFiles(ASender: TObject; const ADropHandle: LRESULT; out AMessageResult: LRESULT);
@@ -285,11 +301,12 @@
285301 end;
286302 end;
287303
288-class function TFormManageNote.ShowMeModal(AOwner: TComponent; ASpecialMode: TSpecialMode; ATaskId: Cardinal; out AComment: String): TModalResult;
304+class function TFormManageNote.ShowMeModal(AOwner: TComponent; ASpecialMode: TSpecialMode; ATaskId: Cardinal; out AComment: String; out APrivate: Boolean): TModalResult;
289305 begin
290306 with Self.Create(AOwner) do
291307 begin
292308 AComment := '';
309+ Aprivate := False;
293310
294311 FComment := '';
295312 FSpecialMode := ASpecialMode;
@@ -301,7 +318,8 @@
301318
302319 case ASpecialMode of
303320 TSpecialMode.Reject: LABECaption.Caption := 'Rejeitando a tarefa #' + ATaskId.ToString;
304- TSpecialMode.Impede: LABECaption.Caption := 'Colocando em impedindo a tarefa #' + ATaskId.ToString;
321+ TSpecialMode.Impede: LABECaption.Caption := 'Impedindo a tarefa #' + ATaskId.ToString;
322+ TSpecialMode.Execute: LABECaption.Caption := 'Executando a tarefa #' + ATaskId.ToString;
305323 end;
306324
307325 // Caso exista um backup, pergunta se quer carregar.
@@ -310,10 +328,11 @@
310328
311329 Result := ShowModal;
312330 AComment := FComment;
331+ Aprivate := CHBXPrivate.Checked;
313332 end;
314333 end;
315334
316-class function TFormManageNote.ShowMeModal(ADamoTask: TDamoTask; ATask: TTask; ACommentId: Cardinal; out AComment: String; out AAttachments: TArray<String>; out AUpdateToken: String; AAttacmentshOnly: Boolean = False): TModalResult;
335+class function TFormManageNote.ShowMeModal(ADamoTask: TDamoTask; ATask: TTask; ACommentId: Cardinal; out AComment: String; out APrivate: Boolean; out AAttachments: TArray<String>; out AUpdateToken: String; AAttacmentshOnly: Boolean = False): TModalResult;
317336 begin
318337 Result := mrAbort; // Se tudo der errado...
319338
@@ -323,6 +342,7 @@
323342 FTask := ATask;
324343 FCommentId := ACommentId;
325344 AComment := '';
345+ APrivate := False;
326346 AUpdateToken := '';
327347
328348 FComment := '';
@@ -365,6 +385,7 @@
365385 FComment := CommentBackupLoad(FCommentId);
366386 Result := ShowModal;
367387 AComment := Trim(FComment);
388+ APrivate := CHBXPrivate.Checked;
368389 end
369390 // Caso não existe um backup ou o usuário optou por não carregar um,
370391 // simplesmente abre o form com o comentário obtido do Mantis
@@ -372,6 +393,7 @@
372393 begin
373394 Result := ShowModal;
374395 AComment := Trim(FComment);
396+ APrivate := CHBXPrivate.Checked;
375397 end;
376398 end
377399 // Se não estamos tentando editar um comentário, entraremos no modo de
@@ -389,6 +411,7 @@
389411
390412 Result := ShowModal;
391413 AComment := Trim(FComment);
414+ APrivate := CHBXPrivate.Checked;
392415 AAttachments := FAttachments;
393416 end;
394417 end;
--- trunk/client/src/UFormTask.pas (revision 74)
+++ trunk/client/src/UFormTask.pas (revision 75)
@@ -8,7 +8,8 @@
88 ToolWin, OleCtrls, ComCtrls, DB, DBClient, Grids, DBGrids,
99 KRK.Vcl.DBGrids, DBCtrls, UPngSpeedButton, DBCGrids, UDamoTask, Vcl.ActnMan,
1010 Vcl.ActnCtrls, UScrapFunctions, System.Actions, Vcl.ActnList,
11- Vcl.XPStyleActnCtrls, UInterposersAndHelpers, UTypes, KRK.Internet.Edge;
11+ Vcl.XPStyleActnCtrls, UInterposersAndHelpers, UTypes, KRK.Internet.Edge,
12+ UDamoPrincipal;
1213
1314 const
1415 MBTM_EDITCOMMENT = WM_USER;
@@ -97,9 +98,13 @@
9798 procedure ACTNOpenWithMantisExecute(Sender: TObject);
9899 procedure ACTNExecuteExecute(Sender: TObject);
99100 procedure ACTNRejectExecute(Sender: TObject);
101+ procedure ACTNSendToTestExecute(Sender: TObject);
102+ procedure ACTNSendToHomologationExecute(Sender: TObject);
103+ procedure ACTNImpeachmentExecute(Sender: TObject);
100104 private
101105 { Private declarations }
102106 FDamoTask: TDamoTask;
107+ FDamoPrincipal: TDamoPrincipal;
103108 FCommentId: Cardinal;
104109 FDescriptionLoaded: Boolean;
105110 FAttachmentsLoaded: Boolean;
@@ -128,10 +133,10 @@
128133 procedure CreateParams(var Params: TCreateParams); override;
129134 public
130135 { Public declarations }
131- constructor Create(AOwner: TComponent; ATaskId: Cardinal; ACommentId: Cardinal = 0); reintroduce;
136+ constructor Create(ADamoPrincipal: TDamoPrincipal; AOwner: TComponent; ATaskId: Cardinal; ACommentId: Cardinal = 0); reintroduce;
132137
133- class function ShowMe(var ATask: TTask; ACommentId: Cardinal = 0; AModal: Boolean = False): TModalResult; overload;
134- class function ShowMe(ATaskId: Cardinal; ACommentId: Cardinal = 0; AModal: Boolean = False): TModalResult; overload;
138+ class function ShowMe(ADamoPrincipal: TDamoPrincipal; var ATask: TTask; ACommentId: Cardinal = 0; AModal: Boolean = False): TModalResult; overload;
139+ class function ShowMe(ADamoPrincipal: TDamoPrincipal; ATaskId: Cardinal; ACommentId: Cardinal = 0; AModal: Boolean = False): TModalResult; overload;
135140
136141 procedure InitializeFormTask(var ATask: TTask);
137142 end;
@@ -151,6 +156,12 @@
151156 FDamoTask.Execute;
152157 end;
153158
159+procedure TFormTask.ACTNImpeachmentExecute(Sender: TObject);
160+begin
161+ inherited;
162+ FDamoTask.Impede;
163+end;
164+
154165 procedure TFormTask.ACTNOpenWithMantisExecute(Sender: TObject);
155166 begin
156167 inherited;
@@ -169,9 +180,22 @@
169180 FDamoTask.Reject;
170181 end;
171182
172-constructor TFormTask.Create(AOwner: TComponent; ATaskId: Cardinal; ACommentId: Cardinal = 0);
183+procedure TFormTask.ACTNSendToHomologationExecute(Sender: TObject);
173184 begin
174- FDamoTask := TDamoTask.Create(Self);
185+ inherited;
186+ FDamoTask.SendToHomologation;
187+end;
188+
189+procedure TFormTask.ACTNSendToTestExecute(Sender: TObject);
190+begin
191+ inherited;
192+ FDamoTask.SendToTest;
193+end;
194+
195+constructor TFormTask.Create(ADamoPrincipal: TDamoPrincipal; AOwner: TComponent; ATaskId: Cardinal; ACommentId: Cardinal = 0);
196+begin
197+ FDamoPrincipal := ADamoPrincipal;
198+ FDamoTask := TDamoTask.Create(FDamoPrincipal,Self);
175199 FCommentId := ACommentId;
176200
177201 inherited Create(AOwner);
@@ -416,7 +440,7 @@
416440 procedure TFormTask.HandleOpenTaskMessage(var AMessage: TMessage);
417441 begin
418442 // AMessage.LParam contem o código do comentário, mas não o estou usando aqui
419- TFormTask.ShowMe(AMessage.WParam,AMessage.LParam);
443+ TFormTask.ShowMe(FDamoPrincipal,AMessage.WParam,AMessage.LParam);
420444 end;
421445
422446 procedure TFormTask.IMAGHeaderClick(Sender: TObject);
@@ -464,7 +488,7 @@
464488 procedure TFormTask.KRDGRelatedTasksDblClick(Sender: TObject);
465489 begin
466490 if FDamoTask.CLDSRelatedTasks.RecordCount > 0 then
467- TFormTask.ShowMe(FDamoTask.CLDSRelatedTasksNumber.AsInteger);
491+ TFormTask.ShowMe(FDamoPrincipal,FDamoTask.CLDSRelatedTasksNumber.AsInteger);
468492 end;
469493
470494 procedure TFormTask.KRDGRelatedTasksDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
@@ -580,16 +604,16 @@
580604 Close;
581605 end;
582606
583-class function TFormTask.ShowMe(ATaskId: Cardinal; ACommentId: Cardinal = 0; AModal: Boolean = False): TModalResult;
607+class function TFormTask.ShowMe(ADamoPrincipal: TDamoPrincipal; ATaskId: Cardinal; ACommentId: Cardinal = 0; AModal: Boolean = False): TModalResult;
584608 var
585609 Task: TTask;
586610 begin
587611 Task.Id := ATaskId;
588612
589- Result := ShowMe(Task,ACommentId,AModal);
613+ Result := ShowMe(ADamoPrincipal,Task,ACommentId,AModal);
590614 end;
591615
592-class function TFormTask.ShowMe(var ATask: TTask; ACommentId: Cardinal = 0; AModal: Boolean = False): TModalResult;
616+class function TFormTask.ShowMe(ADamoPrincipal: TDamoPrincipal; var ATask: TTask; ACommentId: Cardinal = 0; AModal: Boolean = False): TModalResult;
593617 var
594618 i: Word;
595619 begin
@@ -600,7 +624,7 @@
600624 Break;
601625
602626 if i = Application.ComponentCount then
603- with Self.Create(Application,ATask.Id,ACommentId) do
627+ with Self.Create(ADamoPrincipal,Application,ATask.Id,ACommentId) do
604628 begin
605629 AutoCaption := True;
606630
Show on old repository browser