Compare commits
8 Commits
799f85cd4a
...
aed3537209
Author | SHA1 | Date |
---|---|---|
renovate | aed3537209 | |
kolaente | 21126793ab | |
kolaente | b057fb2784 | |
kolaente | 58c7da019d | |
kolaente | 70f48eaaca | |
kolaente | 6cc75928d8 | |
kolaente | dc360d4a18 | |
kolaente | 45ca0602f5 |
|
@ -562,7 +562,7 @@ describe('Task', () => {
|
|||
.click()
|
||||
|
||||
const today = new Date()
|
||||
const day = today.toLocaleString('default', {day: '2-digit'})
|
||||
const day = today.toLocaleString('default', {day: 'numeric'})
|
||||
const month = today.toLocaleString('default', {month: 'short'})
|
||||
const year = today.toLocaleString('default', {year: 'numeric'})
|
||||
const date = `${day} ${month} ${year}, 12:00:00`
|
||||
|
@ -605,7 +605,7 @@ describe('Task', () => {
|
|||
.click()
|
||||
|
||||
const today = new Date()
|
||||
const day = today.toLocaleString('default', {day: '2-digit'})
|
||||
const day = today.toLocaleString('default', {day: 'numeric'})
|
||||
const month = today.toLocaleString('default', {month: 'short'})
|
||||
const year = today.toLocaleString('default', {year: 'numeric'})
|
||||
const date = `${day} ${month} ${year}, 12:00:00`
|
||||
|
|
|
@ -53,8 +53,8 @@
|
|||
"@infectoone/vue-ganttastic": "2.2.0",
|
||||
"@intlify/unplugin-vue-i18n": "2.0.0",
|
||||
"@kyvg/vue3-notification": "3.1.3",
|
||||
"@sentry/tracing": "7.99.0",
|
||||
"@sentry/vue": "7.99.0",
|
||||
"@sentry/tracing": "7.100.0",
|
||||
"@sentry/vue": "7.100.0",
|
||||
"@tiptap/core": "2.2.1",
|
||||
"@tiptap/extension-blockquote": "2.2.1",
|
||||
"@tiptap/extension-bold": "2.2.1",
|
||||
|
|
106
pnpm-lock.yaml
106
pnpm-lock.yaml
|
@ -35,11 +35,11 @@ dependencies:
|
|||
specifier: 3.1.3
|
||||
version: 3.1.3(vue@3.4.15)
|
||||
'@sentry/tracing':
|
||||
specifier: 7.99.0
|
||||
version: 7.99.0
|
||||
specifier: 7.100.0
|
||||
version: 7.100.0
|
||||
'@sentry/vue':
|
||||
specifier: 7.99.0
|
||||
version: 7.99.0(vue@3.4.15)
|
||||
specifier: 7.100.0
|
||||
version: 7.100.0(vue@3.4.15)
|
||||
'@tiptap/core':
|
||||
specifier: 2.2.1
|
||||
version: 2.2.1(@tiptap/pm@2.2.1)
|
||||
|
@ -4232,45 +4232,45 @@ packages:
|
|||
resolution: {integrity: sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==}
|
||||
dev: true
|
||||
|
||||
/@sentry-internal/feedback@7.99.0:
|
||||
resolution: {integrity: sha512-exIO1o+bE0MW4z30FxC0cYzJ4ZHSMlDPMHCBDPzU+MWGQc/fb8s58QUrx5Dnm6HTh9G3H+YlroCxIo9u0GSwGQ==}
|
||||
/@sentry-internal/feedback@7.100.0:
|
||||
resolution: {integrity: sha512-SMW2QhNKOuSjw8oPtvryDlJjiwrNyAKljbgtMk057os/fd8QMp38Yt1ImqLCM4B2rTQZ6REJ6hRGRTRcfqoG+w==}
|
||||
engines: {node: '>=12'}
|
||||
dependencies:
|
||||
'@sentry/core': 7.99.0
|
||||
'@sentry/types': 7.99.0
|
||||
'@sentry/utils': 7.99.0
|
||||
'@sentry/core': 7.100.0
|
||||
'@sentry/types': 7.100.0
|
||||
'@sentry/utils': 7.100.0
|
||||
dev: false
|
||||
|
||||
/@sentry-internal/replay-canvas@7.99.0:
|
||||
resolution: {integrity: sha512-PoIkfusToDq0snfl2M6HJx/1KJYtXxYhQplrn11kYadO04SdG0XGXf4h7wBTMEQ7LDEAtQyvsOu4nEQtTO3YjQ==}
|
||||
/@sentry-internal/replay-canvas@7.100.0:
|
||||
resolution: {integrity: sha512-DePinj5IgNiC4RZv0yX0DLccMZebfFdKl3zHwDeLBeZqtMz9VrPzchv57IWP+5MI1+iuOn+WOg4oTNBUG6hFRw==}
|
||||
engines: {node: '>=12'}
|
||||
dependencies:
|
||||
'@sentry/core': 7.99.0
|
||||
'@sentry/replay': 7.99.0
|
||||
'@sentry/types': 7.99.0
|
||||
'@sentry/utils': 7.99.0
|
||||
'@sentry/core': 7.100.0
|
||||
'@sentry/replay': 7.100.0
|
||||
'@sentry/types': 7.100.0
|
||||
'@sentry/utils': 7.100.0
|
||||
dev: false
|
||||
|
||||
/@sentry-internal/tracing@7.99.0:
|
||||
resolution: {integrity: sha512-z3JQhHjoM1KdM20qrHwRClKJrNLr2CcKtCluq7xevLtXHJWNAQQbafnWD+Aoj85EWXBzKt9yJMv2ltcXJ+at+w==}
|
||||
/@sentry-internal/tracing@7.100.0:
|
||||
resolution: {integrity: sha512-qf4W1STXky9WOQYoPSw2AmCBDK4FzvAyq5yeD2sLU7OCUEfbRUcN0lQljUvmWRKv/jTIAyeU5icDLJPZuR50nA==}
|
||||
engines: {node: '>=8'}
|
||||
dependencies:
|
||||
'@sentry/core': 7.99.0
|
||||
'@sentry/types': 7.99.0
|
||||
'@sentry/utils': 7.99.0
|
||||
'@sentry/core': 7.100.0
|
||||
'@sentry/types': 7.100.0
|
||||
'@sentry/utils': 7.100.0
|
||||
dev: false
|
||||
|
||||
/@sentry/browser@7.99.0:
|
||||
resolution: {integrity: sha512-bgfoUv3wkwwLgN5YUOe0ibB3y268ZCnamZh6nLFqnY/UBKC1+FXWFdvzVON/XKUm62LF8wlpCybOf08ebNj2yg==}
|
||||
/@sentry/browser@7.100.0:
|
||||
resolution: {integrity: sha512-XpM0jEVe6DJWXjMSOjtJxsSNR/XnJKrlcuyoI4Re3qLG+noEF5QLc0r3VJkySXPRFnmdW05sLswQ6a/n9Sijmg==}
|
||||
engines: {node: '>=8'}
|
||||
dependencies:
|
||||
'@sentry-internal/feedback': 7.99.0
|
||||
'@sentry-internal/replay-canvas': 7.99.0
|
||||
'@sentry-internal/tracing': 7.99.0
|
||||
'@sentry/core': 7.99.0
|
||||
'@sentry/replay': 7.99.0
|
||||
'@sentry/types': 7.99.0
|
||||
'@sentry/utils': 7.99.0
|
||||
'@sentry-internal/feedback': 7.100.0
|
||||
'@sentry-internal/replay-canvas': 7.100.0
|
||||
'@sentry-internal/tracing': 7.100.0
|
||||
'@sentry/core': 7.100.0
|
||||
'@sentry/replay': 7.100.0
|
||||
'@sentry/types': 7.100.0
|
||||
'@sentry/utils': 7.100.0
|
||||
dev: false
|
||||
|
||||
/@sentry/cli@2.19.1:
|
||||
|
@ -4289,53 +4289,53 @@ packages:
|
|||
- supports-color
|
||||
dev: true
|
||||
|
||||
/@sentry/core@7.99.0:
|
||||
resolution: {integrity: sha512-vOAtzcAXEUtS/oW7wi3wMkZ3hsb5Ch96gKyrrj/mXdOp2zrcwdNV6N9/pawq2E9P/7Pw8AXw4CeDZztZrjQLuA==}
|
||||
/@sentry/core@7.100.0:
|
||||
resolution: {integrity: sha512-eWRPuP0Zdj4a2F7SybqNjf13LGOVgGwvW6sojweQp9oxGAfCPp/EMDGBhlpYbMJeLbzmqzJ4ZFHIedaiEC+7kg==}
|
||||
engines: {node: '>=8'}
|
||||
dependencies:
|
||||
'@sentry/types': 7.99.0
|
||||
'@sentry/utils': 7.99.0
|
||||
'@sentry/types': 7.100.0
|
||||
'@sentry/utils': 7.100.0
|
||||
dev: false
|
||||
|
||||
/@sentry/replay@7.99.0:
|
||||
resolution: {integrity: sha512-gyN/I2WpQrLAZDT+rScB/0jnFL2knEVBo8U8/OVt8gNP20Pq8T/rDZKO/TG0cBfvULDUbJj2P4CJryn2p/O2rA==}
|
||||
/@sentry/replay@7.100.0:
|
||||
resolution: {integrity: sha512-6Yo56J+x+eedaMXri8pPlFxXOofnSXVdsUuFj+kJ7lC/qHrwIbgC5g1ONEK/WlYwpVH4gA0aNnCa5AOkMu+ZTg==}
|
||||
engines: {node: '>=12'}
|
||||
dependencies:
|
||||
'@sentry-internal/tracing': 7.99.0
|
||||
'@sentry/core': 7.99.0
|
||||
'@sentry/types': 7.99.0
|
||||
'@sentry/utils': 7.99.0
|
||||
'@sentry-internal/tracing': 7.100.0
|
||||
'@sentry/core': 7.100.0
|
||||
'@sentry/types': 7.100.0
|
||||
'@sentry/utils': 7.100.0
|
||||
dev: false
|
||||
|
||||
/@sentry/tracing@7.99.0:
|
||||
resolution: {integrity: sha512-Cf622gSeamiSsi0JEj3PTXnq019OymaCrGf91x1d6OPyJ5jAXdlNuhw7NkqCEw8euIhhULuS81l5nGfBrgjj9Q==}
|
||||
/@sentry/tracing@7.100.0:
|
||||
resolution: {integrity: sha512-k8Zzmqu/11MRiMZO8s/d41pcfdR5FNm/sZXB0e+0EWsFlXCLl1vYd67sK0yyll7UzTFd4x8+XqXlsXEp+ulUuA==}
|
||||
engines: {node: '>=8'}
|
||||
dependencies:
|
||||
'@sentry-internal/tracing': 7.99.0
|
||||
'@sentry-internal/tracing': 7.100.0
|
||||
dev: false
|
||||
|
||||
/@sentry/types@7.99.0:
|
||||
resolution: {integrity: sha512-94qwOw4w40sAs5mCmzcGyj8ZUu/KhnWnuMZARRq96k+SjRW/tHFAOlIdnFSrt3BLPvSOK7R3bVAskZQ0N4FTmA==}
|
||||
/@sentry/types@7.100.0:
|
||||
resolution: {integrity: sha512-c+RHwZwpKeBk7h8sUX4nQcelxBz8ViCojifnbEe3tcn8O15HOLvZqRKgLLOiff3MoErxiv4oxs0sPbEFRm/IvA==}
|
||||
engines: {node: '>=8'}
|
||||
dev: false
|
||||
|
||||
/@sentry/utils@7.99.0:
|
||||
resolution: {integrity: sha512-cYZy5WNTkWs5GgggGnjfGqC44CWir0pAv4GVVSx0fsup4D4pMKBJPrtub15f9uC+QkUf3vVkqwpBqeFxtmJQTQ==}
|
||||
/@sentry/utils@7.100.0:
|
||||
resolution: {integrity: sha512-LAhZMEGq3C125prZN/ShqeXpRfdfgJkl9RAKjfq8cmMFsF7nsF72dEHZgIwrZ0lgNmtaWAB83AwJcyN83RwOxQ==}
|
||||
engines: {node: '>=8'}
|
||||
dependencies:
|
||||
'@sentry/types': 7.99.0
|
||||
'@sentry/types': 7.100.0
|
||||
dev: false
|
||||
|
||||
/@sentry/vue@7.99.0(vue@3.4.15):
|
||||
resolution: {integrity: sha512-yO/Ea7bMOUEuubSBLGYpzLg3Lh52+5yalp+y+45lpDPOIFFpn/D0/VfzDb6dxqUnauz3jmDVOikIWs5wD+rrMQ==}
|
||||
/@sentry/vue@7.100.0(vue@3.4.15):
|
||||
resolution: {integrity: sha512-qBx2vAgDFroh6wCoHgDgk5R0jTn+im/8G2Xs0SwkCiuZvvUikCd5ggZQLX3dIal0/y03GAKpcWLEtQXpwAgaqA==}
|
||||
engines: {node: '>=8'}
|
||||
peerDependencies:
|
||||
vue: 2.x || 3.x
|
||||
dependencies:
|
||||
'@sentry/browser': 7.99.0
|
||||
'@sentry/core': 7.99.0
|
||||
'@sentry/types': 7.99.0
|
||||
'@sentry/utils': 7.99.0
|
||||
'@sentry/browser': 7.100.0
|
||||
'@sentry/core': 7.100.0
|
||||
'@sentry/types': 7.100.0
|
||||
'@sentry/utils': 7.100.0
|
||||
vue: 3.4.15(typescript@5.3.3)
|
||||
dev: false
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
</span>
|
||||
<span
|
||||
v-if="project.id > 0"
|
||||
class="icon menu-item-icon handle lines-handle"
|
||||
class="icon menu-item-icon handle"
|
||||
:class="{'has-color-bubble': project.hexColor !== ''}"
|
||||
>
|
||||
<icon icon="grip-lines"/>
|
||||
|
|
|
@ -304,7 +304,6 @@ watch(
|
|||
)
|
||||
|
||||
const editor = useEditor({
|
||||
content: modelValue,
|
||||
editable: isEditing.value,
|
||||
extensions: [
|
||||
// Starterkit:
|
||||
|
@ -746,7 +745,7 @@ watch(
|
|||
height: auto;
|
||||
|
||||
&.ProseMirror-selectednode {
|
||||
outline: 3px solid #68cef8;
|
||||
outline: 3px solid var(--primary);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -156,6 +156,8 @@ async function markAllRead() {
|
|||
const notificationService = new NotificationService()
|
||||
await notificationService.markAllRead()
|
||||
success({message: t('notification.markAllReadSuccess')})
|
||||
|
||||
notifications.value.forEach(n => n.readAt = new Date())
|
||||
}
|
||||
</script>
|
||||
|
||||
|
|
|
@ -123,6 +123,23 @@ watch(
|
|||
|
||||
function transformTaskToGanttBar(t: ITask) {
|
||||
const black = 'var(--grey-800)'
|
||||
|
||||
const taskColor = getHexColor(t.hexColor)
|
||||
|
||||
let textColor = black
|
||||
let backgroundColor = 'var(--grey-100)'
|
||||
if(t.startDate) {
|
||||
backgroundColor = taskColor ?? ''
|
||||
if(typeof taskColor === 'undefined') {
|
||||
textColor = 'white'
|
||||
backgroundColor = 'var(--primary)'
|
||||
} else if(colorIsDark(taskColor)) {
|
||||
textColor = black
|
||||
} else {
|
||||
textColor = 'white'
|
||||
}
|
||||
}
|
||||
|
||||
return [{
|
||||
startDate: isoToKebabDate(t.startDate ? t.startDate.toISOString() : props.defaultTaskStartDate),
|
||||
endDate: isoToKebabDate(t.endDate ? t.endDate.toISOString() : props.defaultTaskEndDate),
|
||||
|
@ -131,8 +148,8 @@ function transformTaskToGanttBar(t: ITask) {
|
|||
label: t.title,
|
||||
hasHandles: true,
|
||||
style: {
|
||||
color: t.startDate ? (colorIsDark(getHexColor(t.hexColor)) ? black : 'white') : black,
|
||||
backgroundColor: t.startDate ? getHexColor(t.hexColor) : 'var(--grey-100)',
|
||||
color: textColor,
|
||||
backgroundColor,
|
||||
border: t.startDate ? '' : '2px dashed var(--grey-300)',
|
||||
'text-decoration': t.done ? 'line-through' : null,
|
||||
},
|
||||
|
|
|
@ -4,10 +4,10 @@
|
|||
:class="{
|
||||
'is-loading': loadingInternal || loading,
|
||||
'draggable': !(loadingInternal || loading),
|
||||
'has-light-text': color !== TASK_DEFAULT_COLOR && !colorIsDark(color),
|
||||
'has-custom-background-color': color !== TASK_DEFAULT_COLOR ? color : undefined,
|
||||
'has-light-text': !colorIsDark(color),
|
||||
'has-custom-background-color': color ?? undefined,
|
||||
}"
|
||||
:style="{'background-color': color !== TASK_DEFAULT_COLOR ? color : undefined}"
|
||||
:style="{'background-color': color ?? undefined}"
|
||||
@click.exact="openTaskDetail()"
|
||||
@click.ctrl="() => toggleTaskDone(task)"
|
||||
@click.meta="() => toggleTaskDone(task)"
|
||||
|
@ -83,7 +83,7 @@ import Done from '@/components/misc/Done.vue'
|
|||
import Labels from '@/components/tasks/partials/labels.vue'
|
||||
import ChecklistSummary from './checklist-summary.vue'
|
||||
|
||||
import {TASK_DEFAULT_COLOR, getHexColor} from '@/models/task'
|
||||
import {getHexColor} from '@/models/task'
|
||||
import type {ITask} from '@/modelTypes/ITask'
|
||||
import {SUPPORTED_IMAGE_SUFFIX} from '@/models/attachment'
|
||||
import AttachmentService from '@/services/attachment'
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
<DatepickerInline
|
||||
v-if="activeForm === 'absolute'"
|
||||
v-model="reminderDate"
|
||||
@update:modelValue="setReminderDate(close)"
|
||||
@update:modelValue="setReminderDateAndClose(close)"
|
||||
/>
|
||||
|
||||
<x-button
|
||||
|
@ -105,7 +105,7 @@ const presets = computed<TaskReminderModel[]>(() => [
|
|||
{reminder: null, relativePeriod: -1 * SECONDS_A_DAY * 7, relativeTo: defaultRelativeTo},
|
||||
{reminder: null, relativePeriod: -1 * SECONDS_A_DAY * 30, relativeTo: defaultRelativeTo},
|
||||
])
|
||||
const reminderDate = ref(null)
|
||||
const reminderDate = ref<Date|null>(null)
|
||||
|
||||
type availableForms = null | 'relative' | 'absolute'
|
||||
|
||||
|
@ -135,7 +135,17 @@ const reminderText = computed(() => {
|
|||
watch(
|
||||
() => modelValue,
|
||||
(newReminder) => {
|
||||
reminder.value = newReminder || new TaskReminderModel()
|
||||
if(newReminder) {
|
||||
reminder.value = newReminder
|
||||
|
||||
if(newReminder.relativeTo === null) {
|
||||
reminderDate.value = new Date(newReminder.reminder)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
reminder.value = new TaskReminderModel()
|
||||
},
|
||||
{immediate: true},
|
||||
)
|
||||
|
@ -148,7 +158,7 @@ function updateData() {
|
|||
}
|
||||
}
|
||||
|
||||
function setReminderDate(close) {
|
||||
function setReminderDateAndClose(close) {
|
||||
reminder.value.reminder = reminderDate.value === null
|
||||
? null
|
||||
: new Date(reminderDate.value)
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<div>
|
||||
<div
|
||||
:class="{'is-loading': taskService.loading}"
|
||||
class="task loader-container"
|
||||
class="task loader-container single-task"
|
||||
@mouseup.stop.self="openTaskDetail"
|
||||
@mousedown.stop.self="focusTaskLink"
|
||||
ref="taskContainerRef"
|
||||
|
@ -435,21 +435,12 @@ function focusTaskLink() {
|
|||
}
|
||||
}
|
||||
|
||||
.handle {
|
||||
opacity: 1;
|
||||
transition: opacity $transition;
|
||||
margin-right: .25rem;
|
||||
cursor: grab;
|
||||
}
|
||||
|
||||
@media(hover: hover) and (pointer: fine) {
|
||||
& .favorite,
|
||||
& .handle {
|
||||
& .favorite {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
&:hover .favorite,
|
||||
&:hover .handle {
|
||||
&:hover .favorite {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,11 +23,9 @@ import type {ITaskReminder} from '@/modelTypes/ITaskReminder'
|
|||
import TaskReminderModel from '@/models/taskReminder'
|
||||
import {secondsToPeriod} from '@/helpers/time/period'
|
||||
|
||||
export const TASK_DEFAULT_COLOR = '#1973ff'
|
||||
|
||||
export function getHexColor(hexColor: string): string {
|
||||
export function getHexColor(hexColor: string): string | undefined {
|
||||
if (hexColor === '' || hexColor === '#') {
|
||||
return TASK_DEFAULT_COLOR
|
||||
return undefined
|
||||
}
|
||||
|
||||
return hexColor
|
||||
|
|
|
@ -333,4 +333,23 @@ function prepareFiltersAndLoadTasks() {
|
|||
.control.has-icons-right .icon {
|
||||
transition: all $transition;
|
||||
}
|
||||
|
||||
:deep(.single-task) {
|
||||
.handle {
|
||||
opacity: 1;
|
||||
transition: opacity $transition;
|
||||
margin-right: .25rem;
|
||||
cursor: grab;
|
||||
}
|
||||
|
||||
@media(hover: hover) and (pointer: fine) {
|
||||
& .handle {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
&:hover .handle {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -472,7 +472,7 @@ import {klona} from 'klona/lite'
|
|||
import {eventToHotkeyString} from '@github/hotkey'
|
||||
|
||||
import TaskService from '@/services/task'
|
||||
import TaskModel, {TASK_DEFAULT_COLOR} from '@/models/task'
|
||||
import TaskModel from '@/models/task'
|
||||
|
||||
import type {ITask} from '@/modelTypes/ITask'
|
||||
import type {IProject} from '@/modelTypes/IProject'
|
||||
|
@ -582,9 +582,7 @@ const color = computed(() => {
|
|||
? task.value.getHexColor()
|
||||
: undefined
|
||||
|
||||
return color === TASK_DEFAULT_COLOR
|
||||
? ''
|
||||
: color
|
||||
return color
|
||||
})
|
||||
|
||||
const hasAttachments = computed(() => attachmentStore.attachments.length > 0)
|
||||
|
|
Reference in New Issue