Compare commits
No commits in common. "561fd9e1e58ac0e68c974b123c9d9002f34dfe39" and "5294d9081fe1587d2097e20942ad160079e5cc7c" have entirely different histories.
561fd9e1e5
...
5294d9081f
2 changed files with 6 additions and 32 deletions
21
src/task.rs
21
src/task.rs
|
@ -1,9 +1,8 @@
|
||||||
use fmt::Display;
|
use fmt::Display;
|
||||||
use std::cmp::Ordering;
|
use std::cmp::Ordering;
|
||||||
use std::collections::BTreeSet;
|
use std::collections::{BTreeSet, HashSet};
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::hash::{Hash, Hasher};
|
use std::hash::{Hash, Hasher};
|
||||||
use std::iter::once;
|
|
||||||
use std::string::ToString;
|
use std::string::ToString;
|
||||||
|
|
||||||
use colored::{ColoredString, Colorize};
|
use colored::{ColoredString, Colorize};
|
||||||
|
@ -13,7 +12,7 @@ use log::{debug, error, info, trace, warn};
|
||||||
use nostr_sdk::{Event, EventId, Kind, Tag, TagStandard, Timestamp};
|
use nostr_sdk::{Event, EventId, Kind, Tag, TagStandard, Timestamp};
|
||||||
|
|
||||||
use crate::helpers::{format_timestamp_local, some_non_empty};
|
use crate::helpers::{format_timestamp_local, some_non_empty};
|
||||||
use crate::kinds::{is_hashtag, Prio, PRIO, PROCEDURE_KIND, PROCEDURE_KIND_ID, TASK_KIND};
|
use crate::kinds::{is_hashtag, PROCEDURE_KIND, PROCEDURE_KIND_ID, TASK_KIND};
|
||||||
|
|
||||||
pub static MARKER_PARENT: &str = "parent";
|
pub static MARKER_PARENT: &str = "parent";
|
||||||
pub static MARKER_DEPENDS: &str = "depends";
|
pub static MARKER_DEPENDS: &str = "depends";
|
||||||
|
@ -103,25 +102,12 @@ impl Task {
|
||||||
self.event.kind == TASK_KIND
|
self.event.kind == TASK_KIND
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Whether this is an actionable task - false if stateless activity
|
/// Whether this is an actionable task - false if stateless
|
||||||
pub(crate) fn is_task(&self) -> bool {
|
pub(crate) fn is_task(&self) -> bool {
|
||||||
self.is_task_kind() ||
|
self.is_task_kind() ||
|
||||||
self.props.iter().any(|event| State::try_from(event.kind).is_ok())
|
self.props.iter().any(|event| State::try_from(event.kind).is_ok())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn priority(&self) -> Option<Prio> {
|
|
||||||
self.priority_raw().and_then(|s| s.parse().ok())
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn priority_raw(&self) -> Option<&str> {
|
|
||||||
self.props.iter().rev()
|
|
||||||
.chain(once(&self.event))
|
|
||||||
.find_map(|p| {
|
|
||||||
p.tags.iter().find_map(|t|
|
|
||||||
t.content().take_if(|_| { t.kind().to_string() == PRIO }))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
fn states(&self) -> impl DoubleEndedIterator<Item=TaskState> + '_ {
|
fn states(&self) -> impl DoubleEndedIterator<Item=TaskState> + '_ {
|
||||||
self.props.iter().filter_map(|event| {
|
self.props.iter().filter_map(|event| {
|
||||||
event.kind.try_into().ok().map(|s| TaskState {
|
event.kind.try_into().ok().map(|s| TaskState {
|
||||||
|
@ -194,7 +180,6 @@ impl Task {
|
||||||
"created" => Some(format_timestamp_local(&self.event.created_at)),
|
"created" => Some(format_timestamp_local(&self.event.created_at)),
|
||||||
"kind" => Some(self.event.kind.to_string()),
|
"kind" => Some(self.event.kind.to_string()),
|
||||||
// Dynamic
|
// Dynamic
|
||||||
"priority" => self.priority_raw().map(|c| c.to_string()),
|
|
||||||
"status" => self.state_label().map(|c| c.to_string()),
|
"status" => self.state_label().map(|c| c.to_string()),
|
||||||
"desc" => self.descriptions().last().cloned(),
|
"desc" => self.descriptions().last().cloned(),
|
||||||
"description" => Some(self.descriptions().join(" ")),
|
"description" => Some(self.descriptions().join(" ")),
|
||||||
|
|
17
src/tasks.rs
17
src/tasks.rs
|
@ -155,7 +155,6 @@ impl TasksRelay {
|
||||||
|
|
||||||
properties: [
|
properties: [
|
||||||
"author",
|
"author",
|
||||||
"prio",
|
|
||||||
"state",
|
"state",
|
||||||
"rtime",
|
"rtime",
|
||||||
"hashtags",
|
"hashtags",
|
||||||
|
@ -163,8 +162,7 @@ impl TasksRelay {
|
||||||
"desc",
|
"desc",
|
||||||
].into_iter().map(|s| s.to_string()).collect(),
|
].into_iter().map(|s| s.to_string()).collect(),
|
||||||
sorting: [
|
sorting: [
|
||||||
"priority",
|
"state",
|
||||||
"status",
|
|
||||||
"author",
|
"author",
|
||||||
"hashtags",
|
"hashtags",
|
||||||
"rtime",
|
"rtime",
|
||||||
|
@ -446,9 +444,6 @@ impl TasksRelay {
|
||||||
|
|
||||||
fn filter(&self, task: &Task) -> bool {
|
fn filter(&self, task: &Task) -> bool {
|
||||||
self.state.matches(task) &&
|
self.state.matches(task) &&
|
||||||
self.priority.is_none_or(|prio| {
|
|
||||||
task.priority().unwrap_or(DEFAULT_PRIO) >= prio
|
|
||||||
}) &&
|
|
||||||
task.tags.as_ref().map_or(true, |tags| {
|
task.tags.as_ref().map_or(true, |tags| {
|
||||||
!tags.iter().any(|tag| self.tags_excluded.contains(tag))
|
!tags.iter().any(|tag| self.tags_excluded.contains(tag))
|
||||||
}) &&
|
}) &&
|
||||||
|
@ -542,13 +537,7 @@ impl TasksRelay {
|
||||||
}
|
}
|
||||||
"progress" => prog_string.clone(),
|
"progress" => prog_string.clone(),
|
||||||
|
|
||||||
"author" | "creator" => format!("{:.6}", self.get_username(&task.event.pubkey)), // FIXME temporary until proper column alignment
|
"author" => format!("{:.6}", self.get_username(&task.event.pubkey)), // FIXME temporary until proper column alignment
|
||||||
"prio" => task.priority_raw().map(|p| p.to_string()).unwrap_or_else(||
|
|
||||||
if self.priority.is_some() {
|
|
||||||
DEFAULT_PRIO.to_string().dimmed().to_string()
|
|
||||||
} else {
|
|
||||||
"".to_string()
|
|
||||||
}),
|
|
||||||
"path" => self.get_task_path(Some(task.event.id)),
|
"path" => self.get_task_path(Some(task.event.id)),
|
||||||
"rpath" => self.relative_path(task.event.id),
|
"rpath" => self.relative_path(task.event.id),
|
||||||
// TODO format strings configurable
|
// TODO format strings configurable
|
||||||
|
@ -885,7 +874,7 @@ impl TasksRelay {
|
||||||
pub(crate) fn make_task_with(&mut self, input: &str, tags: impl IntoIterator<Item=Tag>, set_state: bool) -> EventId {
|
pub(crate) fn make_task_with(&mut self, input: &str, tags: impl IntoIterator<Item=Tag>, set_state: bool) -> EventId {
|
||||||
let (input, input_tags) = extract_tags(input.trim());
|
let (input, input_tags) = extract_tags(input.trim());
|
||||||
let prio =
|
let prio =
|
||||||
if input_tags.iter().any(|t| t.kind().to_string() == PRIO) { None } else { self.priority.map(|p| to_prio_tag(p)) };
|
if input_tags.iter().find(|t| t.kind().to_string() == PRIO).is_some() { None } else { self.priority.map(|p| to_prio_tag(p)) };
|
||||||
let id = self.submit(
|
let id = self.submit(
|
||||||
build_task(&input, input_tags, None)
|
build_task(&input, input_tags, None)
|
||||||
.add_tags(self.tags.iter().cloned())
|
.add_tags(self.tags.iter().cloned())
|
||||||
|
|
Loading…
Add table
Reference in a new issue