Commit 0d7a4555 authored by ransome1's avatar ransome1
Browse files

Merge branch 'develop' into ipc

parents f5dd1258 35b2787a
{
"name": "sleek",
"productName": "sleek",
"version": "1.1.8-rc.5",
"version": "1.1.9",
"description": "todo.txt manager for Linux, Windows and MacOS, free and open-source (FOSS)",
"synopsis": "todo.txt manager for Linux, Windows and MacOS, free and open-source (FOSS)",
"category": "ProjectManagement",
......@@ -19,7 +19,7 @@
"main": "src/main.js",
"buildResources": "src",
"build": {
"buildVersion": "14",
"buildVersion": "16",
"files": [
"!flatpak-node${/*}",
"!snap${/*}",
......@@ -125,6 +125,7 @@
"build:appx": "yarn build:css && yarn build:pegjs && electron-builder -w appx --publish never",
"build:css": "sass src/scss/style.scss:src/css/style.css",
"build:pegjs": "peggy --format es --output src/js/filterlang.mjs src/js/filterlang.pegjs",
"pack": "yarn build:css && yarn build:pegjs && electron-builder --dir",
"lint": "eslint --ext .js, src --ext .mjs, src",
"sass": "sass -w src/scss/style.scss:src/css/style.css",
"start": "yarn sass & electron .",
......
name: sleek
base: core18
version: "1.1.7"
version: "1.1.9"
summary: todo.txt manager for Linux, free and open-source (FOSS)
description: |
sleek is a free and open-source (FOSS) todo manager that makes use of the todo.txt format. sleeks GUI is modern and simple but still offers a decent set of functions which help users getting things done. sleek is available as a client for Windows, MacOS and Linux.
sleek is an open-source (FOSS) todo manager based on the todo.txt syntax. Stripped down to only the most necessary features, and with a clean and simple interface, sleek aims to help you focus on getting things done.
Users can add contexts, projects, priorities, due dates or recurrences to their todos. These todo.txt attributes can then be used as filters or to group and sort the todo list.
All classic todo.txt attributes are supported and enhanced by additional features. Creating todos is straightforward, and tag-based filtering in tandem with highly customisable grouping and smart full-text search allow for rapid information retrieval. Completed todos can be hidden or archived into separate done.txt files. Easy integration with other todo.txt apps is facilitated by continuously scanning todo.txt files for changes.
sleek manages and watches multiple todo.txt files continuously for changes, which makes it easy to integrate sleek with other todo.txt apps. Also users can switch between bright and dark mode and choose from multiple languages.
Todos with due date or repeating todos will trigger notifications and completed todos can be hidden or archived into separate done.txt files. If users have tons of todos, a compact view can come in handy.
sleek is available for Windows, MacOS and Linux, and in several languages. For a detailed list of features, see below.
grade: stable
confinement: strict
......
......@@ -9,14 +9,14 @@
background-color: #212224 !important;
}
body a {
color: #3273dc;
color: #3273dc !important;
}
body a:hover,
body a:focus-visible {
color: #f0f0f0;
color: #f0f0f0 !important;
}
body strong {
color: #f0f0f0;
color: white !important;
}
body input,
body select {
......@@ -29,7 +29,7 @@ body input[type=search],
body textarea {
background: #2d2d2d !important;
border: none;
color: white;
color: white !important;
}
body input:focus,
body select:focus {
......@@ -44,6 +44,11 @@ body .inputWrapper.is-focused .todoTableSearchQuestionmark i {
color: #f0f0f0 !important;
}
body input::placeholder {
color: #f0f0f0 !important;
}
body input[type=text]::placeholder,
body input[type=search]::placeholder,
body textarea::placeholder {
color: #5a5a5a !important;
}
body input[type=checkbox]:focus,
......@@ -55,14 +60,18 @@ body input[type=checkbox]:active {
background: #5a5a5a !important;
}
body input[type=range]::-webkit-slider-thumb {
background: #f0f0f0;
background: #f0f0f0 !important;
}
body button {
color: #f0f0f0;
background: #212224;
color: #f0f0f0 !important;
background-color: transparent !important;
}
body ::after {
border-color: #f0f0f0 !important;
border-color: #3273dc !important;
}
body button:focus-visible {
color: #f0f0f0 !important;
background: #2d2d2d !important;
}
body table {
width: 100%;
......@@ -75,20 +84,13 @@ body input[type=checkbox]:active {
body table tr th {
color: white !important;
}
body table.files tr td:last-child a,
body table.files tr td:last-child a:hover {
color: #f0f0f0 !important;
}
body table.files tr td:last-child a:focus-visible {
color: #212224 !important;
}
body table.files button {
color: #f0f0f0;
background: #212224;
color: #f0f0f0 !important;
background: #3273dc !important;
}
body table.files button:focus-visible {
color: #212224 !important;
background: #f0f0f0 !important;
color: #f0f0f0 !important;
background: #3273dc !important;
}
body table.files button:disabled {
opacity: 0.5;
......@@ -124,28 +126,34 @@ body nav ul li a:focus {
body nav ul:nth-child(2) #versionNumber:hover {
color: #CCCDCF !important;
}
body a.contexts {
body a.contexts,
body a.contexts:hover {
color: #c5ede3 !important;
background: #1e6251 !important;
}
body a.contexts span.tag {
body a.contexts span.tag,
body a.contexts:hover span.tag {
color: #123b31 !important;
background: #c9eee5 !important;
}
body a.contexts.is-dark,
body a.contexts.is-dark:hover,
body a.contexts:focus-visible {
background: #123b31 !important;
color: white !important;
}
body a.projects {
body a.projects,
body a.projects:hover {
color: #f1d6f1 !important;
background: #6f266f !important;
}
body a.projects span.tag {
body a.projects span.tag,
body a.projects:hover span.tag {
color: #491949 !important;
background: #f2daf2 !important;
}
body a.projects.is-dark,
body a.projects.is-dark:hover,
body a.projects:focus-visible {
background: #491949 !important;
color: white !important;
......@@ -161,6 +169,9 @@ body a.projects:focus-visible {
body #drawerContainer .zoom #zoomStatus {
color: white !important;
}
body #drawerContainer .todoFilterHint {
color: #CCCDCF;
}
body #todoTableSearchContainer {
background-color: #212224;
}
......@@ -186,12 +197,6 @@ body #todoTableSearchContainer #todoTableSearchAddTodo:focus-visible {
body #resultStats .tag {
color: #CCCDCF !important;
}
body #resultStats .tag strong {
color: white !important;
}
body #todoTable i {
color: #f0f0f0;
}
body #todoTable i.fa-sort-down {
color: #5a5a5a !important;
}
......@@ -229,38 +234,35 @@ body #todoTable .todo.due button {
body #todoTable .todo .cell.archive a:focus-visible {
color: #CCCDCF !important;
}
body #todoTable .todo div.cell.text {
body #todoTable .todo .cell.text {
color: #f0f0f0 !important;
}
body #todoTable .todo div.cell.text:focus-visible {
body #todoTable .todo .cell.text:focus-visible {
background: #2d2d2d !important;
}
body #todoTable .todo .cell.itemDueDate {
color: white;
}
body #todoTable .todo .cell.itemDueDate i {
color: inherit;
body #todoTable .todo .cell.hint.itemDueDate i {
color: inherit !important;
}
body #todoTable .todo .cell.itemDueDate.today,
body #todoTable .todo .cell.itemDueDate.past {
color: #ff3860;
body #todoTable .todo .cell.hint.itemDueDate.today,
body #todoTable .todo .cell.hint.itemDueDate.past {
color: #ff3860 !important;
}
body #todoTable .todo .cell.itemDueDate.today i,
body #todoTable .todo .cell.itemDueDate.past i {
body #todoTable .todo .cell.hint.itemDueDate.today i,
body #todoTable .todo .cell.hint.itemDueDate.past i {
color: inherit !important;
}
body #todoTable .todo .cell.itemDueDate.tomorrow {
body #todoTable .todo .cell.hint.itemDueDate.tomorrow {
color: #fa745e;
}
body #todoTable .todo .cell.itemDueDate.tomorrow i {
body #todoTable .todo .cell.hint.itemDueDate.tomorrow i {
color: inherit !important;
}
body #todoTable .todo .cell.hint i:not(.fa-sort-down) {
color: #CCCDCF !important;
}
body #todoTable .todo:focus {
background: #3a3a3a !important;
}
body #modalForm i {
color: #CCCDCF !important;
}
body #modalForm .field input,
body #modalForm .field select {
color: white !important;
......@@ -329,15 +331,17 @@ body #todoTableWrapper::-webkit-scrollbar-thumb {
body #todoContext {
box-shadow: 0 0 1em #212224 !important;
}
body #filterContext a,
body #todoContext a {
body #filterContext .dropdown-item,
body #todoContext .dropdown-item {
color: #f0f0f0 !important;
}
body #filterContext a:hover,
body #filterContext a:focus,
body #todoContext a:hover,
body #todoContext a:focus {
color: #CCCDCF !important;
body #filterContext .dropdown-item:hover,
body #filterContext .dropdown-item:focus,
body #filterContext .dropdown-item:focus-visible,
body #todoContext .dropdown-item:hover,
body #todoContext .dropdown-item:focus,
body #todoContext .dropdown-item:focus-visible {
color: #f0f0f0 !important;
background: #2d2d2d !important;
}
body #filterContext .card,
......@@ -348,12 +352,12 @@ body #todoContext .card {
body #todoContext .card #filterContextDelete {
color: #ff3860 !important;
}
body #filterContext .horizontal,
body #todoContext .horizontal {
body #filterContext .card-content .horizontal,
body #todoContext .card-content .horizontal {
border-bottom: 1px solid #2d2d2d;
}
body #filterContext .horizontal label,
body #todoContext .horizontal label {
body #filterContext .card-content .horizontal label,
body #todoContext .card-content .horizontal label {
color: #ebebeb;
}
body #fileTabBar ul {
......@@ -415,9 +419,6 @@ body .modal.content button,
body .modal.content select {
background: #2d2d2d !important;
}
body .modal.content .select:not(.is-multiple):not(.is-loading)::after {
border-color: white !important;
}
body .modal.content .delete,
body .modal.content .modal-close,
body .modal.content .tag.is-info {
......@@ -472,9 +473,6 @@ body .modal.content table td {
body .message.fixed {
background: transparent !important;
}
body .message.fixed i {
color: white !important;
}
body .message.fixed .message-body {
color: #CCCDCF;
background: #3B3B3B !important;
......@@ -688,7 +686,6 @@ input[type=range]:focus {
padding: 0.1em;
-webkit-appearance: none;
border-radius: 0.65em;
background: #CCCDCF !important;
}
input[type=range]::-webkit-slider-thumb {
......@@ -879,6 +876,16 @@ code, pre {
margin-right: 0.2em;
color: #3273dc;
}
#messages .message.review table tr td {
text-align: center;
}
#messages .message.review table tr td a {
display: block;
}
#messages .message.review table tr td a i {
font-size: 2em;
color: #3273dc !important;
}
#messages button {
margin-top: 0.5em;
}
......@@ -1588,6 +1595,9 @@ a.priority.C:focus-visible span.tag {
#drawerContainer .drawer section .todoFilterHint {
cursor: help;
}
#drawerContainer .drawer table tr td {
white-space: nowrap;
}
#drawerContainer .drawer table tr td:nth-child(odd) {
width: auto;
vertical-align: middle;
......
This diff is collapsed.
......@@ -312,8 +312,8 @@
</div>
<footer class="card-footer">
<button id="btnSave" type="submit" class="card-footer-item" tabindex="0"></button>
<button id="btnItemStatus" class="card-footer-item is-hidden" tabindex="0"></button>
<button id="btnCancel" class="card-footer-item" role="cancel" tabindex="0"></button>
<a href="#" id="btnItemStatus" class="card-footer-item is-hidden" tabindex="0"></a>
<a href="#" id="btnCancel" class="card-footer-item" role="cancel" tabindex="0"></a>
</footer>
</div>
</div>
......@@ -488,7 +488,7 @@
</td>
</tr>
</table>
<table id="autoUpdate" class="settings is-hidden">
<table id="autoUpdateRow" class="settings is-hidden">
<tr>
<th colspan="100%" id="autoUpdateHeadline"></th>
</tr>
......@@ -850,18 +850,19 @@
<p><button id="btnMessageLogging" tabindex="-1"><i class="fas fa-cog"></i>&nbsp;<span id="messageLoggingButton"></span></button></p>
</div>
</article>
<article class="message fixed" data="share">
<article class="message fixed review" data="support">
<div class="message-header">
<p><span id="messageShareTitle"></span></p>
<button class="delete close" role="cancel" data-message="share" tabindex="-1"></button>
<p>sleek <i class="fas fa-heart"></i> you</p>
<button class="delete" role="cancel" data-message="support"></button>
</div>
<div class="message-body">
<p><span id="messageShareBody"></span></p>
<p class="brands">
<a tabindex="-1" href="https://twitter.com/intent/tweet?text=Check%20out%20sleek,%20a%20todo%20app%20based%20on%20todo.txt,%20free%20and%20open-source.%20Available%20for%20Linux,%20Windows%20and%20MacOS.%20https://github.com/ransome1/sleek" target="_blank"><i class="fab fa-twitter"></i></a>
<a tabindex="-1" href="https://www.facebook.com/sharer/sharer.php?u=https://github.com/ransome1/sleek" target="_blank"><i class="fab fa-facebook-square"></i></a>
<a tabindex="-1" href="https://www.linkedin.com/shareArticle?mini=true&url=https://github.com/ransome1/sleek" target="_blank"><i class="fab fa-linkedin"></i></a>
</p>
<p>Please submit bug reports on <i class="fab fa-github"></i>&nbsp;<a href="https://github.com/ransome1/sleek/issues\" target="_blank">Github</a> and support this little project by writing a review on:
<table>
<tr>
<td><a href="https://apps.apple.com/us/app/sleek-todo-manager/id1614704209" target="_blank"><i class="fa-brands fa-apple"></i><br>Mac App Store</a></td>
<td><a href="https://www.microsoft.com/store/apps/9NWM2WXF60KR" target="_blank"><i class="fa-brands fa-windows"></i><br>Microsoft Store</a></td>
</tr>
</table>
</div>
</article>
</section>
......
......@@ -6,7 +6,7 @@ import { userData, setUserData } from "../render.js";
// ########################################################################################################################
export const getHandleElement = document.getElementById("handle");
const getResizeableElement = () => { return document.getElementById("drawerContainer"); };
const minPaneSize = 400;
const minPaneSize = 450;
const maxPaneSize = document.body.clientWidth * .75
const setPaneWidth = (width) => {
getResizeableElement().style.setProperty("--resizeable-width", `${width}px`);
......
......@@ -26,21 +26,15 @@ datePickerInput.placeholder = translations.formSelectDueDate;
btnItemStatus.onclick = async function() {
try {
// pass data item to function, not the actual value
const todo = await generateTodoTxtObject(modalForm.getAttribute("data-item")).then(response => {
return response;
}).catch(error => {
handleError(error);
});
setTodoComplete(todo).then(response => {
setTodoComplete(modalForm.getAttribute("data-item")).then(response => {
console.log(response);
}).catch(error => {
handleError(error);
});
// clear and close form
resetForm().then(function(result) {
console.log(result);
// close and clean up the modal
resetForm().then(function(response) {
console.log(response);
}).catch(function(error) {
handleError(error);
});
......@@ -48,8 +42,6 @@ btnItemStatus.onclick = async function() {
// trigger matomo event
if(userData.matomoEvents) _paq.push(["trackEvent", "Form", "Click on Done/In progress"]);
return false;
} catch(error) {
error.functionName = "btnItemStatus.onclick";
handleError(error);
......@@ -90,14 +82,10 @@ modalForm.onsubmit = async function(event) {
// in case there hasn't been a passed data item, we just push the input value as a new item into the array
// replace new lines with spaces (https://stackoverflow.com/a/34936253)
const inputValue = modalFormInput.value.replaceAll(/[\r\n]+/g, String.fromCharCode(16));
const inputValue = await modalFormInput.value.replaceAll(/[\r\n]+/g, String.fromCharCode(16));
// create todo object from input value
let todo = await generateTodoTxtObject(inputValue).then(response => {
return response;
}).catch(error => {
handleError(error);
});
let todo = await generateTodoTxtObject(inputValue);
// we add the current date to the start date attribute of the todo.txt object
if(userData.appendStartDate) todo.date = new Date();
......
......@@ -175,7 +175,7 @@ export function initialSetupInterface() {
(userData.compactView) ? body.classList.add("compact") : body.classList.remove("compact");
// show or hide specific settings
if(appData.channel === "AppImage" || appData.os === "mac" && appData.channel !== "Mac App Store") document.getElementById("autoUpdate").classList.remove("is-hidden")
if(appData.channel === "AppImage" || appData.os === "mac" && appData.channel !== "Mac App Store") document.getElementById("autoUpdateRow").classList.remove("is-hidden")
// set scaling factor if default font size has changed
document.getElementById("html").style.zoom = userData.zoom + "%";
......
......@@ -12,14 +12,10 @@ const messageGenericMessage = document.getElementById("messageGenericMessage");
const messageLoggingBody = document.getElementById("messageLoggingBody");
const messageLoggingButton = document.getElementById("messageLoggingButton");
const messageLoggingTitle = document.getElementById("messageLoggingTitle");
const messageShareBody = document.getElementById("messageShareBody");
const messageShareTitle = document.getElementById("messageShareTitle");
messageLoggingBody.innerHTML = translations.messageLoggingBody;
messageLoggingButton.innerHTML = translations.settings;
messageLoggingTitle.innerHTML = translations.errorEventLogging;
messageShareBody.innerHTML = translations.messageShareBody;
messageShareTitle.innerHTML = translations.messageShareTitle;
btnMessageLogging.onclick = function () {
showModal("modalSettings").then(function(response) {
......
......@@ -9,6 +9,7 @@ import { convertDate, isToday, isTomorrow, isPast } from "./date.mjs";
import { createModalJail } from "./jail.mjs";
import { focusRow } from "./keyboard.mjs";
import { showRecurrences, setInput } from "./recurrencePicker.mjs";
import { generateRecurrence } from "./recurrences.mjs";
import { getActiveFile, getDoneFile, handleError, pasteItemToClipboard, generateGenericNotification, generateTodoNotification } from "./helper.mjs";
import { getConfirmation } from "./prompt.mjs";
import { show } from "./form.mjs";
......@@ -47,7 +48,7 @@ todoContextUseAsTemplate.innerHTML = translations.useAsTemplate;
tableContainerCategoriesTemplate.setAttribute("class", "cell categories");
todoTableBodyCellCheckboxTemplate.setAttribute("class", "cell checkbox");
todoTableBodyCellDueDateTemplate.setAttribute("class", "cell hint itemDueDate");
todoTableBodyCellTDateTemplate.setAttribute("class", "cell");
todoTableBodyCellTDateTemplate.setAttribute("class", "cell hint");
todoTableBodyCellRecurrenceTemplate.setAttribute("class", "cell hint");
todoTableBodyCellTextTemplate.setAttribute("class", "cell text");
todoTableBodyCellTextTemplate.setAttribute("href", "#");
......
......@@ -9,14 +9,14 @@
background-color: $almost-black!important;
}
a {
color: $has-text-link;
color: $has-text-link!important;
}
a:hover,
a:focus-visible {
color: $almost-white;
color: $almost-white!important;
}
strong {
color: $almost-white;
color: white!important;
}
input,
select {
......@@ -24,12 +24,13 @@
background: transparent!important;
color: white!important;
}
input[type="text"],
input[type="search"],
textarea {
background: $darker-grey!important;
border: none;
color: white;
color: white!important;
}
input:focus,
select:focus {
......@@ -44,6 +45,11 @@
}
}
input::placeholder {
color: $almost-white!important;
}
input[type="text"]::placeholder,
input[type="search"]::placeholder,
textarea::placeholder {
color: $dark-grey!important;
}
input[type="checkbox"]:focus,
......@@ -55,14 +61,18 @@
background: $dark-grey!important;
}
input[type="range"]::-webkit-slider-thumb {
background: $almost-white;
background: $almost-white!important;
}
button {
color: $almost-white;
background: $almost-black;
color: $almost-white!important;
background-color: transparent!important;
}
::after {
border-color: $almost-white!important;
border-color: $has-text-link!important;
}
button:focus-visible {
color: $almost-white!important;
background: $darker-grey!important;
}
table {
width: 100%;
......@@ -76,24 +86,14 @@
color: white!important;
}
table.files {
tr {
td:last-child {
a,
a:hover {
color: $almost-white!important;
}
a:focus-visible {
color: $almost-black!important;
}
}
}
button {
color: $almost-white;
background: $almost-black;
color: $almost-white!important;
background: $has-text-link!important;
}
button:focus-visible {
color: $almost-black!important;
background: $almost-white!important;
color: $almost-white!important;
background: $has-text-link!important;
}
button:disabled {
opacity: 0.5;
......@@ -135,7 +135,8 @@
}
}
a.contexts {
a.contexts,
a.contexts:hover {
color: $sleek-contexts-button!important;
background: darken($sleek-contexts-button, 60%)!important;
span.tag {
......@@ -144,11 +145,13 @@
}
}
a.contexts.is-dark,
a.contexts.is-dark:hover,
a.contexts:focus-visible {
background: darken($sleek-contexts-button, 70%)!important;
color: white!important;
}
a.projects {
a.projects,
a.projects:hover {
color: $sleek-projects-button!important;
background: darken($sleek-projects-button, 60%)!important;
span.tag {
......@@ -157,6 +160,7 @@
}
}
a.projects.is-dark,
a.projects.is-dark:hover,
a.projects:focus-visible {
background: darken($sleek-projects-button, 70%)!important;
color: white!important;
......@@ -176,6 +180,9 @@
color: white!important;
}
}
.todoFilterHint {
color: $lighter-grey;
}
}
#todoTableSearchContainer {
background-color: $almost-black;
......@@ -202,15 +209,9 @@
#resultStats {
.tag {
color: $lighter-grey!important;
strong {
color: white!important;
}
}