From b57ef0868d71be5582eddcdf3e7ae71ad0ba1881 Mon Sep 17 00:00:00 2001 From: FNoble23 <142232001+FNoble23@users.noreply.github.com> Date: Mon, 13 May 2024 12:07:30 +0200 Subject: [PATCH] Merge Paspiz85-branch --- Taskodrome/Taskodrome.php | 1 + Taskodrome/files/scripts/block/block.js | 2 +- Taskodrome/files/scripts/column_handler.js | 12 +++++++++- Taskodrome/files/scripts/data_source.js | 19 +++++++++++++-- Taskodrome/files/scripts/dev_page.js | 27 ++++++++++++++++------ Taskodrome/files/scripts/issue_updater.js | 24 +++++++++++++------ Taskodrome/files/scripts/starter.js | 7 ++---- Taskodrome/files/scripts/status_page.js | 25 ++++++++++++++------ Taskodrome/lang/strings_english.txt | 2 ++ Taskodrome/pages/config.php | 6 +++++ Taskodrome/pages/config_page.php | 25 ++++++++++++++++++++ Taskodrome/pages/main.php | 3 ++- 12 files changed, 122 insertions(+), 31 deletions(-) diff --git a/Taskodrome/Taskodrome.php b/Taskodrome/Taskodrome.php index 6217b8d..e531a27 100644 --- a/Taskodrome/Taskodrome.php +++ b/Taskodrome/Taskodrome.php @@ -48,6 +48,7 @@ public function config() } return array( + "status_board_first" => false, "status_board_order_default" => $status_list, "status_board_order" => $status_list, "cooldown_period_days" => 14, diff --git a/Taskodrome/files/scripts/block/block.js b/Taskodrome/files/scripts/block/block.js index 191535e..1506d9a 100644 --- a/Taskodrome/files/scripts/block/block.js +++ b/Taskodrome/files/scripts/block/block.js @@ -58,9 +58,9 @@ function Block(name, /** @type {ColumnHandler} */columnHandler, /** @type {Page} }; this.setTop = function(top) { + var width = columnHandler.getColumnWidth(); if (this.toBeDrawn()) { m_blockGr.setPos(new Position(0, top + V_OFFSET)); - var width = columnHandler.getColumnWidth(); this.m_bounds = { top : top, bottom : m_blockGr.m_bounds.bottom, left : this.m_bounds.left, right : this.m_bounds.left + width * columnHandler.getColumnNumber() }; for (var i = 0; i != columnHandler.getColumnNumber(); ++i) { var pos = new Position(this.m_bounds.left + width * i, m_blockGr.m_bounds.bottom); diff --git a/Taskodrome/files/scripts/column_handler.js b/Taskodrome/files/scripts/column_handler.js index e9e9e31..b7ca81a 100644 --- a/Taskodrome/files/scripts/column_handler.js +++ b/Taskodrome/files/scripts/column_handler.js @@ -20,7 +20,17 @@ function ColumnHandler(/** @type {Array.} */headers, canvasWidth) { this.getColumnWidth = function() { if (m_columnWidth == 0) { - var MIN_WIDTH = Math.floor(canvasWidth / 7); + var MIN_COL; + if (canvasWidth < 1320) { + MIN_COL = 5; + } else if (canvasWidth < 1540) { + MIN_COL = 6; + } else if (canvasWidth < 1760) { + MIN_COL = 7; + } else { + MIN_COL = 8; + } + var MIN_WIDTH = Math.floor(canvasWidth / MIN_COL); if (this.getColumnNumber() != 0) { m_columnWidth = Math.max(Math.floor(canvasWidth / this.getColumnNumber()), MIN_WIDTH); } else { diff --git a/Taskodrome/files/scripts/data_source.js b/Taskodrome/files/scripts/data_source.js index 248533c..36c7dd6 100644 --- a/Taskodrome/files/scripts/data_source.js +++ b/Taskodrome/files/scripts/data_source.js @@ -2,6 +2,7 @@ var DataSource = (function() { var m_inst = null; var m_issues_raw = null; + var m_status_board_first = false; var m_cooldown_period = 0; var m_allowed_statuses_map = null; var m_statuses = null; @@ -49,6 +50,15 @@ var DataSource = (function() { return m_issues_raw; }; + function getStatusBoardFirst() { + var statusBoardFirst = document.getElementById("status_board_first").getAttribute("value") == "1"; + return statusBoardFirst; + }; + + var StatusBoardFirst = function() { + return m_status_board_first; + }; + function getCooldownPeriod() { var cooldownPeriodDays = parseInt(document.getElementById("cooldown_period_days").getAttribute("value"), 10); var cooldownPeriodHours = parseInt(document.getElementById("cooldown_period_hours").getAttribute("value"), 10); @@ -175,10 +185,13 @@ var DataSource = (function() { }; function getVersions() { - var ret = [""]; + var ret = [{version:""}]; var versions = document.getElementsByClassName("version"); for (var i = 0; i != versions.length; ++i) { - ret.push(versions[i].getAttribute("value")); + ret.push({ + version: versions[i].getAttribute("value"), + timestamp: versions[i].getAttribute("timestamp") + }); } return ret; }; @@ -299,6 +312,7 @@ var DataSource = (function() { var CreateInst = function() { m_issues_raw = getIssuesRaw(); + m_status_board_first = getStatusBoardFirst(); m_cooldown_period = getCooldownPeriod(); m_allowed_statuses_map = getStatusesAllowanceMap(); m_status_color_map = getStatusColors(); @@ -314,6 +328,7 @@ var DataSource = (function() { m_dependencies = getDependencies(); return { IssuesRaw: IssuesRaw, + StatusBoardFirst: StatusBoardFirst, CooldownPeriod: CooldownPeriod, IsTransferAllowed: IsTransferAllowed, GetColorOfStatus: GetColorOfStatus, diff --git a/Taskodrome/files/scripts/dev_page.js b/Taskodrome/files/scripts/dev_page.js index 8598df1..012723d 100644 --- a/Taskodrome/files/scripts/dev_page.js +++ b/Taskodrome/files/scripts/dev_page.js @@ -25,11 +25,11 @@ var DevPage = (function() { return m_columnHandler.getColumnIndex(card.getOwner()); }; - var versions = DataSource.Inst().Versions(); - function versionSorter(a, b) { - if(a > b) return 1; else return -1; - }; - versions.sort(versionSorter); + var versions = DataSource.Inst().Versions().sort(function (a, b) { + if(a.timestamp > b.timestamp) return 1; else return -1; + }).map(function (e) { + return e.version; + }); m_cardTransferNotifier = new CardTransferNotifier(); m_cardTransferHandler = new CardTransferHandler(m_cardTransferNotifier); @@ -57,7 +57,9 @@ var DevPage = (function() { m_cardTransferHandler, columnHandler, page)); } }; - DataSource.Inst().IssuesRaw().forEach(addIssue); + DataSource.Inst().IssuesRaw().sort(function (a, b) { + if(a.priorityCode < b.priorityCode) return 1; else return -1; + }).forEach(addIssue); }; versions.forEach(addVersion); }; @@ -85,6 +87,7 @@ var DevPage = (function() { card.setStatus(50); } + var oldOwner = card.getOwner(); if (src.m_column != dst.m_column) { card.setOwner(m_columnHandler.getColumnName(dst.m_column)); } @@ -94,7 +97,17 @@ var DevPage = (function() { var data = new IssueData(); data.Init(card.getId(), DataSource.Inst().UserId(card.getOwner()), card.getVersion()); - m_updater.send(data); + m_updater.send(data, function() { + var newVersion = card.getVersion(); + card.setVersion(oldVersion); + var newStatus = card.getStatus(); + card.setStatus(oldStatus); + var newOwner = card.getOwner(); + card.setOwner(oldOwner); + DevPage.Inst().UpdateCard(newVersion, newOwner, card); + StatusPage.Inst().UpdateCard(newVersion, newStatus, card); + RelPage.Inst().UpdateCard(card); + }); }; }; diff --git a/Taskodrome/files/scripts/issue_updater.js b/Taskodrome/files/scripts/issue_updater.js index a170c36..c7056af 100644 --- a/Taskodrome/files/scripts/issue_updater.js +++ b/Taskodrome/files/scripts/issue_updater.js @@ -19,11 +19,11 @@ function IssueData() { function IssueUpdater() { var HTTP_REQUEST_TIMEOUT = 4000; - this.send = function(/** @type {IssueData} */issue_data) { - requestViewPage(issue_data); + this.send = function(/** @type {IssueData} */issue_data, rollback_fn) { + requestViewPage(issue_data, rollback_fn); }; - function requestViewPage(/** @type {IssueData} */issue_data) { + function requestViewPage(/** @type {IssueData} */issue_data, rollback_fn) { var request = new XMLHttpRequest(); var address = getPathToMantisFile(window, "view.php"); address = address + "?id=" + issue_data.m_issue_id; @@ -33,7 +33,7 @@ function IssueUpdater() { function onReadyStateChange() { if (request.readyState == 4 && request.status == 200) { console.log("requestViewPage OK"); - requesBugUpdatePage(request, issue_data); + requesBugUpdatePage(request, issue_data, rollback_fn); } else if (request.readyState == 0 || request.status == 404) { request.onreadystatechange = null; request.abort(); @@ -50,7 +50,7 @@ function IssueUpdater() { request.send(null); }; - function requesBugUpdatePage(requestPrev, /** @type {IssueData} */issue_data) { + function requesBugUpdatePage(requestPrev, /** @type {IssueData} */issue_data, rollback_fn) { var page_text = requestPrev.responseText; var security_token = getValueByName(page_text, "bug_update_page_token"); @@ -63,7 +63,7 @@ function IssueUpdater() { function onReadyStateChange() { if (request.readyState == 4 && request.status == 200) { console.log("requesBugUpdatePage OK"); - requestBugUpdate(request, issue_data); + requestBugUpdate(request, issue_data, rollback_fn); } else if (request.readyState == 0 || request.status == 404) { request.onreadystatechange = null; request.abort(); @@ -82,7 +82,7 @@ function IssueUpdater() { request.send(parameters); }; - function requestBugUpdate(requestPrev, /** @type {IssueData} */issue_data) { + function requestBugUpdate(requestPrev, /** @type {IssueData} */issue_data, rollback_fn) { var page_text = requestPrev.responseText; var security_token = getValueByName(page_text, "bug_update_token"); var last_updated = getValueByName(page_text, "last_updated"); @@ -95,6 +95,12 @@ function IssueUpdater() { function onReadyStateChange() { if (request.readyState == 4 && request.status == 200) { + if (request.responseURL == address) { + console.log("requestBugUpdate failed"); + if (rollback_fn) { + rollback_fn(); + } + } console.log("requestBugUpdate OK"); } else if (request.readyState == 0 || request.status == 404) { request.onreadystatechange = null; @@ -116,6 +122,10 @@ function IssueUpdater() { + "&last_updated=" + last_updated; if (issue_data.m_status) { parameters += "&status=" + issue_data.m_status; + if (issue_data.m_status == 80) { + parameters += "&resolution=" + 20; + parameters += "&fixed_in_version=" + issue_data.m_version; + } } request.send(parameters); }; diff --git a/Taskodrome/files/scripts/starter.js b/Taskodrome/files/scripts/starter.js index 4ee7e4a..5d2ded0 100644 --- a/Taskodrome/files/scripts/starter.js +++ b/Taskodrome/files/scripts/starter.js @@ -1,10 +1,7 @@ function pageOnLoad() { - openPage(); - DataSource.Inst(); - + openPage(); initVersionVisibility(); - DevPage.Inst(); StatusPage.Inst(); RelPage.Inst(); @@ -18,7 +15,7 @@ function openPage() { var prevGrid = window.location.href.substr(markIndex + 1, 2); openBoard(prevGrid); } else { - openBoard("dg"); + openBoard(DataSource.Inst().StatusBoardFirst()?"sg":"dg"); } }; diff --git a/Taskodrome/files/scripts/status_page.js b/Taskodrome/files/scripts/status_page.js index 5ac397b..475e7f8 100644 --- a/Taskodrome/files/scripts/status_page.js +++ b/Taskodrome/files/scripts/status_page.js @@ -19,11 +19,11 @@ var StatusPage = (function() { return m_columnHandler.getColumnIndex(DataSource.Inst().StatusName(card.getStatus())); }; - var versions = DataSource.Inst().Versions(); - function versionSorter(a, b) { - if(a > b) return 1; else return -1; - }; - versions.sort(versionSorter); + var versions = DataSource.Inst().Versions().sort(function (a, b) { + if(a.timestamp > b.timestamp) return 1; else return -1; + }).map(function (e) { + return e.version; + }); m_cardTransferNotifier = new CardTransferNotifier(); m_cardTransferHandler = new CardTransferHandler(m_cardTransferNotifier); @@ -53,7 +53,9 @@ var StatusPage = (function() { grid.addCard(card); } }; - DataSource.Inst().IssuesRaw().forEach(addIssue); + DataSource.Inst().IssuesRaw().sort(function (a, b) { + if(a.priorityCode < b.priorityCode) return 1; else return -1; + }).forEach(addIssue); }; versions.forEach(addVersion); }; @@ -98,6 +100,7 @@ var StatusPage = (function() { card.setVersion(m_versions[dst.m_block]); } + var oldStatus = card.getStatus(); if (src.m_column != dst.m_column) { card.setStatus(DataSource.Inst().StatusId(m_columnHandler.getColumnName(dst.m_column))); } @@ -107,7 +110,15 @@ var StatusPage = (function() { var data = new IssueData(); data.InitWStatus(card.getId(), DataSource.Inst().UserId(card.getOwner()), card.getVersion(), card.getStatus()); - m_updater.send(data); + m_updater.send(data, function() { + var newVersion = card.getVersion(); + card.setVersion(oldVersion); + var newStatus = card.getStatus(); + card.setStatus(oldStatus); + DevPage.Inst().UpdateCard(newVersion, card.getOwner(), card); + StatusPage.Inst().UpdateCard(newVersion, newStatus, card); + RelPage.Inst().UpdateCard(card); + }); }; }; diff --git a/Taskodrome/lang/strings_english.txt b/Taskodrome/lang/strings_english.txt index 3630ca6..bd86ecb 100644 --- a/Taskodrome/lang/strings_english.txt +++ b/Taskodrome/lang/strings_english.txt @@ -18,6 +18,8 @@ $s_plugin_Taskodrome_config_title = 'Taskodrome Plugin Configuration'; $s_plugin_Taskodrome_default_value = 'Default value:
%s
'; +$s_plugin_Taskodrome_status_board_first_label = 'Status board view preferred'; + $s_plugin_Taskodrome_status_board_order_label = 'Status board order'; $s_plugin_Taskodrome_cooldown_period_label = 'Cooldown period'; diff --git a/Taskodrome/pages/config.php b/Taskodrome/pages/config.php index 0cf9347..db8a60a 100644 --- a/Taskodrome/pages/config.php +++ b/Taskodrome/pages/config.php @@ -6,6 +6,12 @@ access_ensure_global_level( config_get( 'manage_plugin_threshold' ) ); require_once( config_get( 'plugin_path' ) . 'Taskodrome/core/config_helper.php' ); +$f_status_first = gpc_get_bool( 'status_board_first' ); + +if( plugin_config_get( 'status_board_first', null, false, null, helper_get_current_project() ) != $f_status_first ) { + plugin_config_set( 'status_board_first', $f_status_first, NO_USER, helper_get_current_project() ); +} + $f_status_order = gpc_get_string( 'status_board_order' ); if( plugin_config_get( 'status_board_order', null, false, null, helper_get_current_project() ) != $f_status_order ) { diff --git a/Taskodrome/pages/config_page.php b/Taskodrome/pages/config_page.php index 98b40de..e5fe863 100644 --- a/Taskodrome/pages/config_page.php +++ b/Taskodrome/pages/config_page.php @@ -33,6 +33,31 @@
+ + + + + +
+ + + +
+ + + +
+ + > + +
diff --git a/Taskodrome/pages/main.php b/Taskodrome/pages/main.php index b18f0b3..1094398 100644 --- a/Taskodrome/pages/main.php +++ b/Taskodrome/pages/main.php @@ -185,11 +185,12 @@ function write_bug_rows( $p_rows ) $t_versions_cnt = count( $t_versions ); for( $k=0; $k < $t_versions_cnt; $k++ ) { $ver_id = $t_versions[$k]['id']; - print '

'; + print '

'; } print '

'; print '

'; + print '

'; print '

'; print '

'; print '

';