diff --git a/src/content/mytinytodo.js b/src/content/mytinytodo.js index 9a207af..1bdd9ee 100644 --- a/src/content/mytinytodo.js +++ b/src/content/mytinytodo.js @@ -1297,6 +1297,10 @@ function changeTaskOrder(id) if (taskOrder.length < 2) { return; } + if (id && (curList.sort == 5 || curList.sort == 105)) { + // re-sort the whole list in case of database sorting is not the same due to collation + changeTaskOrder(); + } const oldOrder = taskOrder.slice(); function firstNonZero(order, compl, ...args) { const m = (order < 100) ? 1 : -1; @@ -1354,6 +1358,16 @@ function changeTaskOrder(id) taskList[a].ow - taskList[b].ow )) } + // sortByTitle and reverse + else if (curList.sort == 5 || curList.sort == 105) { + taskOrder.sort( (a, b) => firstNonZero( + curList.sort, + taskList[a].compl - taskList[b].compl, + taskList[a].title.localeCompare(taskList[b].title, 'en', {sensitivity: 'base'}), + taskList[b].prio - taskList[a].prio, + taskList[a].ow - taskList[b].ow + )) + } else { return; } diff --git a/src/includes/api/ListsController.php b/src/includes/api/ListsController.php index 92d7c2e..1224cf1 100644 --- a/src/includes/api/ListsController.php +++ b/src/includes/api/ListsController.php @@ -234,8 +234,9 @@ class ListsController extends ApiController { static function setListSortingById(int $listId, int $sort) { $db = DBConnection::instance(); - if ($sort < 0 || $sort > 104) $sort = 0; - elseif ($sort < 101 && $sort > 4) $sort = 0; + if ($sort < 0 || ($sort > 5 && $sort < 101) || $sort > 105) { + $sort = 0; + } if ($listId == -1) { $opts = Config::requestDomain('alltasks.json'); $opts['sort'] = $sort; diff --git a/src/includes/api/TasksController.php b/src/includes/api/TasksController.php index 0f04bfe..cf8fded 100644 --- a/src/includes/api/TasksController.php +++ b/src/includes/api/TasksController.php @@ -91,6 +91,8 @@ class TasksController extends ApiController { elseif ($sort == 103) $sqlSort .= "d_created DESC, prio ASC, ow DESC"; // byDateCreated (reverse) elseif ($sort == 4) $sqlSort .= "d_edited ASC, prio DESC, ow ASC"; // byDateModified elseif ($sort == 104) $sqlSort .= "d_edited DESC, prio ASC, ow DESC"; // byDateModified (reverse) + elseif ($sort == 5) $sqlSort .= "title ASC, prio DESC, ow ASC"; // byTitle + elseif ($sort == 105) $sqlSort .= "title DESC, prio ASC, ow DESC"; // byTitle (reverse) else $sqlSort .= "ow ASC"; $t = array(); diff --git a/src/includes/lang/en.json b/src/includes/lang/en.json index affeac2..3fd5e0a 100644 --- a/src/includes/lang/en.json +++ b/src/includes/lang/en.json @@ -40,6 +40,7 @@ "tagfilter_cancel": "cancel filter", "showTagsFromAllLists": "Show tags from all lists", "sortByHand": "Sort by hand", + "sortByTitle": "Sort by title", "sortByPriority": "Sort by priority", "sortByDueDate": "Sort by due date", "sortByDateCreated": "Sort by date created", diff --git a/src/includes/lang/ru.json b/src/includes/lang/ru.json index 2d72f3e..48c2e5f 100644 --- a/src/includes/lang/ru.json +++ b/src/includes/lang/ru.json @@ -40,6 +40,7 @@ "tagfilter_cancel": "отменить фильтр по тегу", "showTagsFromAllLists": "Показать теги из всех списков", "sortByHand": "Сортировка вручную", + "sortByTitle": "Сортировка по алфавиту", "sortByPriority": "Сортировка по приоритету", "sortByDueDate": "Сортировка по сроку", "sortByDateCreated": "Сортировка по дате добавления", diff --git a/src/includes/theme.php b/src/includes/theme.php index a68a696..703f7b5 100644 --- a/src/includes/theme.php +++ b/src/includes/theme.php @@ -237,6 +237,7 @@ $().ready(function(){