Compare commits

...

14 Commits

Author SHA1 Message Date
SngAbc
b98caf1370
Merge a81e8adde78e4d608b40d417fdafd2ca3005bdcc into 64662d5215ea01f6634fd72b5ff7a77dbc7e9e7d 2025-12-01 14:34:16 +00:00
Adorian Doran
64662d5215 Merge branch 'main' of https://github.com/TriliumNext/Trilium
Some checks are pending
Checks / main (push) Waiting to run
CodeQL Advanced / Analyze (actions) (push) Waiting to run
CodeQL Advanced / Analyze (javascript-typescript) (push) Waiting to run
Deploy Documentation / Build and Deploy Documentation (push) Waiting to run
Dev / Test development (push) Waiting to run
Dev / Build Docker image (push) Blocked by required conditions
Dev / Check Docker build (Dockerfile) (push) Blocked by required conditions
Dev / Check Docker build (Dockerfile.alpine) (push) Blocked by required conditions
/ Check Docker build (Dockerfile) (push) Waiting to run
/ Check Docker build (Dockerfile.alpine) (push) Waiting to run
/ Build Docker images (Dockerfile, ubuntu-24.04-arm, linux/arm64) (push) Blocked by required conditions
/ Build Docker images (Dockerfile.alpine, ubuntu-latest, linux/amd64) (push) Blocked by required conditions
/ Build Docker images (Dockerfile.legacy, ubuntu-24.04-arm, linux/arm/v7) (push) Blocked by required conditions
/ Build Docker images (Dockerfile.legacy, ubuntu-24.04-arm, linux/arm/v8) (push) Blocked by required conditions
/ Merge manifest lists (push) Blocked by required conditions
playwright / E2E tests on linux-arm64 (push) Waiting to run
playwright / E2E tests on linux-x64 (push) Waiting to run
2025-12-01 16:33:41 +02:00
Adorian Doran
31cedad976 documentation: mark "calendar:color" as deprecated 2025-12-01 16:33:31 +02:00
Elian Doran
12ac5147d3
Merge branch 'main' of github.com:TriliumNext/Trilium 2025-12-01 14:40:25 +02:00
Elian Doran
17291ff61d
chore(deps): remove unnecessary package 2025-12-01 14:34:55 +02:00
Adorian Doran
f3e334470e style: refactor 2025-12-01 14:27:49 +02:00
Adorian Doran
9407051f1e style: refactor 2025-12-01 14:24:13 +02:00
Adorian Doran
08a6d36153 style/calendar collection/list view: use separate style for the archived events 2025-12-01 14:13:23 +02:00
Adorian Doran
f906fb9b4c Merge branch 'main' of https://github.com/TriliumNext/Trilium 2025-12-01 14:08:32 +02:00
Adorian Doran
b4a6356724 style/calendar collection/list view: fix dot colors 2025-12-01 14:08:24 +02:00
SiriusXT
a81e8adde7 client/pageurl: adjust Info bar order
Some checks failed
Checks / main (push) Has been cancelled
2025-11-14 20:22:51 +08:00
SiriusXT
5aec9229d4 chore: remove unnecessary console.log 2025-11-14 18:16:59 +08:00
SiriusXT
0c954322e4 i18n: remove unused translation note_properties.info 2025-11-14 18:08:20 +08:00
SiriusXT
9580d636cf client/pageurl: migrate note origin to info bar 2025-11-14 17:20:35 +08:00
23 changed files with 218 additions and 1249 deletions

View File

@ -30,6 +30,7 @@ import ScrollingContainer from "../widgets/containers/scrolling_container.js";
import ScrollPadding from "../widgets/scroll_padding.js"; import ScrollPadding from "../widgets/scroll_padding.js";
import SearchResult from "../widgets/search_result.jsx"; import SearchResult from "../widgets/search_result.jsx";
import SharedInfo from "../widgets/shared_info.jsx"; import SharedInfo from "../widgets/shared_info.jsx";
import OriginInfo from "../widgets/note_origin.jsx";
import SpacerWidget from "../widgets/spacer.js"; import SpacerWidget from "../widgets/spacer.js";
import SplitNoteContainer from "../widgets/containers/split_note_container.js"; import SplitNoteContainer from "../widgets/containers/split_note_container.js";
import SqlResults from "../widgets/sql_result.js"; import SqlResults from "../widgets/sql_result.js";
@ -139,6 +140,7 @@ export default class DesktopLayout {
.filling() .filling()
.child(new ContentHeader() .child(new ContentHeader()
.child(<ReadOnlyNoteInfoBar />) .child(<ReadOnlyNoteInfoBar />)
.child(<OriginInfo />)
.child(<SharedInfo />) .child(<SharedInfo />)
) )
.child(<PromotedAttributes />) .child(<PromotedAttributes />)

View File

@ -511,7 +511,7 @@
"title": "الملاحظات المعدلة" "title": "الملاحظات المعدلة"
}, },
"note_properties": { "note_properties": {
"info": "معلومات" "this_note_was_originally_taken_from": ""
}, },
"backend_log": { "backend_log": {
"refresh": "تحديث" "refresh": "تحديث"

View File

@ -841,8 +841,7 @@
"search": "搜索" "search": "搜索"
}, },
"note_properties": { "note_properties": {
"this_note_was_originally_taken_from": "笔记来源:", "this_note_was_originally_taken_from": "笔记来源:"
"info": "信息"
}, },
"owned_attribute_list": { "owned_attribute_list": {
"owned_attributes": "拥有的属性" "owned_attributes": "拥有的属性"

View File

@ -837,8 +837,7 @@
"search": "Suchen" "search": "Suchen"
}, },
"note_properties": { "note_properties": {
"this_note_was_originally_taken_from": "Diese Notiz stammt ursprünglich aus:", "this_note_was_originally_taken_from": "Diese Notiz stammt ursprünglich aus:"
"info": "Info"
}, },
"owned_attribute_list": { "owned_attribute_list": {
"owned_attributes": "Eigene Attribute" "owned_attributes": "Eigene Attribute"

View File

@ -841,8 +841,7 @@
"search": "Search" "search": "Search"
}, },
"note_properties": { "note_properties": {
"this_note_was_originally_taken_from": "This note was originally taken from:", "this_note_was_originally_taken_from": "This note was originally taken from:"
"info": "Info"
}, },
"owned_attribute_list": { "owned_attribute_list": {
"owned_attributes": "Owned Attributes" "owned_attributes": "Owned Attributes"

View File

@ -840,8 +840,7 @@
"search": "Buscar" "search": "Buscar"
}, },
"note_properties": { "note_properties": {
"this_note_was_originally_taken_from": "Esta nota fue tomada originalmente de:", "this_note_was_originally_taken_from": "Esta nota fue tomada originalmente de:"
"info": "Información"
}, },
"owned_attribute_list": { "owned_attribute_list": {
"owned_attributes": "Atributos propios" "owned_attributes": "Atributos propios"

View File

@ -834,8 +834,7 @@
"search": "Recherche" "search": "Recherche"
}, },
"note_properties": { "note_properties": {
"this_note_was_originally_taken_from": "Cette note est initialement extraite de :", "this_note_was_originally_taken_from": "Cette note est initialement extraite de :"
"info": "Infos"
}, },
"owned_attribute_list": { "owned_attribute_list": {
"owned_attributes": "Attributs propres" "owned_attributes": "Attributs propres"

View File

@ -1409,8 +1409,7 @@
"search": "Ricerca" "search": "Ricerca"
}, },
"note_properties": { "note_properties": {
"this_note_was_originally_taken_from": "Questa nota è stata originariamente tratta da:", "this_note_was_originally_taken_from": "Questa nota è stata originariamente tratta da:"
"info": "Informazioni"
}, },
"owned_attribute_list": { "owned_attribute_list": {
"owned_attributes": "Attributi posseduti" "owned_attributes": "Attributi posseduti"

View File

@ -693,7 +693,6 @@
"outside_hoisted": "このパスはホイストされたノートの外側にあるため、ホイストを解除する必要があります。" "outside_hoisted": "このパスはホイストされたノートの外側にあるため、ホイストを解除する必要があります。"
}, },
"note_properties": { "note_properties": {
"info": "情報",
"this_note_was_originally_taken_from": "このノートは元々以下から引用したものです:" "this_note_was_originally_taken_from": "このノートは元々以下から引用したものです:"
}, },
"similar_notes": { "similar_notes": {

View File

@ -447,8 +447,7 @@
"search": "Szukaj" "search": "Szukaj"
}, },
"note_properties": { "note_properties": {
"this_note_was_originally_taken_from": "Ta notatka oryginalnie została wzięta z:", "this_note_was_originally_taken_from": "Ta notatka oryginalnie została wzięta z:"
"info": "Info"
}, },
"owned_attribute_list": { "owned_attribute_list": {
"owned_attributes": "Posiadane atrybuty" "owned_attributes": "Posiadane atrybuty"

View File

@ -809,8 +809,7 @@
"search": "Pesquisar" "search": "Pesquisar"
}, },
"note_properties": { "note_properties": {
"this_note_was_originally_taken_from": "Esta nota foi originalmente obtida de:", "this_note_was_originally_taken_from": "Esta nota foi originalmente obtida de:"
"info": "Informações"
}, },
"owned_attribute_list": { "owned_attribute_list": {
"owned_attributes": "Atributos próprios" "owned_attributes": "Atributos próprios"

View File

@ -1075,8 +1075,7 @@
"outside_hoisted": "Este caminho está fora de uma nota fixada e você teria que desafixar." "outside_hoisted": "Este caminho está fora de uma nota fixada e você teria que desafixar."
}, },
"note_properties": { "note_properties": {
"this_note_was_originally_taken_from": "Esta nota foi originalmente obtida de:", "this_note_was_originally_taken_from": "Esta nota foi originalmente obtida de:"
"info": "Informações"
}, },
"promoted_attributes": { "promoted_attributes": {
"promoted_attributes": "Atributos Promovidos", "promoted_attributes": "Atributos Promovidos",

View File

@ -910,7 +910,6 @@
"title": "Căile notiței" "title": "Căile notiței"
}, },
"note_properties": { "note_properties": {
"info": "Informații",
"this_note_was_originally_taken_from": "Această notiță a fost preluată original de la:" "this_note_was_originally_taken_from": "Această notiță a fost preluată original de la:"
}, },
"note_type_chooser": { "note_type_chooser": {

View File

@ -1066,7 +1066,6 @@
"archived": "Архивировано" "archived": "Архивировано"
}, },
"note_properties": { "note_properties": {
"info": "Информация",
"this_note_was_originally_taken_from": "Эта заметка была первоначально взята из:" "this_note_was_originally_taken_from": "Эта заметка была первоначально взята из:"
}, },
"promoted_attributes": { "promoted_attributes": {

View File

@ -838,8 +838,7 @@
"search": "搜尋" "search": "搜尋"
}, },
"note_properties": { "note_properties": {
"this_note_was_originally_taken_from": "筆記來源:", "this_note_was_originally_taken_from": "筆記來源:"
"info": "資訊"
}, },
"owned_attribute_list": { "owned_attribute_list": {
"owned_attributes": "自有屬性" "owned_attributes": "自有屬性"

View File

@ -938,8 +938,7 @@
"outside_hoisted": "Цей шлях знаходиться поза межами закріпленої нотатки і вам доведеться відкріпити." "outside_hoisted": "Цей шлях знаходиться поза межами закріпленої нотатки і вам доведеться відкріпити."
}, },
"note_properties": { "note_properties": {
"this_note_was_originally_taken_from": "Цю нотатку було спочатку взято з:", "this_note_was_originally_taken_from": "Цю нотатку було спочатку взято з:"
"info": "Інформація"
}, },
"owned_attribute_list": { "owned_attribute_list": {
"owned_attributes": "Власні Атрибути" "owned_attributes": "Власні Атрибути"

View File

@ -49,30 +49,6 @@
z-index: 50; z-index: 50;
} }
.calendar-container a.fc-event {
text-decoration: none;
}
.calendar-container a.fc-event.archived {
opacity: .65;
}
.calendar-container a.fc-event.archived::after {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: -1;
--c1: transparent;
--c2: var(--callendar-coll-event-archived-sripe-color);
background: repeating-linear-gradient(45deg, var(--c1), var(--c1) 8px,
var(--c2) 8px, var(--c2) 16px) !important;
}
.calendar-container .fc-button { .calendar-container .fc-button {
padding: 0.2em 0.5em; padding: 0.2em 0.5em;
} }
@ -113,15 +89,38 @@ body.desktop:not(.zen) .calendar-view .calendar-header {
/* #region Events */ /* #region Events */
.calendar-view a.fc-timegrid-event, /*
.calendar-view a.fc-daygrid-event, * week, month, year views
.fc-daygrid-dot-event .fc-event-title { */
font-weight: 500;
.calendar-container a.fc-event {
text-decoration: none;
} }
.calendar-view a.fc-timegrid-event:focus-visible, .calendar-container a.fc-event.archived {
.calendar-view a.fc-daygrid-event:focus-visible { opacity: .65;
outline: none; }
.calendar-container a.fc-event.archived::after {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: -1;
--c1: transparent;
--c2: var(--callendar-coll-event-archived-sripe-color);
background: repeating-linear-gradient(45deg, var(--c1), var(--c1) 8px,
var(--c2) 8px, var(--c2) 16px);
}
.calendar-view a.fc-timegrid-event,
.calendar-view a.fc-daygrid-event,
.calendar-view .fc-daygrid-dot-event .fc-event-title {
font-weight: 500;
} }
.calendar-view a.fc-timegrid-event, .calendar-view a.fc-timegrid-event,
@ -137,6 +136,20 @@ body.desktop:not(.zen) .calendar-view .calendar-header {
padding-left: 8px; padding-left: 8px;
} }
.calendar-view .fc-timegrid-event.with-hue,
.calendar-view .fc-daygrid-event.with-hue {
--fc-event-text-color: var(--custom-color);
--fc-event-bg-color: hsl(var(--custom-color-hue),
var(--calendar-coll-event-background-saturation),
var(--calendar-coll-event-background-lightness)) !important;
}
.calendar-view a.fc-timegrid-event:focus-visible,
.calendar-view a.fc-daygrid-event:focus-visible {
outline: none;
}
.calendar-view a.fc-timegrid-event.fc-event-selected, .calendar-view a.fc-timegrid-event.fc-event-selected,
.calendar-view a.fc-timegrid-event.fc-event:focus, .calendar-view a.fc-timegrid-event.fc-event:focus,
.calendar-view a.fc-daygrid-event.fc-event-selected, .calendar-view a.fc-daygrid-event.fc-event-selected,
@ -153,21 +166,26 @@ body.desktop:not(.zen) .calendar-view .calendar-header {
opacity: 1; opacity: 1;
} }
.calendar-view .fc-timegrid-event.with-hue, .calendar-view .fc-daygrid-event-dot {
.calendar-view .fc-daygrid-event.with-hue { display: none;
--fc-event-text-color: var(--custom-color);
--fc-event-bg-color: hsl(var(--custom-color-hue),
var(--calendar-coll-event-background-saturation),
var(--calendar-coll-event-background-lightness)) !important;
} }
.calendar-view .fc-event-time { .calendar-view .fc-event-time {
opacity: .75; opacity: .75;
} }
.fc-daygrid-event-dot { /*
display: none; * List view
*/
.fc-list-table tr.fc-event.archived {
opacity: .5;
}
.fc-list-table .fc-list-event-dot {
/* Apply note colors to the list item dots */
--fc-event-border-color: var(--custom-color);
} }
/* #endregion */ /* #endregion */

View File

@ -0,0 +1,43 @@
import { t } from "../services/i18n";
import { useNoteContext, useTriliumEvent, useTriliumOption } from "./react/hooks";
import { useEffect, useState } from "preact/hooks";
import attributes from "../services/attributes";
import InfoBar from "./react/InfoBar";
import RawHtml from "./react/RawHtml";
import FNote from "../entities/fnote";
export default function OriginInfo() {
const { note } = useNoteContext();
const [link, setLink] = useState<string>();
function refresh() {
if (!note) return;
const pageUrl = getPageUrl(note);
if (!pageUrl) {
setLink(undefined);
return;
}
setLink(`<a href="${pageUrl}" class="external tn-link">${pageUrl}</a>`);
}
useEffect(refresh, [note]);
useTriliumEvent("entitiesReloaded", ({ loadResults }) => {
if (loadResults.getAttributeRows().find((attr) => attr.type === "label" && attr.name?.toString() === "pageUrl" && attributes.isAffecting(attr, note))) {
refresh();
}
});
return (
<InfoBar className="origin-info-widget" type="subtle" style={{ display: (!link) ? "none" : undefined }}>
{link && (
<RawHtml
html={`${t("note_properties.this_note_was_originally_taken_from")} ${link}`}
/>
)}
</InfoBar>
)
}
function getPageUrl(note: FNote) {
return note.getOwnedLabelValue("pageUrl");
}

View File

@ -1,20 +0,0 @@
import { t } from "../../services/i18n";
import { useNoteLabel } from "../react/hooks";
import { TabContext } from "./ribbon-interface";
/**
* TODO: figure out better name or conceptualize better.
*/
export default function NotePropertiesTab({ note }: TabContext) {
const [ pageUrl ] = useNoteLabel(note, "pageUrl");
return (
<div className="note-properties-widget" style={{ padding: "12px", color: "var(--muted-text-color)" }}>
{ pageUrl && (
<div style={{ overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}>
{t("note_properties.this_note_was_originally_taken_from")} <a href={pageUrl} class="page-url external">{pageUrl}</a>
</div>
)}
</div>
)
}

View File

@ -1,6 +1,5 @@
import ScriptTab from "./ScriptTab"; import ScriptTab from "./ScriptTab";
import EditedNotesTab from "./EditedNotesTab"; import EditedNotesTab from "./EditedNotesTab";
import NotePropertiesTab from "./NotePropertiesTab";
import NoteInfoTab from "./NoteInfoTab"; import NoteInfoTab from "./NoteInfoTab";
import SimilarNotesTab from "./SimilarNotesTab"; import SimilarNotesTab from "./SimilarNotesTab";
import FilePropertiesTab from "./FilePropertiesTab"; import FilePropertiesTab from "./FilePropertiesTab";
@ -59,13 +58,6 @@ export const RIBBON_TAB_DEFINITIONS: TabConfiguration[] = [
show: ({ note }) => note?.type === "book" || note?.type === "search", show: ({ note }) => note?.type === "book" || note?.type === "search",
toggleCommand: "toggleRibbonTabBookProperties" toggleCommand: "toggleRibbonTabBookProperties"
}, },
{
title: t("note_properties.info"),
icon: "bx bx-info-square",
content: NotePropertiesTab,
show: ({ note }) => !!note?.getLabelValue("pageUrl"),
activate: true
},
{ {
title: t("file_properties.title"), title: t("file_properties.title"),
icon: "bx bx-file", icon: "bx bx-file",

View File

@ -63,7 +63,7 @@ For each note of the calendar, the following attributes can be used:
| `#startTime` | The time the event starts at. If this value is missing, then the event is considered a full-day event. The format is `HH:MM` (hours in 24-hour format and minutes). | | `#startTime` | The time the event starts at. If this value is missing, then the event is considered a full-day event. The format is `HH:MM` (hours in 24-hour format and minutes). |
| `#endTime` | Similar to `startTime`, it mentions the time at which the event ends (in relation with `endDate` if present, or `startDate`). | | `#endTime` | Similar to `startTime`, it mentions the time at which the event ends (in relation with `endDate` if present, or `startDate`). |
| `#color` | Displays the event with a specified color (named such as `red`, `gray` or hex such as `#FF0000`). This will also change the color of the note in other places such as the note tree. | | `#color` | Displays the event with a specified color (named such as `red`, `gray` or hex such as `#FF0000`). This will also change the color of the note in other places such as the note tree. |
| `#calendar:color` | Similar to `#color`, but applies the color only for the event in the calendar and not for other places such as the note tree. | | `#calendar:color` | Similar to `#color`, but applies the color only for the event in the calendar and not for other places such as the note tree. (*Deprecated*) |
| `#iconClass` | If present, the icon of the note will be displayed to the left of the event title. | | `#iconClass` | If present, the icon of the note will be displayed to the left of the event title. |
| `#calendar:title` | Changes the title of an event to point to an attribute of the note other than the title, can either a label or a relation (without the `#` or `~` symbol). See _Use-cases_ for more information. | | `#calendar:title` | Changes the title of an event to point to an attribute of the note other than the title, can either a label or a relation (without the `#` or `~` symbol). See _Use-cases_ for more information. |
| `#calendar:displayedAttributes` | Allows displaying the value of one or more attributes in the calendar like this:     <br> <br>![](9_Calendar_image.png)    <br> <br>`#weight="70" #Mood="Good" #calendar:displayedAttributes="weight,Mood"`   <br> <br>It can also be used with relations, case in which it will display the title of the target note:    <br> <br>`~assignee=@My assignee #calendar:displayedAttributes="assignee"` | | `#calendar:displayedAttributes` | Allows displaying the value of one or more attributes in the calendar like this:     <br> <br>![](9_Calendar_image.png)    <br> <br>`#weight="70" #Mood="Good" #calendar:displayedAttributes="weight,Mood"`   <br> <br>It can also be used with relations, case in which it will display the title of the target note:    <br> <br>`~assignee=@My assignee #calendar:displayedAttributes="assignee"` |

View File

@ -25,7 +25,6 @@
], ],
"devDependencies": { "devDependencies": {
"@ckeditor/ckeditor5-dev-build-tools": "43.1.0", "@ckeditor/ckeditor5-dev-build-tools": "43.1.0",
"@ckeditor/ckeditor5-dev-utils": "43.1.0",
"@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-inspector": ">=4.1.0",
"@ckeditor/ckeditor5-package-tools": "5.0.1", "@ckeditor/ckeditor5-package-tools": "5.0.1",
"@typescript-eslint/eslint-plugin": "~8.48.0", "@typescript-eslint/eslint-plugin": "~8.48.0",

1255
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff