diff --git a/src/content/mytinytodo.js b/src/content/mytinytodo.js
index 66bfdd8..c849b4d 100644
--- a/src/content/mytinytodo.js
+++ b/src/content/mytinytodo.js
@@ -75,6 +75,7 @@ var mytinytodo = window.mytinytodo = _mtt = {
calendarIcon: 'calendar.png', // need themeUrl+icon
history: true,
markdown: true,
+ viewTaskOnClick: false,
},
timers: {
@@ -447,6 +448,11 @@ var mytinytodo = window.mytinytodo = _mtt = {
flag.editFormChanged = true;
});
+ $('#taskviewer_edit_btn').on('click', function() {
+ const id = document.getElementById('page_taskviewer').dataset.id;
+ editTask(id);
+ });
+
// tasklist handlers
$("#tasklist").on('click', '> li.task-row .task-middle', function(e) {
if ( findParentNode(e.target, 'A') ) {
@@ -454,6 +460,10 @@ var mytinytodo = window.mytinytodo = _mtt = {
}
var li = findParentNode(this, 'LI');
if (li && li.id) {
+ if (e.altKey) {
+ viewTask(li.dataset.id);
+ return;
+ }
if (lastClickedNodeId && li.id != lastClickedNodeId) {
$('#'+lastClickedNodeId).removeClass('clicked');
}
@@ -474,6 +484,20 @@ var mytinytodo = window.mytinytodo = _mtt = {
}
});
+ if (this.options.touchDevice) {
+ this.options.viewTaskOnClick = true;
+ }
+
+ if (this.options.viewTaskOnClick) {
+ $('#mtt').addClass('view-task-on-click');
+ $('#tasklist').on('click', '> li.task-row .task-title', function(){
+ let id = parseInt(getLiTaskId(this));
+ if (id) {
+ viewTask(id);
+ }
+ });
+ }
+
$('#tasklist').on('click', '.taskactionbtn', function(){
var id = parseInt(getLiTaskId(this));
if(id) taskContextMenu(this, id);
@@ -683,6 +707,7 @@ var mytinytodo = window.mytinytodo = _mtt = {
//History
if (this.options.history) {
window.onpopstate = historyOnPopState;
+ window.history.scrollRestoration = 'manual';
}
// Appearance mode for CSS
@@ -880,9 +905,8 @@ var mytinytodo = window.mytinytodo = _mtt = {
hideAlert();
$(document).off('keydown.mttback');
// If clicked on back button in settings we'll use history navigation
- if ( clicked &&
- this.pages.current && this.pages.current.page == 'ajax' && this.pages.current.pageClass == 'settings' &&
- this.pages.prev.length > 0 ) {
+ if ( clicked && this.pages.current && this.pages.prev.length > 0 &&
+ ((_mtt.pages.current.page == 'ajax' && _mtt.pages.current.pageClass == 'settings') || _mtt.pages.current.page == 'taskviewer') ) {
window.history.back();
return;
}
@@ -1164,7 +1188,7 @@ function prepareListHtml(list)
function prepareTaskStr(item, noteExp)
{
- return '
' +
prepareTaskBlocks(item) + "\n";
};
@@ -1188,7 +1212,7 @@ function prepareTaskBlocks(item)
preparePrio(item.prio,id) +
'' + prepareTaskTitleInlineHtml(item.title) + ' ' +
(curList.id == -1 ? ''+ tabLists.get(item.listId).name +'' : '') +
- prepareTagsStr(item) +
+ '' + prepareTagsStr(item) + '' +
'' +
'' + prepareDueDate(item) + "
" +
'' +
@@ -1234,7 +1258,7 @@ function preparePrio(prio,id)
};
_mtt.preparePrio = preparePrio;
-function prepareTagsStr(item)
+function prepareTagsStr(item, delimiter = ', ')
{
if (!item.tags || item.tags == '') return '';
let a = item.tags.split(',');
@@ -1243,7 +1267,7 @@ function prepareTagsStr(item)
for (let i in a) {
a[i] = ''+a[i]+'';
}
- return ''+a.join(', ')+'';
+ return a.join(delimiter);
};
_mtt.prepareTagsStr = prepareTagsStr;
@@ -1731,6 +1755,30 @@ function saveTaskNote(id)
return false;
};
+function fillTaskViewer(id)
+{
+ const item = taskList[id];
+ if (!item) return false;
+ $('#page_taskviewer').attr('data-id', item.id);
+ $('#taskviewer_id').text('#' + item.id);
+ $('#page_taskviewer .title').html(item.title);
+ $('#page_taskviewer .note').html(item.note);
+ $('#page_taskviewer .prio .content').html(preparePrio(item.prio,item.id));
+ $('#page_taskviewer .due .content').html(item.duedate);
+ $('#page_taskviewer .tags .content').html(prepareTagsStr(item, ''));
+ $('#page_taskviewer .list .content').text(curList.name);
+ return item;
+}
+
+function viewTask(id)
+{
+ const item = fillTaskViewer(id);
+ if (!item) return;
+ _mtt.pageSet('taskviewer');
+ updateHistoryState({ task: item.id, list: item.listId }, '#task/'+item.id, dehtml(item.title) + ' - ' + curList.name + ' - ' + _mtt.options.title);
+}
+
+
function editTask(id)
{
var item = taskList[id];
@@ -1814,23 +1862,32 @@ function showEditForm(isAdd)
function saveTask(form)
{
$("#edittags").autocomplete('close');
- if(flag.readOnly) return false;
- if(form.isadd.value != 0)
+ if (flag.readOnly)
+ return false;
+ if (form.isadd.value != 0)
return submitFullTask(form);
_mtt.db.request('editTask', {id:form.id.value, title: form.task.value, note:form.note.value,
prio:form.prio.value, tags:form.tags.value, duedate:form.duedate.value},
- function(json){
- if(!parseInt(json.total)) return;
- var item = json.list[0];
+ function(json) {
+ if (!parseInt(json.total))
+ return;
+ const item = json.list[0];
changeTaskCnt(item, 0, taskList[item.id]);
taskList[item.id] = item;
- var noteExpanded = (item.note != '' && $('#taskrow_'+item.id).is('.task-expanded')) ? 1 : 0;
+ const noteExpanded = (item.note != '' && $('#taskrow_'+item.id).is('.task-expanded')) ? 1 : 0;
$('#taskrow_'+item.id).replaceWith(_mtt.prepareTaskStr(item, noteExpanded));
- if(curList.sort != 0) changeTaskOrder(item.id);
- _mtt.pageBack(); //back to list
+ if (curList.sort != 0)
+ changeTaskOrder(item.id);
refreshTaskCnt();
- $('#taskrow_'+item.id).effect("highlight", {color:_mtt.theme.editTaskFlashColor}, 'normal', function(){$(this).css('display','')});
+ _mtt.pageBack(); //back to list or viewer
+ if (_mtt.pages.current.page = 'taskviewer') {
+ fillTaskViewer(item.id);
+ }
+ else {
+ $('#taskrow_'+item.id).effect("highlight", {color:_mtt.theme.editTaskFlashColor}, 'normal', function(){$(this).css('display','')});
+ }
+
});
flag.tagsChanged = true;
return false;
@@ -2994,12 +3051,18 @@ function updateHistoryState(state, url, title)
function historyOnPopState(event)
{
if (!event.state) return;
- if (event.state.list && _mtt.pages.current && _mtt.pages.current.page == 'ajax' && _mtt.pages.current.pageClass == 'settings') {
- // Here we go back to tasklist from settings, no reload. Just show and hide pages without history actions.
+ if (event.state.list && _mtt.pages.current &&
+ ((_mtt.pages.current.page == 'ajax' && _mtt.pages.current.pageClass == 'settings') || _mtt.pages.current.page == 'taskviewer') ) {
+ // Here we go back to tasklist from settings or view task, no reload.
+ // Just show and hide pages without history actions.
_mtt.pageBack();
flag.dontChangeHistoryOnce = true;
updateHistoryState( { list:event.state.list }, event.state.url, event.state.title );
}
+ else if (event.state.task) {
+ flag.dontChangeHistoryOnce = true;
+ viewTask(event.state.task);
+ }
else if (event.state.list) {
flag.dontChangeHistoryOnce = true;
tabSelect(event.state.list);
diff --git a/src/content/theme/style.css b/src/content/theme/style.css
index ebbccaf..e2daf1a 100644
--- a/src/content/theme/style.css
+++ b/src/content/theme/style.css
@@ -130,7 +130,7 @@ body, td, th, input, textarea, select, button {
#mtt {
flex: 1 0 auto;
width:100%;
- max-width:1000px;
+ max-width:1100px;
padding:8px;
margin-bottom:8px;
box-sizing: border-box;
@@ -584,8 +584,15 @@ li.task-row.task-expanded .task-toggle { transform:rotate(90deg); }
}
#mtt.show-inline-date .task-date { display: block; }
.task-through { overflow:hidden; flex-grow:1; }
-.task-title a { color: var(--color-text-default); }
-.task-title a:hover { color: var(--color-tasklist-link-hover); }
+#mtt.view-task-on-click .task-title {
+ cursor: pointer;
+}
+.task-title a {
+ color: var(--color-text-default);
+}
+.task-title a:hover {
+ color: var(--color-tasklist-link-hover);
+}
#mtt.readonly #tasklist li.task-row .task-actions { display:none; }
.task-listname {
background-color: var(--color-tasklist-listname-bg);
@@ -725,30 +732,10 @@ li.task-row.task-expanded .task-note-block { display:block; }
padding: 5px;
}
#page_taskedit .form-row-short { float:left; margin-right:12px; }
-#alltags .tag {
- display: inline-block;
- color:var(--color-taglist-tag);
- background-color:var(--color-taglist-tag-bg);
- cursor: pointer;
- padding: 0 0.5em;
- border-radius: 1em;
- background-clip: padding-box;
- border: 1px solid transparent;
- margin-bottom:2px;
- margin-right: 3px;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-#alltags .tag:hover {
- /*background-color:var(--color-taglist-tag-hover-bg);*/
- border-color: var(--color-taglist-tag-hover-bg);;
- color: var(--color-taglist-tag-hover);
-}
.alltags-cell { width:1%; white-space:nowrap; padding-left:5px; }
#page_taskedit.mtt-inadd .mtt-inedit { display:none; }
#page_taskedit.mtt-inedit .mtt-inadd { display:none; }
-#taskedit_id, #taskview_id {
+#taskedit_id, #taskviewer_id {
color: var(--color-text-reduced2);
font-weight: normal;
margin-left: 5px;
@@ -756,6 +743,53 @@ li.task-row.task-expanded .task-note-block { display:block; }
#taskedit_info { font-size:1rem; font-weight:normal; color:var(--color-text-reduced2); margin-bottom:6px; }
#taskedit_info > div { margin-top:6px; }
+#page_taskviewer .container {
+ display: flex;
+ max-width: 100%;
+}
+#page_taskviewer .container .left {
+ flex-grow: 1;
+ min-width: 0; /* to limit long text*/
+}
+#page_taskviewer .container .right {
+ min-width:300px;
+ max-width:300px;
+ padding-left: 0.5rem;
+ overflow: hidden;
+}
+#page_taskviewer .container .right .property {
+ padding: 1rem 0.5rem;
+}
+#page_taskviewer .container .right .property:not(:last-child) {
+ border-bottom: 1px solid var(--color-tasklist-row-expanded-border);
+}
+#page_taskviewer .container .right .form-bottom-buttons .mtt-back-button {
+ display: none;
+}
+
+#page_taskviewer .title {
+ /*font-weight: bold;*/
+ font-size: 1.4rem;
+ margin-top: 1rem;
+ padding-bottom: 1rem;
+ margin-bottom: 1rem;
+ border-bottom: 1px solid var(--color-tasklist-row-expanded-border);
+}
+#page_taskviewer .note {
+ line-height: 1.3;
+ display: block;
+ white-space: normal;
+ word-wrap: break-word;
+ padding: 1rem;
+ border:1px solid var(--color-tasklist-row-expanded-border);
+ border-radius: 5px;
+}
+#page_taskviewer .property.tags .content {
+ display: inline-flex;
+ flex-wrap: wrap;
+ max-width: 100%;
+}
+
a.mtt-back-button { font-size:1rem; }
h3.page-title a.mtt-back-button {
display:inline-block;
@@ -792,6 +826,7 @@ h3.page-title a.mtt-back-button {
#priopopup .prio-pos:hover { border-color: var(--color-priority-urgent); }
#priopopup .prio-pos-1:hover { border-color: var(--color-priority-high); }
+
#tagcloudbtn {
font-size: 1rem;
font-weight: normal;
@@ -813,26 +848,6 @@ h3.page-title a.mtt-back-button {
#tagcloud > div {
padding:5px;
}
-#tagcloud .tag {
- display: inline-block;
- padding: 0 0.5em;
- border-radius: 1em;
- color:var(--color-taglist-tag);
- background-color:var(--color-taglist-tag-bg);
- cursor: pointer;
- white-space: nowrap;
- background-clip: padding-box; /* for transparent border */
- border: 1px solid transparent;
- margin-bottom:2px;
- margin-right: 1px;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-#tagcloud .tag:hover {
- border-color: var(--color-taglist-tag-hover-bg);
- color: var(--color-taglist-tag-hover);
-}
#tagcloudload {
display:none;
height:24px;
@@ -859,6 +874,41 @@ h3.page-title a.mtt-back-button {
text-overflow: ellipsis;
}
+#tagcloud .tag,
+#alltags .tag,
+#page_taskviewer .property.tags .tag {
+ display: inline-block;
+ padding: 0 0.5em;
+ border-radius: 1em;
+ color:var(--color-taglist-tag);
+ background-color:var(--color-taglist-tag-bg);
+ cursor: pointer;
+ background-clip: padding-box; /* for transparent border */
+ border: 1px solid transparent;
+ margin-bottom:2px;
+ margin-right: 1px;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ font-size: 1em;
+ font-weight: normal;
+}
+#alltags .tag {
+ margin-right: 3px;
+}
+#page_taskviewer .property.tags .tag {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ margin-bottom:0;
+ margin-top:3px;
+}
+#tagcloud .tag:hover,
+#alltags .tag:hover,
+#page_taskviewer .property.tags .tag:hover {
+ /*background-color:var(--color-taglist-tag-hover-bg);*/
+ border-color: var(--color-taglist-tag-hover-bg);;
+ color: var(--color-taglist-tag-hover);
+}
.ui-datepicker {
width: 250px;
@@ -1215,6 +1265,7 @@ li.mtt-item-hidden { display:none; }
#tasklist li.task-row .task-through { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
#tasklist li.task-row.task-expanded .task-note-block { display:none; }
+/*
#tasklist li.task-row.clicked {
border:1px solid var(--color-tasklist-row-expanded-border);
border-radius: 3px;
@@ -1225,6 +1276,7 @@ li.mtt-item-hidden { display:none; }
#tasklist li.task-row.clicked .task-actions { display:block; }
#tasklist li.task-row.clicked .task-through { white-space:normal; display:inline; }
#tasklist li.task-row.clicked.task-has-note .task-note-block { display:block; }
+*/
.task-toggle { display:none; }
#tasklist .mtt-task-placeholder { line-height:1rem; padding-top:0.6rem; padding-bottom:0.6rem; }
#tasklist .ui-sortable-helper { box-shadow:0px 0px 3px #555; }
@@ -1241,6 +1293,20 @@ li.mtt-item-hidden { display:none; }
.mtt-menu-container li { padding-top:0.3rem; padding-bottom:0.3rem; }
+ #page_taskviewer .container {
+ flex-direction: column;
+ }
+ #page_taskviewer .container .right {
+ max-width: unset;
+ padding-left: 0;
+ }
+ #page_taskviewer .container .right .property {
+ padding: 0.8rem 0.5rem;
+ }
+ #page_taskviewer .container .right .form-bottom-buttons .mtt-back-button {
+ display: block;
+ }
+
.mtt-settings-table .tr:not(.form-bottom-buttons) {
display: block;
background-color:var(--color-settings-row);
diff --git a/src/includes/lang/en.json b/src/includes/lang/en.json
index 9f774f0..dc9b0db 100644
--- a/src/includes/lang/en.json
+++ b/src/includes/lang/en.json
@@ -29,8 +29,10 @@
"task": "Task",
"note": "Note",
"tags": "Tags",
+ "list": "List",
"save": "Save",
"cancel": "Cancel",
+ "close": "Close",
"password": "Password",
"btn_login": "Login",
"a_login": "Login",
diff --git a/src/includes/lang/ru.json b/src/includes/lang/ru.json
index b44872c..1d6a5f8 100644
--- a/src/includes/lang/ru.json
+++ b/src/includes/lang/ru.json
@@ -29,8 +29,10 @@
"task": "Задача",
"note": "Заметка",
"tags": "Теги",
+ "list": "Список",
"save": "Сохранить",
"cancel": "Отмена",
+ "close": "Закрыть",
"password": "Пароль",
"btn_login": "Войти",
"a_login": "Вход",
diff --git a/src/includes/theme.php b/src/includes/theme.php
index 3fb7d75..c9ca917 100644
--- a/src/includes/theme.php
+++ b/src/includes/theme.php
@@ -173,6 +173,28 @@ $().ready(function(){
+
+
+
+
+
+
+
+
:
+
:
+
:
+
:
+
+
+
+
+
+
+
+
+