From a75efcb7af6dc469c326021155af14fb9894e274 Mon Sep 17 00:00:00 2001 From: Danil Kislov Date: Wed, 27 Mar 2019 10:14:45 +0300 Subject: [PATCH 1/7] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D1=8C=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D0=B2=D0=BD?= =?UTF-8?q?=D0=B5=D1=81=D0=B5=D0=BD=D0=BD=D1=8B=D1=85=20=D0=B2=D1=80=D1=83?= =?UTF-8?q?=D1=87=D0=BD=D1=83=D1=8E.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .semver.txt | 2 +- README.md | 5 +- src/JiraTimeBot/Configuration/Settings.cs | 1 + src/JiraTimeBot/JiraIntegration/JiraApi.cs | 38 +++++++++++- .../JiraIntegration/JiraCommitEmulator.cs | 1 + src/JiraTimeBot/Job.cs | 2 +- src/JiraTimeBot/Properties/AssemblyInfo.cs | 62 +++++++++---------- .../TaskTime/TaskTimeByCommitsCalculator.cs | 12 ++++ .../TasksProcessors/ITasksProcessor.cs | 3 +- .../TasksProcessors/MeetingProcessor.cs | 3 +- .../TasksProcessors/WorkLogTasksProcessor.cs | 5 +- src/JiraTimeBot/UI/frmSettings.Designer.cs | 17 ++++- src/JiraTimeBot/UI/frmSettings.cs | 8 +-- 13 files changed, 113 insertions(+), 46 deletions(-) diff --git a/.semver.txt b/.semver.txt index ffcbe71..28dff43 100644 --- a/.semver.txt +++ b/.semver.txt @@ -1 +1 @@ -1.0.34 +1.0.35 diff --git a/README.md b/README.md index 6b2161a..f422a19 100644 --- a/README.md +++ b/README.md @@ -12,12 +12,13 @@ - Путь до репо (Режим Mercurial) - путь до папки, в которую клонируются исходники. - Логин Jira - Логин в Jira (от этого пользователя будем выполнять запросы и вносить время). - Пароль Jira - шифруется через DPAPI. - - Mercurial Name (Режим Mercurial) - обязателен к указанию для режима Mercurial - имя пользователя Mercurial, от которого проходят коммиты. + - Mercurial Name (Режим Mercurial) - обязателен к указанию для режима Mercurial - имя пользователя Mercurial, от которого проходят коммиты (именно UserName, не E-Mail). - Округление времени - Для красоты распределения времени тут устанавливается округление. По умолчанию - 15 минут, получим время 1:15, 0:30 итд. Остаток нераспределенного времени будет внесен в самую долгую задачу или же если это невозможно - количество рабочего времени будет увеличено или уменьшено. - JQL (Режим Jira) - можно задать свой JQL для поиска задач. Возможные замены: %USER% - Логин Jira, %DATE% дата на которую формируем список. Значнеие по умолчанию: status changed by '%USER%' during ("%DATE%","%DATE%") + - Задача "учёта времени" - задача, куда будет списываться по 30 минут в день на "затраты на учет времени". Должна содержать знак '-'. - Время запуска - время автоматического запуска бота. Если была установлена галочка "тестовый прогон" - она будет снята. - Добавлять описание (Режим Mercurial) - добавлять ли в описание CommitMessage, если не установлено - добавляются стандартные фразы программистов (типа "написание кода"). - - Задача "учёта времени" - задача, куда будет списываться по 30 минут в день на "затраты на учет времени". Должна содержать знак '-'. + - Заменять время за день - если галочка установлена, то время внесенное пользователем за день будет удалено и заменено на добавленное ботом. # Скачать Скачать актуальную версию можно тут: https://github.com/monster1025/JiraTimeBot/releases/latest diff --git a/src/JiraTimeBot/Configuration/Settings.cs b/src/JiraTimeBot/Configuration/Settings.cs index b0791e5..708eb6d 100644 --- a/src/JiraTimeBot/Configuration/Settings.cs +++ b/src/JiraTimeBot/Configuration/Settings.cs @@ -23,6 +23,7 @@ namespace JiraTimeBot.Configuration public WorkType WorkType { get; set; } public string JiraQuery { get; set; } public string TimeControlTask { get; set; } + public bool RemoveWorklogsAddedByUser { get; set; } public static Settings LoadAndCheck(Action settingsSource, Action errorMessageReporter) { diff --git a/src/JiraTimeBot/JiraIntegration/JiraApi.cs b/src/JiraTimeBot/JiraIntegration/JiraApi.cs index 5e7fae4..b7e4b2e 100644 --- a/src/JiraTimeBot/JiraIntegration/JiraApi.cs +++ b/src/JiraTimeBot/JiraIntegration/JiraApi.cs @@ -62,7 +62,37 @@ namespace JiraTimeBot.JiraIntegration } } - public void SetTodayWorklog(List taskTimeItems, Settings settings, DateTime? date = null, bool dummy = false, bool addCommentsToWorklog = false) + public List GetWorkloggedIssuesByDate(Settings settings, DateTime? date = null, CancellationToken cancellationToken = default(CancellationToken)) + { + date = date.GetValueOrDefault(DateTime.Now.Date); + var jql = "issueFunction in workLogged(\"on %DATE% by '%USER%'\")"; + return GetIssuesByJQL(jql, settings, date, cancellationToken); + } + + private void RemoveWorklogsAddedByUser(List taskTimeItems, Settings settings, DateTime? date = null, bool dummy = false, CancellationToken cancellationToken = default(CancellationToken)) + { + var alreadyLoggedToday = GetWorkloggedIssuesByDate(settings, date); + foreach (var issue in alreadyLoggedToday) + { + if (!taskTimeItems.Any(f => f.Branch.Equals(issue.Key.Value, StringComparison.InvariantCulture))) + { + _log.Trace($"Удаляю добавленный руками WorkLog для задачи {issue.Key.Value}."); + var workLogs = issue.GetWorklogsAsync(cancellationToken).Result; + var userWorklogs = workLogs.Where(w => + w.CreateDate.GetValueOrDefault().Date == date && w.Author.Equals(settings.JiraUserName, + StringComparison.InvariantCultureIgnoreCase)).ToList(); + foreach (var userWorklog in userWorklogs) + { + if (!dummy) + { + issue.DeleteWorklogAsync(userWorklog, token: cancellationToken); + } + } + } + } + } + + public void SetTodayWorklog(List taskTimeItems, Settings settings, DateTime? date = null, bool dummy = false, bool addCommentsToWorklog = false, CancellationToken cancellationToken = default(CancellationToken)) { var jira = Jira.CreateRestClient(settings.JiraUrl, settings.JiraUserName, settings.JiraPassword); @@ -72,6 +102,12 @@ namespace JiraTimeBot.JiraIntegration } date = date.Value.Date; + //Удаляем добавленные вручную пользователем данные. + if (settings.AddCommentsToWorklog) + { + RemoveWorklogsAddedByUser(taskTimeItems, settings, date, dummy, cancellationToken); + } + foreach (TaskTimeItem taskTimeItem in taskTimeItems) { Issue issue = null; diff --git a/src/JiraTimeBot/JiraIntegration/JiraCommitEmulator.cs b/src/JiraTimeBot/JiraIntegration/JiraCommitEmulator.cs index 42fae56..db31fcf 100644 --- a/src/JiraTimeBot/JiraIntegration/JiraCommitEmulator.cs +++ b/src/JiraTimeBot/JiraIntegration/JiraCommitEmulator.cs @@ -37,6 +37,7 @@ namespace JiraTimeBot.JiraIntegration var comments = issue.GetCommentsAsync(cancellationToken).Result?.ToList() ?? new List(); var user = settings.JiraUserName; + //user = "Zoya.Aleksandridi"; var userComments = comments.Where(f => f.Author.Equals(user, StringComparison.InvariantCultureIgnoreCase)).ToList(); _log.Trace($"Получены комментарии по задаче {issue.Key} ({issue.Type?.Name}): {userComments.Count}."); diff --git a/src/JiraTimeBot/Job.cs b/src/JiraTimeBot/Job.cs index f65407a..d98161c 100644 --- a/src/JiraTimeBot/Job.cs +++ b/src/JiraTimeBot/Job.cs @@ -71,7 +71,7 @@ namespace JiraTimeBot continue; } - tasksProcessor.Process(date, taskTimes, settings, dummyMode); + tasksProcessor.Process(date, taskTimes, settings, dummyMode, cancellationToken); _log.Info("Готово."); return; diff --git a/src/JiraTimeBot/Properties/AssemblyInfo.cs b/src/JiraTimeBot/Properties/AssemblyInfo.cs index 7bb874d..fe8b321 100644 --- a/src/JiraTimeBot/Properties/AssemblyInfo.cs +++ b/src/JiraTimeBot/Properties/AssemblyInfo.cs @@ -1,31 +1,31 @@ -using System.Reflection; -using System.Runtime.InteropServices; -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("JiraTimeBot")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("JiraTimeBot")] -[assembly: AssemblyCopyright("Copyright © 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("f3b89316-c38c-4ce6-9d88-0b1373cfba1a")] -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("1.0.34")] -[assembly: AssemblyFileVersion("1.0.34")] -[assembly: AssemblyInformationalVersion("1.0.34")] +using System.Reflection; +using System.Runtime.InteropServices; +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("JiraTimeBot")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("JiraTimeBot")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("f3b89316-c38c-4ce6-9d88-0b1373cfba1a")] +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.35")] +[assembly: AssemblyFileVersion("1.0.35")] +[assembly: AssemblyInformationalVersion("1.0.35")] diff --git a/src/JiraTimeBot/TaskTime/TaskTimeByCommitsCalculator.cs b/src/JiraTimeBot/TaskTime/TaskTimeByCommitsCalculator.cs index 3e39b11..066679d 100644 --- a/src/JiraTimeBot/TaskTime/TaskTimeByCommitsCalculator.cs +++ b/src/JiraTimeBot/TaskTime/TaskTimeByCommitsCalculator.cs @@ -104,9 +104,21 @@ namespace JiraTimeBot.TaskTime workTimeItems.First().Time += TimeSpan.FromMinutes(remainMinutes); } + PrintTotal(workTimeItems); + return workTimeItems; } + private void PrintTotal(List workTimeItems) + { + var totalTime = TimeSpan.Zero; + foreach (var workTimeItem in workTimeItems) + { + totalTime += workTimeItem.Time; + } + + _log.Trace($"Итоговое реально проставляемое время: {totalTime}"); + } private decimal RoundTo(decimal value, decimal to = 15, bool up = true) diff --git a/src/JiraTimeBot/TasksProcessors/ITasksProcessor.cs b/src/JiraTimeBot/TasksProcessors/ITasksProcessor.cs index 9cf48ed..23968f2 100644 --- a/src/JiraTimeBot/TasksProcessors/ITasksProcessor.cs +++ b/src/JiraTimeBot/TasksProcessors/ITasksProcessor.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading; using JiraTimeBot.Configuration; using JiraTimeBot.TaskTime.Objects; @@ -7,6 +8,6 @@ namespace JiraTimeBot.TasksProcessors { interface ITasksProcessor { - void Process(DateTime date, List taskTimes, Settings settings, bool dummyMode); + void Process(DateTime date, List taskTimes, Settings settings, bool dummyMode, CancellationToken cancellationToken = default(CancellationToken)); } } diff --git a/src/JiraTimeBot/TasksProcessors/MeetingProcessor.cs b/src/JiraTimeBot/TasksProcessors/MeetingProcessor.cs index 13a3481..4003944 100644 --- a/src/JiraTimeBot/TasksProcessors/MeetingProcessor.cs +++ b/src/JiraTimeBot/TasksProcessors/MeetingProcessor.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading; using JiraTimeBot.Configuration; using JiraTimeBot.JiraIntegration; using JiraTimeBot.TaskTime.Objects; @@ -18,7 +19,7 @@ namespace JiraTimeBot.TasksProcessors _jiraApi = jiraApi; } - public void Process(DateTime date, List taskTimes, Settings settings, bool dummyMode) + public void Process(DateTime date, List taskTimes, Settings settings, bool dummyMode, CancellationToken cancellationToken = default(CancellationToken)) { _log.Trace($"На реальную дату {date:dd.MM.yyyy} распределение по задачам:"); diff --git a/src/JiraTimeBot/TasksProcessors/WorkLogTasksProcessor.cs b/src/JiraTimeBot/TasksProcessors/WorkLogTasksProcessor.cs index 9a5ea57..f1cc39c 100644 --- a/src/JiraTimeBot/TasksProcessors/WorkLogTasksProcessor.cs +++ b/src/JiraTimeBot/TasksProcessors/WorkLogTasksProcessor.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading; using JiraTimeBot.Configuration; using JiraTimeBot.JiraIntegration; using JiraTimeBot.TaskTime.Objects; @@ -17,7 +18,7 @@ namespace JiraTimeBot.TasksProcessors _jiraApi = jiraApi; } - public void Process(DateTime date, List taskTimes, Settings settings, bool dummyMode) + public void Process(DateTime date, List taskTimes, Settings settings, bool dummyMode, CancellationToken cancellationToken = default(CancellationToken)) { _log.Trace($"На реальную дату {date:dd.MM.yyyy} распределение по задачам:"); foreach (var taskTime in taskTimes) @@ -25,7 +26,7 @@ namespace JiraTimeBot.TasksProcessors _log.Trace($"- {taskTime.Branch} (коммитов {taskTime.Commits}): {taskTime.Time}"); } - _jiraApi.SetTodayWorklog(taskTimes, settings, dummy: dummyMode, addCommentsToWorklog: settings.AddCommentsToWorklog); + _jiraApi.SetTodayWorklog(taskTimes, settings, dummy: dummyMode, addCommentsToWorklog: settings.AddCommentsToWorklog, cancellationToken: cancellationToken); } } } diff --git a/src/JiraTimeBot/UI/frmSettings.Designer.cs b/src/JiraTimeBot/UI/frmSettings.Designer.cs index f5ba9ce..ce6f6ca 100644 --- a/src/JiraTimeBot/UI/frmSettings.Designer.cs +++ b/src/JiraTimeBot/UI/frmSettings.Designer.cs @@ -49,6 +49,7 @@ this.label8 = new System.Windows.Forms.Label(); this.txtTimeControlTask = new System.Windows.Forms.TextBox(); this.chkAutostart = new System.Windows.Forms.CheckBox(); + this.chkRemoveAddedByUser = new System.Windows.Forms.CheckBox(); this.SuspendLayout(); // // label5 @@ -162,7 +163,7 @@ // // btnSave // - this.btnSave.Location = new System.Drawing.Point(72, 310); + this.btnSave.Location = new System.Drawing.Point(92, 322); this.btnSave.Name = "btnSave"; this.btnSave.Size = new System.Drawing.Size(75, 23); this.btnSave.TabIndex = 32; @@ -234,11 +235,22 @@ this.chkAutostart.Text = "Автозагрузка"; this.chkAutostart.UseVisualStyleBackColor = true; // + // chkRemoveAddedByUser + // + this.chkRemoveAddedByUser.AutoSize = true; + this.chkRemoveAddedByUser.Location = new System.Drawing.Point(56, 299); + this.chkRemoveAddedByUser.Name = "chkRemoveAddedByUser"; + this.chkRemoveAddedByUser.Size = new System.Drawing.Size(153, 17); + this.chkRemoveAddedByUser.TabIndex = 41; + this.chkRemoveAddedByUser.Text = "Заменять время за день"; + this.chkRemoveAddedByUser.UseVisualStyleBackColor = true; + // // frmSettings // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(243, 342); + this.ClientSize = new System.Drawing.Size(243, 357); + this.Controls.Add(this.chkRemoveAddedByUser); this.Controls.Add(this.chkAutostart); this.Controls.Add(this.label8); this.Controls.Add(this.txtTimeControlTask); @@ -294,5 +306,6 @@ private System.Windows.Forms.Label label8; private System.Windows.Forms.TextBox txtTimeControlTask; private System.Windows.Forms.CheckBox chkAutostart; + private System.Windows.Forms.CheckBox chkRemoveAddedByUser; } } \ No newline at end of file diff --git a/src/JiraTimeBot/UI/frmSettings.cs b/src/JiraTimeBot/UI/frmSettings.cs index 3052cd8..cba1c0f 100644 --- a/src/JiraTimeBot/UI/frmSettings.cs +++ b/src/JiraTimeBot/UI/frmSettings.cs @@ -33,11 +33,11 @@ namespace JiraTimeBot.UI txtMercurialEmail.Text = settings.MercurialAuthorEmail; txtRepoPath.Text = settings.RepositoryPath; actTime.Text = settings.ActivationTime.ToString("hh\\:mm\\:ss"); - //txtDummyMode.Checked = settings.DummyMode; chkAddComments.Checked = settings.AddCommentsToWorklog; txtRoundTo.Text = settings.RountToMinutes.ToString(); cboWorkType.SelectedIndex = (int) settings.WorkType; txtTimeControlTask.Text = settings.TimeControlTask; + chkRemoveAddedByUser.Checked = settings.RemoveWorklogsAddedByUser; txtJQL.Text = settings.JiraQuery; txtJQL.Enabled = settings.WorkType == WorkType.JiraLogs; } @@ -56,14 +56,14 @@ namespace JiraTimeBot.UI MercurialAuthorEmail = txtMercurialEmail.Text, ActivationTime = TimeSpan.Parse(actTime.Text), RepositoryPath = txtRepoPath.Text, - //DummyMode = txtDummyMode.Checked, AddCommentsToWorklog = chkAddComments.Checked, RountToMinutes = roundTo, WorkType = (WorkType) cboWorkType.SelectedIndex, JiraQuery = txtJQL.Text, - TimeControlTask = txtTimeControlTask.Text + TimeControlTask = txtTimeControlTask.Text, + RemoveWorklogsAddedByUser = chkRemoveAddedByUser.Checked }; - + //LockUnlock(false); return settings; From bc4f2c79b5da79ccf050df05387e8890d5784cf9 Mon Sep 17 00:00:00 2001 From: Danil Kislov Date: Wed, 27 Mar 2019 10:26:45 +0300 Subject: [PATCH 2/7] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B0=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BC=D0=B5=D0=BD=D1=8B=20=D0=B2=D1=80=D0=B5=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=20=D0=B7=D0=B0=20=D0=B4=D0=B5=D0=BD=D1=8C=20-=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BC=D0=B5=D0=BD=D1=8F=D0=B5=D0=BC=20=D0=B2=D1=81?= =?UTF-8?q?=D0=B5=D0=B3=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .semver.txt | 2 +- README.md | 1 - src/JiraTimeBot/Configuration/Settings.cs | 1 - src/JiraTimeBot/JiraIntegration/JiraApi.cs | 8 ++- src/JiraTimeBot/Properties/AssemblyInfo.cs | 62 +++++++++++----------- src/JiraTimeBot/UI/frmSettings.Designer.cs | 21 ++------ src/JiraTimeBot/UI/frmSettings.cs | 2 - 7 files changed, 39 insertions(+), 58 deletions(-) diff --git a/.semver.txt b/.semver.txt index 28dff43..2e9116b 100644 --- a/.semver.txt +++ b/.semver.txt @@ -1 +1 @@ -1.0.35 +1.0.36 diff --git a/README.md b/README.md index f422a19..dad9bca 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,6 @@ - Задача "учёта времени" - задача, куда будет списываться по 30 минут в день на "затраты на учет времени". Должна содержать знак '-'. - Время запуска - время автоматического запуска бота. Если была установлена галочка "тестовый прогон" - она будет снята. - Добавлять описание (Режим Mercurial) - добавлять ли в описание CommitMessage, если не установлено - добавляются стандартные фразы программистов (типа "написание кода"). - - Заменять время за день - если галочка установлена, то время внесенное пользователем за день будет удалено и заменено на добавленное ботом. # Скачать Скачать актуальную версию можно тут: https://github.com/monster1025/JiraTimeBot/releases/latest diff --git a/src/JiraTimeBot/Configuration/Settings.cs b/src/JiraTimeBot/Configuration/Settings.cs index 708eb6d..b0791e5 100644 --- a/src/JiraTimeBot/Configuration/Settings.cs +++ b/src/JiraTimeBot/Configuration/Settings.cs @@ -23,7 +23,6 @@ namespace JiraTimeBot.Configuration public WorkType WorkType { get; set; } public string JiraQuery { get; set; } public string TimeControlTask { get; set; } - public bool RemoveWorklogsAddedByUser { get; set; } public static Settings LoadAndCheck(Action settingsSource, Action errorMessageReporter) { diff --git a/src/JiraTimeBot/JiraIntegration/JiraApi.cs b/src/JiraTimeBot/JiraIntegration/JiraApi.cs index b7e4b2e..40217c7 100644 --- a/src/JiraTimeBot/JiraIntegration/JiraApi.cs +++ b/src/JiraTimeBot/JiraIntegration/JiraApi.cs @@ -76,13 +76,14 @@ namespace JiraTimeBot.JiraIntegration { if (!taskTimeItems.Any(f => f.Branch.Equals(issue.Key.Value, StringComparison.InvariantCulture))) { - _log.Trace($"Удаляю добавленный руками WorkLog для задачи {issue.Key.Value}."); var workLogs = issue.GetWorklogsAsync(cancellationToken).Result; var userWorklogs = workLogs.Where(w => w.CreateDate.GetValueOrDefault().Date == date && w.Author.Equals(settings.JiraUserName, StringComparison.InvariantCultureIgnoreCase)).ToList(); foreach (var userWorklog in userWorklogs) { + _log.Trace($"Удаляю добавленный руками WorkLog для задачи {issue.Key.Value}: {userWorklog.TimeSpent}, {userWorklog.Comment}."); + if (!dummy) { issue.DeleteWorklogAsync(userWorklog, token: cancellationToken); @@ -103,10 +104,7 @@ namespace JiraTimeBot.JiraIntegration date = date.Value.Date; //Удаляем добавленные вручную пользователем данные. - if (settings.AddCommentsToWorklog) - { - RemoveWorklogsAddedByUser(taskTimeItems, settings, date, dummy, cancellationToken); - } + RemoveWorklogsAddedByUser(taskTimeItems, settings, date, dummy, cancellationToken); foreach (TaskTimeItem taskTimeItem in taskTimeItems) { diff --git a/src/JiraTimeBot/Properties/AssemblyInfo.cs b/src/JiraTimeBot/Properties/AssemblyInfo.cs index fe8b321..4083cb6 100644 --- a/src/JiraTimeBot/Properties/AssemblyInfo.cs +++ b/src/JiraTimeBot/Properties/AssemblyInfo.cs @@ -1,31 +1,31 @@ -using System.Reflection; -using System.Runtime.InteropServices; -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("JiraTimeBot")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("JiraTimeBot")] -[assembly: AssemblyCopyright("Copyright © 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("f3b89316-c38c-4ce6-9d88-0b1373cfba1a")] -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("1.0.35")] -[assembly: AssemblyFileVersion("1.0.35")] -[assembly: AssemblyInformationalVersion("1.0.35")] +using System.Reflection; +using System.Runtime.InteropServices; +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("JiraTimeBot")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("JiraTimeBot")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("f3b89316-c38c-4ce6-9d88-0b1373cfba1a")] +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.36")] +[assembly: AssemblyFileVersion("1.0.36")] +[assembly: AssemblyInformationalVersion("1.0.36")] diff --git a/src/JiraTimeBot/UI/frmSettings.Designer.cs b/src/JiraTimeBot/UI/frmSettings.Designer.cs index ce6f6ca..0abbfa0 100644 --- a/src/JiraTimeBot/UI/frmSettings.Designer.cs +++ b/src/JiraTimeBot/UI/frmSettings.Designer.cs @@ -49,7 +49,6 @@ this.label8 = new System.Windows.Forms.Label(); this.txtTimeControlTask = new System.Windows.Forms.TextBox(); this.chkAutostart = new System.Windows.Forms.CheckBox(); - this.chkRemoveAddedByUser = new System.Windows.Forms.CheckBox(); this.SuspendLayout(); // // label5 @@ -154,7 +153,7 @@ // chkAddComments // this.chkAddComments.AutoSize = true; - this.chkAddComments.Location = new System.Drawing.Point(56, 277); + this.chkAddComments.Location = new System.Drawing.Point(65, 277); this.chkAddComments.Name = "chkAddComments"; this.chkAddComments.Size = new System.Drawing.Size(133, 17); this.chkAddComments.TabIndex = 31; @@ -163,7 +162,7 @@ // // btnSave // - this.btnSave.Location = new System.Drawing.Point(92, 322); + this.btnSave.Location = new System.Drawing.Point(86, 300); this.btnSave.Name = "btnSave"; this.btnSave.Size = new System.Drawing.Size(75, 23); this.btnSave.TabIndex = 32; @@ -228,29 +227,18 @@ // chkAutostart // this.chkAutostart.AutoSize = true; - this.chkAutostart.Location = new System.Drawing.Point(56, 254); + this.chkAutostart.Location = new System.Drawing.Point(65, 254); this.chkAutostart.Name = "chkAutostart"; this.chkAutostart.Size = new System.Drawing.Size(96, 17); this.chkAutostart.TabIndex = 40; this.chkAutostart.Text = "Автозагрузка"; this.chkAutostart.UseVisualStyleBackColor = true; // - // chkRemoveAddedByUser - // - this.chkRemoveAddedByUser.AutoSize = true; - this.chkRemoveAddedByUser.Location = new System.Drawing.Point(56, 299); - this.chkRemoveAddedByUser.Name = "chkRemoveAddedByUser"; - this.chkRemoveAddedByUser.Size = new System.Drawing.Size(153, 17); - this.chkRemoveAddedByUser.TabIndex = 41; - this.chkRemoveAddedByUser.Text = "Заменять время за день"; - this.chkRemoveAddedByUser.UseVisualStyleBackColor = true; - // // frmSettings // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(243, 357); - this.Controls.Add(this.chkRemoveAddedByUser); + this.ClientSize = new System.Drawing.Size(243, 334); this.Controls.Add(this.chkAutostart); this.Controls.Add(this.label8); this.Controls.Add(this.txtTimeControlTask); @@ -306,6 +294,5 @@ private System.Windows.Forms.Label label8; private System.Windows.Forms.TextBox txtTimeControlTask; private System.Windows.Forms.CheckBox chkAutostart; - private System.Windows.Forms.CheckBox chkRemoveAddedByUser; } } \ No newline at end of file diff --git a/src/JiraTimeBot/UI/frmSettings.cs b/src/JiraTimeBot/UI/frmSettings.cs index cba1c0f..aa50f22 100644 --- a/src/JiraTimeBot/UI/frmSettings.cs +++ b/src/JiraTimeBot/UI/frmSettings.cs @@ -37,7 +37,6 @@ namespace JiraTimeBot.UI txtRoundTo.Text = settings.RountToMinutes.ToString(); cboWorkType.SelectedIndex = (int) settings.WorkType; txtTimeControlTask.Text = settings.TimeControlTask; - chkRemoveAddedByUser.Checked = settings.RemoveWorklogsAddedByUser; txtJQL.Text = settings.JiraQuery; txtJQL.Enabled = settings.WorkType == WorkType.JiraLogs; } @@ -61,7 +60,6 @@ namespace JiraTimeBot.UI WorkType = (WorkType) cboWorkType.SelectedIndex, JiraQuery = txtJQL.Text, TimeControlTask = txtTimeControlTask.Text, - RemoveWorklogsAddedByUser = chkRemoveAddedByUser.Checked }; //LockUnlock(false); From 639d7b8e660a4627171a01fd973eeb231a8cbd62 Mon Sep 17 00:00:00 2001 From: Danil Kislov Date: Wed, 27 Mar 2019 11:10:37 +0300 Subject: [PATCH 3/7] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D1=8C=20=D1=83=D0=BA=D0=B0=D0=B7=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B4=D0=B0=D1=82=D1=8B=20(=D0=BA=D0=BE=D0=BD=D1=86?= =?UTF-8?q?=D0=B5=D1=80=D1=82=20=D0=BF=D0=BE=20=D0=B7=D0=B0=D1=8F=D0=B2?= =?UTF-8?q?=D0=BA=D0=B0=D0=BC=20=D0=B7=D0=B0=D0=B1=D1=8B=D0=B2=D0=B0=D1=8E?= =?UTF-8?q?=D1=89=D0=B8=D1=85)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .semver.txt | 2 +- src/JiraTimeBot/DI/ContainerBuilder.cs | 3 + src/JiraTimeBot/JiraIntegration/JiraApi.cs | 15 +- src/JiraTimeBot/JiraTimeBot.csproj | 3 +- src/JiraTimeBot/Job.cs | 69 ++++--- src/JiraTimeBot/Properties/AssemblyInfo.cs | 62 +++---- .../TasksProcessors/ITasksProcessor.cs | 2 +- .../TasksProcessors/MeetingProcessor.cs | 4 +- .../TasksProcessors/WorkLogTasksProcessor.cs | 6 +- src/JiraTimeBot/UI/frmMain.Designer.cs | 27 +++ src/JiraTimeBot/UI/frmMain.cs | 80 ++------- src/JiraTimeBot/Update/IUpdater.cs | 9 + src/JiraTimeBot/Update/UpdateChecker.cs | 78 -------- src/JiraTimeBot/Update/Updater.cs | 169 ++++++++++++++++++ 14 files changed, 307 insertions(+), 222 deletions(-) create mode 100644 src/JiraTimeBot/Update/IUpdater.cs delete mode 100644 src/JiraTimeBot/Update/UpdateChecker.cs create mode 100644 src/JiraTimeBot/Update/Updater.cs diff --git a/.semver.txt b/.semver.txt index 2e9116b..f6c5328 100644 --- a/.semver.txt +++ b/.semver.txt @@ -1 +1 @@ -1.0.36 +1.0.37 diff --git a/src/JiraTimeBot/DI/ContainerBuilder.cs b/src/JiraTimeBot/DI/ContainerBuilder.cs index 63d03c3..2c1e6e5 100644 --- a/src/JiraTimeBot/DI/ContainerBuilder.cs +++ b/src/JiraTimeBot/DI/ContainerBuilder.cs @@ -11,6 +11,7 @@ using System; using System.Windows.Forms; using JiraTimeBot.UI; using JiraTimeBot.UI.Startup; +using JiraTimeBot.Update; namespace JiraTimeBot.DI { @@ -38,6 +39,8 @@ namespace JiraTimeBot.DI _builder.Register(f => new TrayMenu()).As().AsSelf(); _builder.Register(c => new CommitSkipper()).As(); + _builder.RegisterType().As(); + _builder.RegisterType().As().AsSelf(); _builder.RegisterType().As().AsSelf(); diff --git a/src/JiraTimeBot/JiraIntegration/JiraApi.cs b/src/JiraTimeBot/JiraIntegration/JiraApi.cs index 40217c7..49fefc3 100644 --- a/src/JiraTimeBot/JiraIntegration/JiraApi.cs +++ b/src/JiraTimeBot/JiraIntegration/JiraApi.cs @@ -95,14 +95,9 @@ namespace JiraTimeBot.JiraIntegration public void SetTodayWorklog(List taskTimeItems, Settings settings, DateTime? date = null, bool dummy = false, bool addCommentsToWorklog = false, CancellationToken cancellationToken = default(CancellationToken)) { + date = date.GetValueOrDefault(DateTime.Now.Date).Date; var jira = Jira.CreateRestClient(settings.JiraUrl, settings.JiraUserName, settings.JiraPassword); - if (date == null) - { - date = DateTime.Now.Date; - } - date = date.Value.Date; - //Удаляем добавленные вручную пользователем данные. RemoveWorklogsAddedByUser(taskTimeItems, settings, date, dummy, cancellationToken); @@ -124,9 +119,9 @@ namespace JiraTimeBot.JiraIntegration } var hasTodayWorklog = false; - var workLogs = issue.GetWorklogsAsync().Result; + var workLogs = issue.GetWorklogsAsync(cancellationToken).Result; var userWorklogs = workLogs.Where(w => - w.CreateDate.GetValueOrDefault().Date == date && w.Author.Equals(settings.JiraUserName, + w.StartDate.GetValueOrDefault().Date == date && w.Author.Equals(settings.JiraUserName, StringComparison.InvariantCultureIgnoreCase)).ToList(); foreach (var workLog in userWorklogs) @@ -145,7 +140,7 @@ namespace JiraTimeBot.JiraIntegration } if (!dummy) { - issue.DeleteWorklogAsync(workLog); + issue.DeleteWorklogAsync(workLog, token: cancellationToken); } hasTodayWorklog = false; } @@ -165,7 +160,7 @@ namespace JiraTimeBot.JiraIntegration Worklog workLogToAdd = new Worklog(timeSpentJira, date.Value, comment); if (!dummy) { - workLogToAdd = issue.AddWorklogAsync(workLogToAdd).Result; + workLogToAdd = issue.AddWorklogAsync(workLogToAdd, token: cancellationToken).Result; } _log.Trace($"Добавили Worklog для {taskTimeItem.Branch}: {workLogToAdd.Author} {workLogToAdd.CreateDate}: {workLogToAdd.TimeSpent}"); } diff --git a/src/JiraTimeBot/JiraTimeBot.csproj b/src/JiraTimeBot/JiraTimeBot.csproj index 72b3259..e1e7eb1 100644 --- a/src/JiraTimeBot/JiraTimeBot.csproj +++ b/src/JiraTimeBot/JiraTimeBot.csproj @@ -122,7 +122,8 @@ - + + frmMain.cs diff --git a/src/JiraTimeBot/Job.cs b/src/JiraTimeBot/Job.cs index d98161c..8732c65 100644 --- a/src/JiraTimeBot/Job.cs +++ b/src/JiraTimeBot/Job.cs @@ -31,7 +31,7 @@ namespace JiraTimeBot return Task.Run(() => DoTheJobImpl(settings, tasksProcessor, dummyMode, cancellationToken), cancellationToken); } - + private void DoTheJobImpl(Settings settings, ITasksProcessor tasksProcessor, bool dummyMode, CancellationToken cancellationToken) { int daysDiff = 0; @@ -40,43 +40,58 @@ namespace JiraTimeBot daysDiff = -1; } + var setForDate = DateTime.Now.Date; while (true) { - DateTime date = DateTime.Now.Date.AddDays(daysDiff); + DateTime realDate = DateTime.Now.Date.AddDays(daysDiff); - IMercurialLog mercurial = _mercurialProviders.MercurialLog; - if (settings.WorkType == WorkType.JiraLogs) - { - _log.Info("Использую Jira как источник информации."); - mercurial = _mercurialProviders.JiraCommitEmulator; - } - List commits = mercurial.GetMercurialLog(settings, date, cancellationToken); - List taskTimes = _taskTimeDiscoverer.CalculateTaskTime(commits, settings, cancellationToken); - - if (cancellationToken.IsCancellationRequested) + if (SetTaskTimesForDateImpl(setForDate, realDate, settings, tasksProcessor, dummyMode, cancellationToken)) { return; } - if (!taskTimes.Any()) + _log.Warn($"{realDate:dd.MM.yyyy} вы не сделали ничего полезного =) Использую предыдущий день."); + daysDiff--; + if (daysDiff < -7) { - _log.Warn($"{date:dd.MM.yyyy} вы не сделали ничего полезного =) Использую предыдущий день."); - daysDiff--; - if (daysDiff < -7) - { - _log.Error("Не нашли ни одного коммита за предыдущие 7 дней. Возможно вы в отпуске? Выхожу."); - return; - } - - continue; + _log.Error("Не нашли ни одного коммита за предыдущие 7 дней. Возможно вы в отпуске? Выхожу."); + return; } - - tasksProcessor.Process(date, taskTimes, settings, dummyMode, cancellationToken); - - _log.Info("Готово."); - return; } } + public Task SetTaskTimesForDate(DateTime setForDate, DateTime realDate, Settings settings, ITasksProcessor tasksProcessor, bool dummyMode, CancellationToken cancellationToken) + { + _log.Info("Начинаем работу"); + + return Task.Run(() => SetTaskTimesForDateImpl(setForDate, realDate, settings, tasksProcessor, dummyMode, cancellationToken), cancellationToken); + } + + private bool SetTaskTimesForDateImpl(DateTime setForDate, DateTime realDate, Settings settings, ITasksProcessor tasksProcessor, bool dummyMode, CancellationToken cancellationToken) + { + IMercurialLog mercurial = _mercurialProviders.MercurialLog; + if (settings.WorkType == WorkType.JiraLogs) + { + _log.Info("Использую Jira как источник информации."); + mercurial = _mercurialProviders.JiraCommitEmulator; + } + List commits = mercurial.GetMercurialLog(settings, realDate, cancellationToken); + List taskTimes = _taskTimeDiscoverer.CalculateTaskTime(commits, settings, cancellationToken); + + if (cancellationToken.IsCancellationRequested) + { + return false; + } + + if (!taskTimes.Any()) + { + return false; + } + + tasksProcessor.Process(setForDate, realDate, taskTimes, settings, dummyMode, cancellationToken); + + _log.Info("Готово."); + return true; + } } } diff --git a/src/JiraTimeBot/Properties/AssemblyInfo.cs b/src/JiraTimeBot/Properties/AssemblyInfo.cs index 4083cb6..9adeba5 100644 --- a/src/JiraTimeBot/Properties/AssemblyInfo.cs +++ b/src/JiraTimeBot/Properties/AssemblyInfo.cs @@ -1,31 +1,31 @@ -using System.Reflection; -using System.Runtime.InteropServices; -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("JiraTimeBot")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("JiraTimeBot")] -[assembly: AssemblyCopyright("Copyright © 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("f3b89316-c38c-4ce6-9d88-0b1373cfba1a")] -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("1.0.36")] -[assembly: AssemblyFileVersion("1.0.36")] -[assembly: AssemblyInformationalVersion("1.0.36")] +using System.Reflection; +using System.Runtime.InteropServices; +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("JiraTimeBot")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("JiraTimeBot")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("f3b89316-c38c-4ce6-9d88-0b1373cfba1a")] +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.37")] +[assembly: AssemblyFileVersion("1.0.37")] +[assembly: AssemblyInformationalVersion("1.0.37")] diff --git a/src/JiraTimeBot/TasksProcessors/ITasksProcessor.cs b/src/JiraTimeBot/TasksProcessors/ITasksProcessor.cs index 23968f2..8ff5477 100644 --- a/src/JiraTimeBot/TasksProcessors/ITasksProcessor.cs +++ b/src/JiraTimeBot/TasksProcessors/ITasksProcessor.cs @@ -8,6 +8,6 @@ namespace JiraTimeBot.TasksProcessors { interface ITasksProcessor { - void Process(DateTime date, List taskTimes, Settings settings, bool dummyMode, CancellationToken cancellationToken = default(CancellationToken)); + void Process(DateTime setForDate, DateTime realDate, List taskTimes, Settings settings, bool dummyMode, CancellationToken cancellationToken = default(CancellationToken)); } } diff --git a/src/JiraTimeBot/TasksProcessors/MeetingProcessor.cs b/src/JiraTimeBot/TasksProcessors/MeetingProcessor.cs index 4003944..4d3c0cf 100644 --- a/src/JiraTimeBot/TasksProcessors/MeetingProcessor.cs +++ b/src/JiraTimeBot/TasksProcessors/MeetingProcessor.cs @@ -19,9 +19,9 @@ namespace JiraTimeBot.TasksProcessors _jiraApi = jiraApi; } - public void Process(DateTime date, List taskTimes, Settings settings, bool dummyMode, CancellationToken cancellationToken = default(CancellationToken)) + public void Process(DateTime setForDate, DateTime realDate, List taskTimes, Settings settings, bool dummyMode, CancellationToken cancellationToken = default(CancellationToken)) { - _log.Trace($"На реальную дату {date:dd.MM.yyyy} распределение по задачам:"); + _log.Trace($"На реальную дату {realDate:dd.MM.yyyy} распределение по задачам:"); foreach (var taskTime in taskTimes.OrderByDescending(f => f.Time)) { diff --git a/src/JiraTimeBot/TasksProcessors/WorkLogTasksProcessor.cs b/src/JiraTimeBot/TasksProcessors/WorkLogTasksProcessor.cs index f1cc39c..4e7b2ff 100644 --- a/src/JiraTimeBot/TasksProcessors/WorkLogTasksProcessor.cs +++ b/src/JiraTimeBot/TasksProcessors/WorkLogTasksProcessor.cs @@ -18,15 +18,15 @@ namespace JiraTimeBot.TasksProcessors _jiraApi = jiraApi; } - public void Process(DateTime date, List taskTimes, Settings settings, bool dummyMode, CancellationToken cancellationToken = default(CancellationToken)) + public void Process(DateTime setForDate, DateTime realDate, List taskTimes, Settings settings, bool dummyMode, CancellationToken cancellationToken = default(CancellationToken)) { - _log.Trace($"На реальную дату {date:dd.MM.yyyy} распределение по задачам:"); + _log.Trace($"На реальную дату {realDate:dd.MM.yyyy} распределение по задачам:"); foreach (var taskTime in taskTimes) { _log.Trace($"- {taskTime.Branch} (коммитов {taskTime.Commits}): {taskTime.Time}"); } - _jiraApi.SetTodayWorklog(taskTimes, settings, dummy: dummyMode, addCommentsToWorklog: settings.AddCommentsToWorklog, cancellationToken: cancellationToken); + _jiraApi.SetTodayWorklog(taskTimes, settings, date: setForDate, dummy: dummyMode, addCommentsToWorklog: settings.AddCommentsToWorklog, cancellationToken: cancellationToken); } } } diff --git a/src/JiraTimeBot/UI/frmMain.Designer.cs b/src/JiraTimeBot/UI/frmMain.Designer.cs index 57f4ec6..d0f30f8 100644 --- a/src/JiraTimeBot/UI/frmMain.Designer.cs +++ b/src/JiraTimeBot/UI/frmMain.Designer.cs @@ -39,6 +39,8 @@ this.btnCancel = new System.Windows.Forms.Button(); this.btnSettings = new System.Windows.Forms.Button(); this.tmrUpdate = new System.Windows.Forms.Timer(this.components); + this.dteForDay = new System.Windows.Forms.DateTimePicker(); + this.btnDoForDate = new System.Windows.Forms.Button(); this.SuspendLayout(); // // txtLog @@ -117,11 +119,34 @@ this.tmrUpdate.Interval = 1000; this.tmrUpdate.Tick += new System.EventHandler(this.tmrUpdate_Tick); // + // dteForDay + // + this.dteForDay.CustomFormat = "dd.MM.yyyy"; + this.dteForDay.Format = System.Windows.Forms.DateTimePickerFormat.Short; + this.dteForDay.Location = new System.Drawing.Point(12, 69); + this.dteForDay.MinDate = new System.DateTime(2019, 1, 1, 0, 0, 0, 0); + this.dteForDay.Name = "dteForDay"; + this.dteForDay.ShowUpDown = true; + this.dteForDay.Size = new System.Drawing.Size(113, 20); + this.dteForDay.TabIndex = 17; + // + // btnDoForDate + // + this.btnDoForDate.Location = new System.Drawing.Point(13, 96); + this.btnDoForDate.Name = "btnDoForDate"; + this.btnDoForDate.Size = new System.Drawing.Size(112, 36); + this.btnDoForDate.TabIndex = 18; + this.btnDoForDate.Text = "Проставить на дату"; + this.btnDoForDate.UseVisualStyleBackColor = true; + this.btnDoForDate.Click += new System.EventHandler(this.btnDoForDate_Click); + // // frmMain // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(740, 320); + this.Controls.Add(this.btnDoForDate); + this.Controls.Add(this.dteForDay); this.Controls.Add(this.btnSettings); this.Controls.Add(this.btnCancel); this.Controls.Add(this.btnMeeting); @@ -151,6 +176,8 @@ private System.Windows.Forms.Button btnCancel; private System.Windows.Forms.Button btnSettings; private System.Windows.Forms.Timer tmrUpdate; + private System.Windows.Forms.DateTimePicker dteForDay; + private System.Windows.Forms.Button btnDoForDate; } } diff --git a/src/JiraTimeBot/UI/frmMain.cs b/src/JiraTimeBot/UI/frmMain.cs index b979f23..6e29bc0 100644 --- a/src/JiraTimeBot/UI/frmMain.cs +++ b/src/JiraTimeBot/UI/frmMain.cs @@ -216,38 +216,11 @@ namespace JiraTimeBot.UI _updateChecked = true; tmrUpdate.Interval = 1 * 60 * 60 * 1000; - var checker = new UpdateChecker(); - var release = checker.GetRelease(); - if (release == null) + var updater = _container.Resolve(); + if (updater.UpdateToNewVersion(firstTime)) { - return; - } - - var gitVersionStr = checker.GetLatestVersion(release); - var gitVersion = new Version(gitVersionStr); - var appVersion = new Version(Application.ProductVersion); - - if (gitVersion > appVersion) - { - var downloadUrl = checker.GetDownloadUrl(release); - _log.Info($"Доступна новая версия: {gitVersion} {downloadUrl}"); - - var success = checker.DownloadFile(downloadUrl, "update.zip"); - if (!success) - { - return; - } - - var result = InstallUpdate(gitVersion, "update.zip"); - if (result) - { - //если обновились - отключаем до рестарта - tmrUpdate.Enabled = false; - } - } - else if (firstTime) - { - _log.Info($"Вы используете актуальную версию."); + //если обновились - отключаем до рестарта + tmrUpdate.Enabled = false; } } catch (Exception ex) @@ -257,46 +230,17 @@ namespace JiraTimeBot.UI } } - private bool InstallUpdate(Version gitVersion, string updateFile) + private async void btnDoForDate_Click(object sender, EventArgs e) { - try + var settings = ReadSettingsAndLock(); + + using (_tokenSource = GetTokenSource()) { - _log.Info($"Устанавливаю обновление до версии {gitVersion}."); - //Rename he executing file - System.IO.FileInfo appFile = new System.IO.FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location); - var bkpDir = Path.Combine(appFile.DirectoryName, "bkp"); - if (!Directory.Exists(bkpDir)) - { - Directory.CreateDirectory(bkpDir); - } - - using (ZipArchive archive = ZipFile.OpenRead(Path.Combine(appFile.DirectoryName, updateFile))) - { - foreach (ZipArchiveEntry entry in archive.Entries) - { - var zipEntryPath = Path.Combine(appFile.DirectoryName, entry.FullName); - if (File.Exists(zipEntryPath)) - { - System.IO.FileInfo zipEntryFile = new System.IO.FileInfo(zipEntryPath); - if (File.Exists(bkpDir + "\\" + zipEntryFile.Name)) - { - File.Delete(bkpDir + "\\" + zipEntryFile.Name); - } - System.IO.File.Move(zipEntryFile.FullName, bkpDir + "\\" + zipEntryFile.Name); - } - - entry.ExtractToFile(zipEntryPath); - } - } - - _log.Info("Обновление установлено. Перезапустите программу для применения изменений."); - return true; - } - catch (Exception) - { - _log.Error($"Что-то пошло не так при обновлении."); - return false; + await _job.SetTaskTimesForDate(dteForDay.Value, dteForDay.Value, settings, _tasksProcessors.WorkLogTasksProcessor, txtDummyMode.Checked, _tokenSource.Token); } + + LockUnlock(true); + } } } diff --git a/src/JiraTimeBot/Update/IUpdater.cs b/src/JiraTimeBot/Update/IUpdater.cs new file mode 100644 index 0000000..014e8fa --- /dev/null +++ b/src/JiraTimeBot/Update/IUpdater.cs @@ -0,0 +1,9 @@ +using System; + +namespace JiraTimeBot.Update +{ + internal interface IUpdater + { + bool UpdateToNewVersion(bool firstTime); + } +} diff --git a/src/JiraTimeBot/Update/UpdateChecker.cs b/src/JiraTimeBot/Update/UpdateChecker.cs deleted file mode 100644 index f4df302..0000000 --- a/src/JiraTimeBot/Update/UpdateChecker.cs +++ /dev/null @@ -1,78 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Net; -using Newtonsoft.Json; - -namespace JiraTimeBot.Update -{ - class UpdateChecker - { - private const string GithubUser = "monster1025"; - private const string GithubRepo = "JiraTimeBot"; - - public string GetLatestVersion(GitHubReleaseResponse release) - { - var version = release?.TagName?.TrimStart('v'); - return version; - } - - public string GetDownloadUrl(GitHubReleaseResponse release) - { - var downloadUrl = release?.Assets?.FirstOrDefault()?.BrowserDownloadUrl?.ToString(); - return downloadUrl ?? ""; - } - - public GitHubReleaseResponse GetRelease() - { - var latestReleasePage = Get($"https://api.github.com/repos/{GithubUser}/{GithubRepo}/releases/latest"); - if (string.IsNullOrEmpty(latestReleasePage)) - { - return null; - } - - var release = JsonConvert.DeserializeObject(latestReleasePage); - return release; - } - - public bool DownloadFile(string url, string to) - { - try - { - - using (var client = new WebClient()) - { - client.Headers.Add("User-Agent", - "Mozilla/5.0 (X11; Linux i686; rv:64.0) Gecko/20100101 Firefox/64.0"); - client.DownloadFile(url, to); - return true; - } - } - catch (Exception) - { - return false; - } - } - - private string Get(string uri) - { - try - { - HttpWebRequest request = (HttpWebRequest) WebRequest.Create(uri); - request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; - request.UserAgent = "Mozilla/5.0 (X11; Linux i686; rv:64.0) Gecko/20100101 Firefox/64.0"; - - using (HttpWebResponse response = (HttpWebResponse) request.GetResponse()) - using (Stream stream = response.GetResponseStream()) - using (StreamReader reader = new StreamReader(stream)) - { - return reader.ReadToEnd(); - } - } - catch (Exception) - { - return ""; - } - } - } -} diff --git a/src/JiraTimeBot/Update/Updater.cs b/src/JiraTimeBot/Update/Updater.cs new file mode 100644 index 0000000..c2c3516 --- /dev/null +++ b/src/JiraTimeBot/Update/Updater.cs @@ -0,0 +1,169 @@ +using System; +using System.IO; +using System.IO.Compression; +using System.Linq; +using System.Net; +using System.Windows.Forms; +using Newtonsoft.Json; + +namespace JiraTimeBot.Update +{ + public class Updater : IUpdater + { + private readonly ILog _log; + + public Updater(ILog log) + { + _log = log; + } + + private const string GithubUser = "monster1025"; + private const string GithubRepo = "JiraTimeBot"; + + public string GetLatestVersion(GitHubReleaseResponse release) + { + var version = release?.TagName?.TrimStart('v'); + return version; + } + + public string GetDownloadUrl(GitHubReleaseResponse release) + { + var downloadUrl = release?.Assets?.FirstOrDefault()?.BrowserDownloadUrl?.ToString(); + return downloadUrl ?? ""; + } + + public GitHubReleaseResponse GetRelease() + { + var latestReleasePage = Get($"https://api.github.com/repos/{GithubUser}/{GithubRepo}/releases/latest"); + if (string.IsNullOrEmpty(latestReleasePage)) + { + return null; + } + + var release = JsonConvert.DeserializeObject(latestReleasePage); + return release; + } + + public bool UpdateToNewVersion(bool firstTime) + { + var release = GetRelease(); + if (release == null) + { + return false; + } + + var gitVersionStr = GetLatestVersion(release); + var gitVersion = new Version(gitVersionStr); + var appVersion = new Version(Application.ProductVersion); + + if (gitVersion > appVersion) + { + var downloadUrl = GetDownloadUrl(release); + _log.Info($"Доступна новая версия: {gitVersion} {downloadUrl}"); + + var success = DownloadFile(downloadUrl, "update.zip"); + if (!success) + { + return false; + } + + var result = InstallUpdate(gitVersion, "update.zip"); + if (result) + { + return true; + } + + return false; + } + + if (firstTime) + { + _log.Info($"Вы используете актуальную версию."); + } + return false; + } + + public bool InstallUpdate(Version gitVersion, string updateFile) + { + try + { + _log.Info($"Устанавливаю обновление до версии {gitVersion}."); + //Rename he executing file + System.IO.FileInfo appFile = new System.IO.FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location); + var bkpDir = Path.Combine(appFile.DirectoryName, "bkp"); + if (!Directory.Exists(bkpDir)) + { + Directory.CreateDirectory(bkpDir); + } + + using (ZipArchive archive = ZipFile.OpenRead(Path.Combine(appFile.DirectoryName, updateFile))) + { + foreach (ZipArchiveEntry entry in archive.Entries) + { + var zipEntryPath = Path.Combine(appFile.DirectoryName, entry.FullName); + if (File.Exists(zipEntryPath)) + { + System.IO.FileInfo zipEntryFile = new System.IO.FileInfo(zipEntryPath); + if (File.Exists(bkpDir + "\\" + zipEntryFile.Name)) + { + File.Delete(bkpDir + "\\" + zipEntryFile.Name); + } + System.IO.File.Move(zipEntryFile.FullName, bkpDir + "\\" + zipEntryFile.Name); + } + + entry.ExtractToFile(zipEntryPath); + } + } + + _log.Info("Обновление установлено. Перезапустите программу для применения изменений."); + return true; + } + catch (Exception) + { + _log.Error($"Что-то пошло не так при обновлении."); + return false; + } + } + + + private bool DownloadFile(string url, string to) + { + try + { + + using (var client = new WebClient()) + { + client.Headers.Add("User-Agent", + "Mozilla/5.0 (X11; Linux i686; rv:64.0) Gecko/20100101 Firefox/64.0"); + client.DownloadFile(url, to); + return true; + } + } + catch (Exception) + { + return false; + } + } + + private string Get(string uri) + { + try + { + HttpWebRequest request = (HttpWebRequest) WebRequest.Create(uri); + request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; + request.UserAgent = "Mozilla/5.0 (X11; Linux i686; rv:64.0) Gecko/20100101 Firefox/64.0"; + + using (HttpWebResponse response = (HttpWebResponse) request.GetResponse()) + using (Stream stream = response.GetResponseStream()) + using (StreamReader reader = new StreamReader(stream)) + { + return reader.ReadToEnd(); + } + } + catch (Exception) + { + return ""; + } + } + } +} \ No newline at end of file From 7f522a64ffe877dc47d48ef659e16e1a5568861d Mon Sep 17 00:00:00 2001 From: Danil Kislov Date: Wed, 27 Mar 2019 11:46:59 +0300 Subject: [PATCH 4/7] =?UTF-8?q?=D0=91=D0=BB=D0=BE=D0=BA=D0=B8=D1=80=D1=83?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=B5=20=D0=BA=D0=BD?= =?UTF-8?q?=D0=BE=D0=BF=D0=BA=D0=B8=20=D0=B2=D0=BE=20=D0=B2=D1=80=D0=B5?= =?UTF-8?q?=D0=BC=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .semver.txt | 2 +- src/JiraTimeBot/Properties/AssemblyInfo.cs | 62 +++++++++++----------- src/JiraTimeBot/UI/frmMain.cs | 2 +- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/.semver.txt b/.semver.txt index f6c5328..9600efd 100644 --- a/.semver.txt +++ b/.semver.txt @@ -1 +1 @@ -1.0.37 +1.0.38 diff --git a/src/JiraTimeBot/Properties/AssemblyInfo.cs b/src/JiraTimeBot/Properties/AssemblyInfo.cs index 9adeba5..e7eb32f 100644 --- a/src/JiraTimeBot/Properties/AssemblyInfo.cs +++ b/src/JiraTimeBot/Properties/AssemblyInfo.cs @@ -1,31 +1,31 @@ -using System.Reflection; -using System.Runtime.InteropServices; -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("JiraTimeBot")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("JiraTimeBot")] -[assembly: AssemblyCopyright("Copyright © 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("f3b89316-c38c-4ce6-9d88-0b1373cfba1a")] -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("1.0.37")] -[assembly: AssemblyFileVersion("1.0.37")] -[assembly: AssemblyInformationalVersion("1.0.37")] +using System.Reflection; +using System.Runtime.InteropServices; +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("JiraTimeBot")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("JiraTimeBot")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("f3b89316-c38c-4ce6-9d88-0b1373cfba1a")] +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.38")] +[assembly: AssemblyFileVersion("1.0.38")] +[assembly: AssemblyInformationalVersion("1.0.38")] diff --git a/src/JiraTimeBot/UI/frmMain.cs b/src/JiraTimeBot/UI/frmMain.cs index 6e29bc0..c664a51 100644 --- a/src/JiraTimeBot/UI/frmMain.cs +++ b/src/JiraTimeBot/UI/frmMain.cs @@ -66,7 +66,7 @@ namespace JiraTimeBot.UI _log = _container.Resolve(); _tasksProcessors = _container.Resolve(); - _controls = new Control[] { txtDummyMode, btnStart, btnMeeting, btnSettings }; + _controls = new Control[] { txtDummyMode, btnStart, btnMeeting, btnSettings, dteForDay, btnDoForDate }; _settingsWindowShow = () => { From 86c8a2ec4b563e14043127444c6f9910533d5a01 Mon Sep 17 00:00:00 2001 From: Danil Kislov Date: Wed, 27 Mar 2019 12:11:32 +0300 Subject: [PATCH 5/7] =?UTF-8?q?=D0=91=D0=BB=D0=BE=D0=BA=D0=B8=D1=80=D1=83?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=BF=D0=BE=D0=BB=D0=B5=20=D0=BF=D1=83=D1=82?= =?UTF-8?q?=D1=8C=20=D0=B4=D0=BE=20=D1=80=D0=B5=D0=BF=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .semver.txt | 2 +- src/JiraTimeBot/Properties/AssemblyInfo.cs | 62 +++++++++++----------- src/JiraTimeBot/UI/frmSettings.cs | 4 +- 3 files changed, 35 insertions(+), 33 deletions(-) diff --git a/.semver.txt b/.semver.txt index 9600efd..672e5f5 100644 --- a/.semver.txt +++ b/.semver.txt @@ -1 +1 @@ -1.0.38 +1.0.39 diff --git a/src/JiraTimeBot/Properties/AssemblyInfo.cs b/src/JiraTimeBot/Properties/AssemblyInfo.cs index e7eb32f..1d9f62b 100644 --- a/src/JiraTimeBot/Properties/AssemblyInfo.cs +++ b/src/JiraTimeBot/Properties/AssemblyInfo.cs @@ -1,31 +1,31 @@ -using System.Reflection; -using System.Runtime.InteropServices; -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("JiraTimeBot")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("JiraTimeBot")] -[assembly: AssemblyCopyright("Copyright © 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("f3b89316-c38c-4ce6-9d88-0b1373cfba1a")] -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("1.0.38")] -[assembly: AssemblyFileVersion("1.0.38")] -[assembly: AssemblyInformationalVersion("1.0.38")] +using System.Reflection; +using System.Runtime.InteropServices; +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("JiraTimeBot")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("JiraTimeBot")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("f3b89316-c38c-4ce6-9d88-0b1373cfba1a")] +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.39")] +[assembly: AssemblyFileVersion("1.0.39")] +[assembly: AssemblyInformationalVersion("1.0.39")] diff --git a/src/JiraTimeBot/UI/frmSettings.cs b/src/JiraTimeBot/UI/frmSettings.cs index aa50f22..ba8e90f 100644 --- a/src/JiraTimeBot/UI/frmSettings.cs +++ b/src/JiraTimeBot/UI/frmSettings.cs @@ -38,7 +38,8 @@ namespace JiraTimeBot.UI cboWorkType.SelectedIndex = (int) settings.WorkType; txtTimeControlTask.Text = settings.TimeControlTask; txtJQL.Text = settings.JiraQuery; - txtJQL.Enabled = settings.WorkType == WorkType.JiraLogs; + + cboWorkType_SelectedIndexChanged(null, null); } public Settings ReadSettingsAndLock() @@ -87,6 +88,7 @@ namespace JiraTimeBot.UI private void cboWorkType_SelectedIndexChanged(object sender, EventArgs e) { txtJQL.Enabled = (cboWorkType.SelectedIndex == 1); + txtRepoPath.Enabled = (cboWorkType.SelectedIndex == 0); } } } From 94c14324bf66fc00396be84602f46ea63c623c57 Mon Sep 17 00:00:00 2001 From: Danil Kislov Date: Wed, 27 Mar 2019 14:27:57 +0300 Subject: [PATCH 6/7] =?UTF-8?q?=D0=A0=D0=B5=D1=81=D0=B0=D0=B9=D0=B7=20?= =?UTF-8?q?=D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=BD=D0=BE=D0=B9=20=D1=84=D0=BE?= =?UTF-8?q?=D1=80=D0=BC=D1=8B=20(=D0=A1)=20=D0=A1=D0=B5=D1=80=D1=91=D0=B3?= =?UTF-8?q?=D0=B0=20=D0=9A=D1=83=D1=80=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .semver.txt | 2 +- src/JiraTimeBot/Properties/AssemblyInfo.cs | 62 +++--- src/JiraTimeBot/UI/frmMain.Designer.cs | 237 ++++++++++++--------- 3 files changed, 173 insertions(+), 128 deletions(-) diff --git a/.semver.txt b/.semver.txt index 672e5f5..42de374 100644 --- a/.semver.txt +++ b/.semver.txt @@ -1 +1 @@ -1.0.39 +1.0.40 diff --git a/src/JiraTimeBot/Properties/AssemblyInfo.cs b/src/JiraTimeBot/Properties/AssemblyInfo.cs index 1d9f62b..9e6dc8d 100644 --- a/src/JiraTimeBot/Properties/AssemblyInfo.cs +++ b/src/JiraTimeBot/Properties/AssemblyInfo.cs @@ -1,31 +1,31 @@ -using System.Reflection; -using System.Runtime.InteropServices; -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("JiraTimeBot")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("JiraTimeBot")] -[assembly: AssemblyCopyright("Copyright © 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("f3b89316-c38c-4ce6-9d88-0b1373cfba1a")] -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("1.0.39")] -[assembly: AssemblyFileVersion("1.0.39")] -[assembly: AssemblyInformationalVersion("1.0.39")] +using System.Reflection; +using System.Runtime.InteropServices; +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("JiraTimeBot")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("JiraTimeBot")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("f3b89316-c38c-4ce6-9d88-0b1373cfba1a")] +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.40")] +[assembly: AssemblyFileVersion("1.0.40")] +[assembly: AssemblyInformationalVersion("1.0.40")] diff --git a/src/JiraTimeBot/UI/frmMain.Designer.cs b/src/JiraTimeBot/UI/frmMain.Designer.cs index d0f30f8..66a0910 100644 --- a/src/JiraTimeBot/UI/frmMain.Designer.cs +++ b/src/JiraTimeBot/UI/frmMain.Designer.cs @@ -30,39 +30,25 @@ { this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmMain)); - this.txtLog = new System.Windows.Forms.TextBox(); - this.btnStart = new System.Windows.Forms.Button(); this.ntfyIcon = new System.Windows.Forms.NotifyIcon(this.components); this.tmrStart = new System.Windows.Forms.Timer(this.components); - this.txtDummyMode = new System.Windows.Forms.CheckBox(); - this.btnMeeting = new System.Windows.Forms.Button(); - this.btnCancel = new System.Windows.Forms.Button(); - this.btnSettings = new System.Windows.Forms.Button(); this.tmrUpdate = new System.Windows.Forms.Timer(this.components); - this.dteForDay = new System.Windows.Forms.DateTimePicker(); + this.tlpControls = new System.Windows.Forms.TableLayoutPanel(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnCancel = new System.Windows.Forms.Button(); + this.btnMeeting = new System.Windows.Forms.Button(); + this.txtDummyMode = new System.Windows.Forms.CheckBox(); + this.btnStart = new System.Windows.Forms.Button(); + this.pnlTopControls = new System.Windows.Forms.Panel(); this.btnDoForDate = new System.Windows.Forms.Button(); + this.dteForDay = new System.Windows.Forms.DateTimePicker(); + this.btnSettings = new System.Windows.Forms.Button(); + this.txtLog = new System.Windows.Forms.TextBox(); + this.tlpControls.SuspendLayout(); + this.panel2.SuspendLayout(); + this.pnlTopControls.SuspendLayout(); this.SuspendLayout(); // - // txtLog - // - this.txtLog.Location = new System.Drawing.Point(132, 16); - this.txtLog.Multiline = true; - this.txtLog.Name = "txtLog"; - this.txtLog.ReadOnly = true; - this.txtLog.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.txtLog.Size = new System.Drawing.Size(596, 294); - this.txtLog.TabIndex = 11; - // - // btnStart - // - this.btnStart.Location = new System.Drawing.Point(12, 229); - this.btnStart.Name = "btnStart"; - this.btnStart.Size = new System.Drawing.Size(114, 23); - this.btnStart.TabIndex = 12; - this.btnStart.Text = "Проставить время"; - this.btnStart.UseVisualStyleBackColor = true; - this.btnStart.Click += new System.EventHandler(this.btnStart_Click); - // // ntfyIcon // this.ntfyIcon.Text = "notifyIcon1"; @@ -73,111 +59,170 @@ this.tmrStart.Interval = 1500; this.tmrStart.Tick += new System.EventHandler(this.tmrStart_Tick); // - // txtDummyMode - // - this.txtDummyMode.AutoSize = true; - this.txtDummyMode.Location = new System.Drawing.Point(12, 206); - this.txtDummyMode.Name = "txtDummyMode"; - this.txtDummyMode.Size = new System.Drawing.Size(114, 17); - this.txtDummyMode.TabIndex = 13; - this.txtDummyMode.Text = "Тестовый прогон"; - this.txtDummyMode.UseVisualStyleBackColor = true; - // - // btnMeeting - // - this.btnMeeting.Location = new System.Drawing.Point(12, 258); - this.btnMeeting.Name = "btnMeeting"; - this.btnMeeting.Size = new System.Drawing.Size(114, 23); - this.btnMeeting.TabIndex = 14; - this.btnMeeting.Text = "Митинг"; - this.btnMeeting.UseVisualStyleBackColor = true; - this.btnMeeting.Click += new System.EventHandler(this.btnMeeting_Click); - // - // btnCancel - // - this.btnCancel.Enabled = false; - this.btnCancel.Location = new System.Drawing.Point(12, 287); - this.btnCancel.Name = "btnCancel"; - this.btnCancel.Size = new System.Drawing.Size(114, 23); - this.btnCancel.TabIndex = 15; - this.btnCancel.Text = "Отменить операцию"; - this.btnCancel.UseVisualStyleBackColor = true; - this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); - // - // btnSettings - // - this.btnSettings.Location = new System.Drawing.Point(12, 16); - this.btnSettings.Name = "btnSettings"; - this.btnSettings.Size = new System.Drawing.Size(114, 23); - this.btnSettings.TabIndex = 16; - this.btnSettings.Text = "Настройки"; - this.btnSettings.UseVisualStyleBackColor = true; - this.btnSettings.Click += new System.EventHandler(this.btnSettings_Click); - // // tmrUpdate // this.tmrUpdate.Interval = 1000; this.tmrUpdate.Tick += new System.EventHandler(this.tmrUpdate_Tick); // + // tlpControls + // + this.tlpControls.ColumnCount = 2; + this.tlpControls.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 150F)); + this.tlpControls.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tlpControls.Controls.Add(this.txtLog, 2, 0); + this.tlpControls.Controls.Add(this.panel2, 0, 1); + this.tlpControls.Controls.Add(this.pnlTopControls, 0, 0); + this.tlpControls.Dock = System.Windows.Forms.DockStyle.Fill; + this.tlpControls.Location = new System.Drawing.Point(0, 0); + this.tlpControls.Name = "tlpControls"; + this.tlpControls.RowCount = 2; + this.tlpControls.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tlpControls.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 200F)); + this.tlpControls.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tlpControls.Size = new System.Drawing.Size(759, 416); + this.tlpControls.TabIndex = 19; + // + // panel2 + // + this.panel2.Controls.Add(this.btnCancel); + this.panel2.Controls.Add(this.btnMeeting); + this.panel2.Controls.Add(this.txtDummyMode); + this.panel2.Controls.Add(this.btnStart); + this.panel2.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panel2.Location = new System.Drawing.Point(3, 288); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(144, 125); + this.panel2.TabIndex = 25; + // + // btnCancel + // + this.btnCancel.Enabled = false; + this.btnCancel.Location = new System.Drawing.Point(15, 91); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(114, 23); + this.btnCancel.TabIndex = 19; + this.btnCancel.Text = "Отменить операцию"; + this.btnCancel.UseVisualStyleBackColor = true; + // + // btnMeeting + // + this.btnMeeting.Location = new System.Drawing.Point(15, 62); + this.btnMeeting.Name = "btnMeeting"; + this.btnMeeting.Size = new System.Drawing.Size(114, 23); + this.btnMeeting.TabIndex = 18; + this.btnMeeting.Text = "Митинг"; + this.btnMeeting.UseVisualStyleBackColor = true; + // + // txtDummyMode + // + this.txtDummyMode.AutoSize = true; + this.txtDummyMode.Location = new System.Drawing.Point(15, 10); + this.txtDummyMode.Name = "txtDummyMode"; + this.txtDummyMode.Size = new System.Drawing.Size(114, 17); + this.txtDummyMode.TabIndex = 17; + this.txtDummyMode.Text = "Тестовый прогон"; + this.txtDummyMode.UseVisualStyleBackColor = true; + // + // btnStart + // + this.btnStart.Location = new System.Drawing.Point(15, 33); + this.btnStart.Name = "btnStart"; + this.btnStart.Size = new System.Drawing.Size(114, 23); + this.btnStart.TabIndex = 16; + this.btnStart.Text = "Проставить время"; + this.btnStart.UseVisualStyleBackColor = true; + // + // pnlTopControls + // + this.pnlTopControls.Controls.Add(this.btnDoForDate); + this.pnlTopControls.Controls.Add(this.dteForDay); + this.pnlTopControls.Controls.Add(this.btnSettings); + this.pnlTopControls.Dock = System.Windows.Forms.DockStyle.Top; + this.pnlTopControls.Location = new System.Drawing.Point(3, 3); + this.pnlTopControls.Name = "pnlTopControls"; + this.pnlTopControls.Size = new System.Drawing.Size(144, 125); + this.pnlTopControls.TabIndex = 24; + // + // btnDoForDate + // + this.btnDoForDate.Location = new System.Drawing.Point(15, 84); + this.btnDoForDate.Name = "btnDoForDate"; + this.btnDoForDate.Size = new System.Drawing.Size(114, 36); + this.btnDoForDate.TabIndex = 25; + this.btnDoForDate.Text = "Проставить на дату"; + this.btnDoForDate.UseVisualStyleBackColor = true; + // // dteForDay // this.dteForDay.CustomFormat = "dd.MM.yyyy"; this.dteForDay.Format = System.Windows.Forms.DateTimePickerFormat.Short; - this.dteForDay.Location = new System.Drawing.Point(12, 69); + this.dteForDay.Location = new System.Drawing.Point(15, 57); this.dteForDay.MinDate = new System.DateTime(2019, 1, 1, 0, 0, 0, 0); this.dteForDay.Name = "dteForDay"; this.dteForDay.ShowUpDown = true; - this.dteForDay.Size = new System.Drawing.Size(113, 20); - this.dteForDay.TabIndex = 17; + this.dteForDay.Size = new System.Drawing.Size(114, 20); + this.dteForDay.TabIndex = 24; // - // btnDoForDate + // btnSettings // - this.btnDoForDate.Location = new System.Drawing.Point(13, 96); - this.btnDoForDate.Name = "btnDoForDate"; - this.btnDoForDate.Size = new System.Drawing.Size(112, 36); - this.btnDoForDate.TabIndex = 18; - this.btnDoForDate.Text = "Проставить на дату"; - this.btnDoForDate.UseVisualStyleBackColor = true; - this.btnDoForDate.Click += new System.EventHandler(this.btnDoForDate_Click); + this.btnSettings.Location = new System.Drawing.Point(15, 4); + this.btnSettings.Name = "btnSettings"; + this.btnSettings.Size = new System.Drawing.Size(114, 23); + this.btnSettings.TabIndex = 23; + this.btnSettings.Text = "Настройки"; + this.btnSettings.UseVisualStyleBackColor = true; + // + // txtLog + // + this.txtLog.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtLog.Location = new System.Drawing.Point(153, 3); + this.txtLog.Multiline = true; + this.txtLog.Name = "txtLog"; + this.txtLog.ReadOnly = true; + this.tlpControls.SetRowSpan(this.txtLog, 2); + this.txtLog.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtLog.Size = new System.Drawing.Size(603, 410); + this.txtLog.TabIndex = 27; // // frmMain // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(740, 320); - this.Controls.Add(this.btnDoForDate); - this.Controls.Add(this.dteForDay); - this.Controls.Add(this.btnSettings); - this.Controls.Add(this.btnCancel); - this.Controls.Add(this.btnMeeting); - this.Controls.Add(this.txtDummyMode); - this.Controls.Add(this.btnStart); - this.Controls.Add(this.txtLog); + this.ClientSize = new System.Drawing.Size(759, 416); + this.Controls.Add(this.tlpControls); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Margin = new System.Windows.Forms.Padding(2); + this.MinimumSize = new System.Drawing.Size(775, 455); this.Name = "frmMain"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "Бот логирования времени"; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.frmMain_FormClosing); this.Load += new System.EventHandler(this.Form1_Load); this.Resize += new System.EventHandler(this.frmMain_Resize); + this.tlpControls.ResumeLayout(false); + this.tlpControls.PerformLayout(); + this.panel2.ResumeLayout(false); + this.panel2.PerformLayout(); + this.pnlTopControls.ResumeLayout(false); this.ResumeLayout(false); - this.PerformLayout(); } #endregion - private System.Windows.Forms.TextBox txtLog; - private System.Windows.Forms.Button btnStart; private System.Windows.Forms.NotifyIcon ntfyIcon; private System.Windows.Forms.Timer tmrStart; - private System.Windows.Forms.CheckBox txtDummyMode; - private System.Windows.Forms.Button btnMeeting; - private System.Windows.Forms.Button btnCancel; - private System.Windows.Forms.Button btnSettings; private System.Windows.Forms.Timer tmrUpdate; - private System.Windows.Forms.DateTimePicker dteForDay; + private System.Windows.Forms.TableLayoutPanel tlpControls; + private System.Windows.Forms.Panel pnlTopControls; private System.Windows.Forms.Button btnDoForDate; + private System.Windows.Forms.DateTimePicker dteForDay; + private System.Windows.Forms.Button btnSettings; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Button btnCancel; + private System.Windows.Forms.Button btnMeeting; + private System.Windows.Forms.CheckBox txtDummyMode; + private System.Windows.Forms.Button btnStart; + private System.Windows.Forms.TextBox txtLog; } } From e0c610399e505fccd13136538a9752e875681faa Mon Sep 17 00:00:00 2001 From: Danil Kislov Date: Wed, 27 Mar 2019 16:24:45 +0300 Subject: [PATCH 7/7] =?UTF-8?q?=D0=92=D0=B5=D1=80=D0=BD=D1=83=D0=BB=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=87=D0=B8=D0=BA?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .semver.txt | 2 +- src/JiraTimeBot/Properties/AssemblyInfo.cs | 62 +++++++++++----------- src/JiraTimeBot/UI/frmMain.Designer.cs | 31 ++++++----- 3 files changed, 50 insertions(+), 45 deletions(-) diff --git a/.semver.txt b/.semver.txt index 42de374..7cb055c 100644 --- a/.semver.txt +++ b/.semver.txt @@ -1 +1 @@ -1.0.40 +1.0.41 diff --git a/src/JiraTimeBot/Properties/AssemblyInfo.cs b/src/JiraTimeBot/Properties/AssemblyInfo.cs index 9e6dc8d..b5ce5eb 100644 --- a/src/JiraTimeBot/Properties/AssemblyInfo.cs +++ b/src/JiraTimeBot/Properties/AssemblyInfo.cs @@ -1,31 +1,31 @@ -using System.Reflection; -using System.Runtime.InteropServices; -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("JiraTimeBot")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("JiraTimeBot")] -[assembly: AssemblyCopyright("Copyright © 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("f3b89316-c38c-4ce6-9d88-0b1373cfba1a")] -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("1.0.40")] -[assembly: AssemblyFileVersion("1.0.40")] -[assembly: AssemblyInformationalVersion("1.0.40")] +using System.Reflection; +using System.Runtime.InteropServices; +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("JiraTimeBot")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("JiraTimeBot")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("f3b89316-c38c-4ce6-9d88-0b1373cfba1a")] +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.41")] +[assembly: AssemblyFileVersion("1.0.41")] +[assembly: AssemblyInformationalVersion("1.0.41")] diff --git a/src/JiraTimeBot/UI/frmMain.Designer.cs b/src/JiraTimeBot/UI/frmMain.Designer.cs index 66a0910..fa76cd0 100644 --- a/src/JiraTimeBot/UI/frmMain.Designer.cs +++ b/src/JiraTimeBot/UI/frmMain.Designer.cs @@ -34,6 +34,7 @@ this.tmrStart = new System.Windows.Forms.Timer(this.components); this.tmrUpdate = new System.Windows.Forms.Timer(this.components); this.tlpControls = new System.Windows.Forms.TableLayoutPanel(); + this.txtLog = new System.Windows.Forms.TextBox(); this.panel2 = new System.Windows.Forms.Panel(); this.btnCancel = new System.Windows.Forms.Button(); this.btnMeeting = new System.Windows.Forms.Button(); @@ -43,7 +44,6 @@ this.btnDoForDate = new System.Windows.Forms.Button(); this.dteForDay = new System.Windows.Forms.DateTimePicker(); this.btnSettings = new System.Windows.Forms.Button(); - this.txtLog = new System.Windows.Forms.TextBox(); this.tlpControls.SuspendLayout(); this.panel2.SuspendLayout(); this.pnlTopControls.SuspendLayout(); @@ -82,6 +82,18 @@ this.tlpControls.Size = new System.Drawing.Size(759, 416); this.tlpControls.TabIndex = 19; // + // txtLog + // + this.txtLog.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtLog.Location = new System.Drawing.Point(153, 3); + this.txtLog.Multiline = true; + this.txtLog.Name = "txtLog"; + this.txtLog.ReadOnly = true; + this.tlpControls.SetRowSpan(this.txtLog, 2); + this.txtLog.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtLog.Size = new System.Drawing.Size(603, 410); + this.txtLog.TabIndex = 27; + // // panel2 // this.panel2.Controls.Add(this.btnCancel); @@ -103,6 +115,7 @@ this.btnCancel.TabIndex = 19; this.btnCancel.Text = "Отменить операцию"; this.btnCancel.UseVisualStyleBackColor = true; + this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); // // btnMeeting // @@ -112,6 +125,7 @@ this.btnMeeting.TabIndex = 18; this.btnMeeting.Text = "Митинг"; this.btnMeeting.UseVisualStyleBackColor = true; + this.btnMeeting.Click += new System.EventHandler(this.btnMeeting_Click); // // txtDummyMode // @@ -131,6 +145,7 @@ this.btnStart.TabIndex = 16; this.btnStart.Text = "Проставить время"; this.btnStart.UseVisualStyleBackColor = true; + this.btnStart.Click += new System.EventHandler(this.btnStart_Click); // // pnlTopControls // @@ -151,6 +166,7 @@ this.btnDoForDate.TabIndex = 25; this.btnDoForDate.Text = "Проставить на дату"; this.btnDoForDate.UseVisualStyleBackColor = true; + this.btnDoForDate.Click += new System.EventHandler(this.btnDoForDate_Click); // // dteForDay // @@ -171,18 +187,7 @@ this.btnSettings.TabIndex = 23; this.btnSettings.Text = "Настройки"; this.btnSettings.UseVisualStyleBackColor = true; - // - // txtLog - // - this.txtLog.Dock = System.Windows.Forms.DockStyle.Fill; - this.txtLog.Location = new System.Drawing.Point(153, 3); - this.txtLog.Multiline = true; - this.txtLog.Name = "txtLog"; - this.txtLog.ReadOnly = true; - this.tlpControls.SetRowSpan(this.txtLog, 2); - this.txtLog.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.txtLog.Size = new System.Drawing.Size(603, 410); - this.txtLog.TabIndex = 27; + this.btnSettings.Click += new System.EventHandler(this.btnSettings_Click); // // frmMain //