Compare commits

..

No commits in common. "561fd9e1e58ac0e68c974b123c9d9002f34dfe39" and "5294d9081fe1587d2097e20942ad160079e5cc7c" have entirely different histories.

2 changed files with 6 additions and 32 deletions

View file

@ -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(" ")),

View file

@ -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())