mirror of
https://github.com/zadam/trilium.git
synced 2025-10-20 15:19:01 +02:00
chore(react/ribbon): port inherited attributes partially
This commit is contained in:
parent
9f217b88e4
commit
bc4378cb3e
56
apps/client/src/widgets/ribbon/InheritedAttributesTab.tsx
Normal file
56
apps/client/src/widgets/ribbon/InheritedAttributesTab.tsx
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
import { useEffect, useState } from "preact/hooks";
|
||||||
|
import { TabContext } from "./ribbon-interface";
|
||||||
|
import FAttribute from "../../entities/fattribute";
|
||||||
|
import { useTriliumEventBeta } from "../react/hooks";
|
||||||
|
import attributes from "../../services/attributes";
|
||||||
|
import { t } from "../../services/i18n";
|
||||||
|
import attribute_renderer from "../../services/attribute_renderer";
|
||||||
|
import RawHtml from "../react/RawHtml";
|
||||||
|
import { joinElements } from "../react/react_utils";
|
||||||
|
|
||||||
|
export default function InheritedAttributesTab({ note, componentId }: TabContext) {
|
||||||
|
const [ inheritedAttributes, setInheritedAttributes ] = useState<FAttribute[]>();
|
||||||
|
|
||||||
|
function refresh() {
|
||||||
|
const attrs = note.getAttributes().filter((attr) => attr.noteId !== this.noteId);
|
||||||
|
attrs.sort((a, b) => {
|
||||||
|
if (a.noteId === b.noteId) {
|
||||||
|
return a.position - b.position;
|
||||||
|
} else {
|
||||||
|
// inherited attributes should stay grouped: https://github.com/zadam/trilium/issues/3761
|
||||||
|
return a.noteId < b.noteId ? -1 : 1;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
setInheritedAttributes(attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
useEffect(refresh, [ note ]);
|
||||||
|
useTriliumEventBeta("entitiesReloaded", ({ loadResults }) => {
|
||||||
|
if (loadResults.getAttributeRows(componentId).find((attr) => attributes.isAffecting(attr, this.note))) {
|
||||||
|
this.refresh();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="inherited-attributes-widget">
|
||||||
|
<div className="inherited-attributes-container">
|
||||||
|
{inheritedAttributes?.length > 0 ? (
|
||||||
|
joinElements(inheritedAttributes.map(attribute => (
|
||||||
|
<InheritedAttribute attribute={attribute} />
|
||||||
|
)), " ")
|
||||||
|
) : (
|
||||||
|
<>{t("inherited_attribute_list.no_inherited_attributes")}</>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
function InheritedAttribute({ attribute }: { attribute: FAttribute }) {
|
||||||
|
const [ html, setHtml ] = useState<JQuery<HTMLElement> | string>("");
|
||||||
|
useEffect(() => {
|
||||||
|
attribute_renderer.renderAttribute(attribute, false).then(setHtml);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return <RawHtml html={html} />
|
||||||
|
}
|
@ -20,6 +20,7 @@ import ImagePropertiesTab from "./ImagePropertiesTab";
|
|||||||
import NotePathsTab from "./NotePathsTab";
|
import NotePathsTab from "./NotePathsTab";
|
||||||
import NoteMapTab from "./NoteMapTab";
|
import NoteMapTab from "./NoteMapTab";
|
||||||
import OwnedAttributesTab from "./OwnedAttributesTab";
|
import OwnedAttributesTab from "./OwnedAttributesTab";
|
||||||
|
import InheritedAttributesTab from "./InheritedAttributesTab";
|
||||||
|
|
||||||
interface TitleContext {
|
interface TitleContext {
|
||||||
note: FNote | null | undefined;
|
note: FNote | null | undefined;
|
||||||
@ -113,9 +114,11 @@ const TAB_CONFIGURATION = numberObjectsInPlace<TabConfiguration>([
|
|||||||
toggleCommand: "toggleRibbonTabOwnedAttributes"
|
toggleCommand: "toggleRibbonTabOwnedAttributes"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// InheritedAttributesWidget
|
|
||||||
title: t("inherited_attribute_list.title"),
|
title: t("inherited_attribute_list.title"),
|
||||||
icon: "bx bx-list-plus"
|
icon: "bx bx-list-plus",
|
||||||
|
content: InheritedAttributesTab,
|
||||||
|
show: ({note}) => !note?.isLaunchBarConfig(),
|
||||||
|
toggleCommand: "toggleRibbonTabInheritedAttributes"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t("note_paths.title"),
|
title: t("note_paths.title"),
|
||||||
|
@ -336,4 +336,17 @@
|
|||||||
contain: none;
|
contain: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* #endregion */
|
||||||
|
|
||||||
|
/* #region Inherited attributes */
|
||||||
|
.inherited-attributes-widget {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.inherited-attributes-container {
|
||||||
|
color: var(--muted-text-color);
|
||||||
|
max-height: 200px;
|
||||||
|
overflow: auto;
|
||||||
|
padding: 14px 12px 13px 12px;
|
||||||
|
}
|
||||||
/* #endregion */
|
/* #endregion */
|
@ -6,37 +6,10 @@ import { t } from "../../services/i18n.js";
|
|||||||
import type FNote from "../../entities/fnote.js";
|
import type FNote from "../../entities/fnote.js";
|
||||||
import type { EventData } from "../../components/app_context.js";
|
import type { EventData } from "../../components/app_context.js";
|
||||||
|
|
||||||
const TPL = /*html*/`
|
|
||||||
<div class="inherited-attributes-widget">
|
|
||||||
<style>
|
|
||||||
.inherited-attributes-widget {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.inherited-attributes-container {
|
|
||||||
color: var(--muted-text-color);
|
|
||||||
max-height: 200px;
|
|
||||||
overflow: auto;
|
|
||||||
padding: 14px 12px 13px 12px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<div class="inherited-attributes-container"></div>
|
|
||||||
</div>`;
|
|
||||||
|
|
||||||
export default class InheritedAttributesWidget extends NoteContextAwareWidget {
|
export default class InheritedAttributesWidget extends NoteContextAwareWidget {
|
||||||
|
|
||||||
private attributeDetailWidget: AttributeDetailWidget;
|
private attributeDetailWidget: AttributeDetailWidget;
|
||||||
|
|
||||||
private $container!: JQuery<HTMLElement>;
|
|
||||||
|
|
||||||
get name() {
|
|
||||||
return "inheritedAttributes";
|
|
||||||
}
|
|
||||||
|
|
||||||
get toggleCommand() {
|
|
||||||
return "toggleRibbonTabInheritedAttributes";
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super();
|
super();
|
||||||
@ -46,32 +19,15 @@ export default class InheritedAttributesWidget extends NoteContextAwareWidget {
|
|||||||
this.child(this.attributeDetailWidget);
|
this.child(this.attributeDetailWidget);
|
||||||
}
|
}
|
||||||
|
|
||||||
getTitle() {
|
|
||||||
return {
|
|
||||||
show: !this.note?.isLaunchBarConfig()
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
doRender() {
|
doRender() {
|
||||||
this.$widget = $(TPL);
|
|
||||||
this.contentSized();
|
this.contentSized();
|
||||||
|
|
||||||
this.$container = this.$widget.find(".inherited-attributes-container");
|
|
||||||
this.$widget.append(this.attributeDetailWidget.render());
|
this.$widget.append(this.attributeDetailWidget.render());
|
||||||
}
|
}
|
||||||
|
|
||||||
async refreshWithNote(note: FNote) {
|
async refreshWithNote(note: FNote) {
|
||||||
this.$container.empty();
|
|
||||||
|
|
||||||
const inheritedAttributes = this.getInheritedAttributes(note);
|
|
||||||
|
|
||||||
if (inheritedAttributes.length === 0) {
|
|
||||||
this.$container.append(t("inherited_attribute_list.no_inherited_attributes"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const attribute of inheritedAttributes) {
|
for (const attribute of inheritedAttributes) {
|
||||||
const $attr = (await attributeRenderer.renderAttribute(attribute, false)).on("click", (e) => {
|
.on("click", (e) => {
|
||||||
setTimeout(
|
setTimeout(
|
||||||
() =>
|
() =>
|
||||||
this.attributeDetailWidget.showAttributeDetail({
|
this.attributeDetailWidget.showAttributeDetail({
|
||||||
@ -89,29 +45,6 @@ export default class InheritedAttributesWidget extends NoteContextAwareWidget {
|
|||||||
100
|
100
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
this.$container.append($attr).append(" ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
getInheritedAttributes(note: FNote) {
|
|
||||||
const attrs = note.getAttributes().filter((attr) => attr.noteId !== this.noteId);
|
|
||||||
|
|
||||||
attrs.sort((a, b) => {
|
|
||||||
if (a.noteId === b.noteId) {
|
|
||||||
return a.position - b.position;
|
|
||||||
} else {
|
|
||||||
// inherited attributes should stay grouped: https://github.com/zadam/trilium/issues/3761
|
|
||||||
return a.noteId < b.noteId ? -1 : 1;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return attrs;
|
|
||||||
}
|
|
||||||
|
|
||||||
entitiesReloadedEvent({ loadResults }: EventData<"entitiesReloaded">) {
|
|
||||||
if (loadResults.getAttributeRows(this.componentId).find((attr) => attributeService.isAffecting(attr, this.note))) {
|
|
||||||
this.refresh();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user