Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions lib/Db/Card.php
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,20 @@ public function getCalendarObject(): VCalendar {
return $calendar;
}

public function getDaysUntilDue(): ?int {
$today = new DateTime();
$match_date = $this->getDuedate();
if ($match_date === null) {
return null;
}

$today->setTime(0, 0);
$match_date->setTime(0, 0);

$diff = $today->diff($match_date);
return (int) $diff->format('%R%a'); // Extract days count in interval
}

public function getCalendarPrefix(): string {
return 'card';
}
Expand Down
2 changes: 1 addition & 1 deletion lib/Db/RelationalEntity.php
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ public function resolveRelation($property, $resolver) {
}
}

public function __call($methodName, $args) {
public function __call(string $methodName, array $args) {
$attr = lcfirst(substr($methodName, 7));
if (array_key_exists($attr, $this->_resolvedProperties) && strpos($methodName, 'resolve') === 0) {
if ($this->_resolvedProperties[$attr] !== null) {
Expand Down
4 changes: 4 additions & 0 deletions lib/Model/BoardSummary.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@ public function jsonSerialize(): array {
];
}

protected function getter(string $name): mixed {
return $this->board->getter($name);
}

public function __call($name, $arguments) {
return $this->board->__call($name, $arguments);
}
Expand Down
41 changes: 20 additions & 21 deletions lib/Model/CardDetails.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
*/
namespace OCA\Deck\Model;

use DateTime;
use OCA\Deck\Db\Board;
use OCA\Deck\Db\Card;

Expand All @@ -41,6 +40,14 @@ public function setBoard(?Board $board): void {
}

public function jsonSerialize(array $extras = []): array {
$array = parent::jsonSerialize();
$array['overdue'] = $this->getDueStatus();

unset($array['notified']);
unset($array['descriptionPrev']);
unset($array['relatedStack']);
unset($array['relatedBoard']);

$array = $this->card->jsonSerialize();
unset($array['notified'], $array['descriptionPrev'], $array['relatedStack'], $array['relatedBoard']);

Expand All @@ -51,30 +58,18 @@ public function jsonSerialize(array $extras = []): array {
}

private function getDueStatus(): int {
$today = new DateTime();
$today->setTime(0, 0);

$match_date = $this->card->getDuedate();
if (!$match_date) {
return Card::DUEDATE_FUTURE;
$diffDays = $this->getDaysUntilDue();
if ($diffDays === null || $diffDays > 1) {
return static::DUEDATE_FUTURE;
}
$match_date->setTime(0, 0);

$diff = $today->diff($match_date);
$diffDays = (int) $diff->format('%R%a'); // Extract days count in interval


if ($diffDays === 1) {
return Card::DUEDATE_NEXT;
return static::DUEDATE_NEXT;
}
if ($diffDays === 0) {
return Card::DUEDATE_NOW;
}
if ($diffDays < 0) {
return Card::DUEDATE_OVERDUE;
return static::DUEDATE_NOW;
}

return Card::DUEDATE_FUTURE;
return static::DUEDATE_OVERDUE;
}

private function appendBoardDetails(&$array): void {
Expand All @@ -86,7 +81,11 @@ private function appendBoardDetails(&$array): void {
$array['board'] = (new BoardSummary($this->board))->jsonSerialize();
}

public function __call($name, $arguments) {
return $this->card->__call($name, $arguments);
protected function getter(string $name): mixed {
return $this->card->getter($name);
}

public function __call(string $methodName, array $args) {
return $this->card->__call($methodName, $args);
}
}
31 changes: 22 additions & 9 deletions lib/Service/OverviewService.php
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ public function findAllWithDue(string $userId): array {

public function findUpcomingCards(string $userId): array {
$userBoards = $this->boardMapper->findAllForUser($userId);
$foundCards = [];
$overview = [];
foreach ($userBoards as $userBoard) {
if (count($userBoard->getAcl()) === 0) {
// private board: get cards with due date
Expand All @@ -103,14 +103,27 @@ public function findUpcomingCards(string $userId): array {
$cards = $this->cardMapper->findToMeOrNotAssignedCards($userBoard->getId(), $userId);
}

$foundCards[] = array_map(
function (Card $card) use ($userBoard, $userId) {
$this->enrich($card, $userId);
return (new CardDetails($card, $userBoard))->jsonSerialize();
},
$cards
);
foreach ($cards as $card) {
$this->enrich($card, $userId);
$diffDays = $card->getDaysUntilDue();

$key = 'later';
if ($diffDays === null) {
$key = 'nodue';
} elseif ($diffDays < 0) {
$key = 'overdue';
} elseif ($diffDays === 0) {
$key = 'today';
} elseif ($diffDays === 1) {
$key = 'tomorrow';
} elseif ($diffDays <= 7) {
$key = 'nextSevenDays';
}

$card = (new CardDetails($card, $userBoard));
$overview[$key][] = $card->jsonSerialize();
}
}
return array_merge(...$foundCards);
return $overview;
}
}
63 changes: 7 additions & 56 deletions src/components/overview/Overview.vue
Original file line number Diff line number Diff line change
Expand Up @@ -31,44 +31,44 @@
</div>

<div v-else-if="isValidFilter" class="overview">
<div v-if="cardsByDueDate.overdue.length > 0" class="dashboard-column">
<div v-if="assignedCardsDashboard.length > 0" class="dashboard-column">
<h3>{{ t('deck', 'Overdue') }}</h3>
<div v-for="card in cardsByDueDate.overdue" :key="card.id">
<div v-for="card in assignedCardsDashboard.overdue" :key="card.id">
<CardItem :id="card.id" />
</div>
</div>

<div class="dashboard-column">
<h3>{{ t('deck', 'Today') }}</h3>
<div v-for="card in cardsByDueDate.today" :key="card.id">
<div v-for="card in assignedCardsDashboard.today" :key="card.id">
<CardItem :id="card.id" />
</div>
</div>

<div class="dashboard-column">
<h3>{{ t('deck', 'Tomorrow') }}</h3>
<div v-for="card in cardsByDueDate.tomorrow" :key="card.id">
<div v-for="card in assignedCardsDashboard.tomorrow" :key="card.id">
<CardItem :id="card.id" />
</div>
</div>

<div class="dashboard-column">
<h3>{{ t('deck', 'Next 7 days') }}</h3>
<div v-for="card in cardsByDueDate.nextSevenDays" :key="card.id">
<div v-for="card in assignedCardsDashboard.nextSevenDays" :key="card.id">
<CardItem :id="card.id" />
</div>
</div>

<div class="dashboard-column">
<h3>{{ t('deck', 'Later') }}</h3>
<div v-for="card in cardsByDueDate.later" :key="card.id">
<div v-for="card in assignedCardsDashboard.later" :key="card.id">
<CardItem :id="card.id" />
</div>
</div>

<div class="dashboard-column">
<h3>{{ t('deck', 'No due') }}</h3>
<div v-for="card in cardsByDueDate.nodue" :key="card.id">
<div v-for="card in assignedCardsDashboard.nodue" :key="card.id">
<CardItem :id="card.id" />
</div>
</div>
Expand All @@ -83,7 +83,6 @@
import Controls from '../Controls.vue'
import CardItem from '../cards/CardItem.vue'
import { mapGetters } from 'vuex'
import moment from '@nextcloud/moment'
import GlobalSearchResults from '../search/GlobalSearchResults.vue'

const FILTER_UPCOMING = 'upcoming'
Expand Down Expand Up @@ -125,13 +124,6 @@ export default {
...mapGetters([
'assignedCardsDashboard',
]),
cardsByDueDate() {
switch (this.filter) {
case FILTER_UPCOMING:
return this.groupByDue(this.assignedCardsDashboard)
}
return null
},
},
watch: {
'$route.params.filter'() {
Expand All @@ -153,47 +145,6 @@ export default {
}
this.loading = false
},

groupByDue(dataset) {
const all = {
nodue: [],
overdue: [],
today: [],
tomorrow: [],
nextSevenDays: [],
later: [],
}
dataset.forEach(card => {
if (card.duedate === null) {
all.nodue.push(card)
} else {
const hours = Math.floor(moment(card.duedate).diff(this.$root.time, 'seconds') / 60 / 60)
const d = new Date()
const currentHour = d.getHours()
if (hours < 0) {
all.overdue.push(card)
}
if (hours >= 0 && hours < (24 - currentHour)) {
all.today.push(card)
}
if (hours >= (24 - currentHour) && hours < (48 - currentHour)) {
all.tomorrow.push(card)
}
if (hours >= (48 - currentHour) && hours < (24 * 7)) {
all.nextSevenDays.push(card)
}
if (hours >= (24 * 7)) {
all.later.push(card)
}
}
})
Object.keys(all).forEach((list) => {
all[list] = all[list].sort((a, b) => {
return (new Date(a.duedate)).getTime() - (new Date(b.duedate)).getTime()
})
})
return all
},
},

}
Expand Down
12 changes: 7 additions & 5 deletions src/store/overview.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,14 @@ export default {
actions: {
async loadUpcoming({ commit }) {
commit('setCurrentBoard', null)
const assignedCards = await apiClient.get('upcoming')
const assignedCardsFlat = assignedCards.flat()
for (const i in assignedCardsFlat) {
commit('addCard', assignedCardsFlat[i])
const upcommingCards = await apiClient.get('upcoming')

for (const dueStatus in upcommingCards) {
for (const idx in upcommingCards[dueStatus]) {
commit('addCard', upcommingCards[dueStatus][idx])
}
}
commit('setAssignedCards', assignedCardsFlat)
commit('setAssignedCards', upcommingCards)
},
},
}
Loading