mirror of
https://github.com/siyuan-note/siyuan.git
synced 2025-12-19 08:00:13 +01:00
This commit is contained in:
parent
aa2f05dcb5
commit
520c2aec7d
6 changed files with 63 additions and 85 deletions
|
|
@ -68,22 +68,6 @@
|
||||||
font-size: 87.5%;
|
font-size: 87.5%;
|
||||||
}
|
}
|
||||||
|
|
||||||
&__gutters {
|
|
||||||
@extend .protyle-gutters;
|
|
||||||
top: 0;
|
|
||||||
left: -44px;
|
|
||||||
opacity: 0;
|
|
||||||
display: flex;
|
|
||||||
|
|
||||||
&--min .av__gutter {
|
|
||||||
padding: 4px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
svg {
|
|
||||||
height: 25px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&__mask {
|
&__mask {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
top: 0;
|
top: 0;
|
||||||
|
|
@ -114,16 +98,10 @@
|
||||||
box-shadow: 0 -3px 0 var(--b3-theme-primary-lighter), inset 0 2px 0 var(--b3-theme-primary-lighter) !important;
|
box-shadow: 0 -3px 0 var(--b3-theme-primary-lighter), inset 0 2px 0 var(--b3-theme-primary-lighter) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:hover {
|
&:hover [data-type="block-more"] {
|
||||||
[data-type="block-more"] {
|
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
.av__gutters {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&--select {
|
&--select {
|
||||||
&:not(.av__row--header) .av__cell,
|
&:not(.av__row--header) .av__cell,
|
||||||
&:not(.av__row--header) .av__firstcol {
|
&:not(.av__row--header) .av__firstcol {
|
||||||
|
|
|
||||||
|
|
@ -89,11 +89,15 @@ export const windowMouseMove = (event: MouseEvent & { target: HTMLElement }, mou
|
||||||
if (!targetBlockElement) {
|
if (!targetBlockElement) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
let rowElement: Element;
|
||||||
|
if (targetBlockElement.classList.contains("av")) {
|
||||||
|
rowElement = hasClosestByClassName(mouseElement, "av__row") as HTMLElement;
|
||||||
|
}
|
||||||
const allModels = getAllModels();
|
const allModels = getAllModels();
|
||||||
let findNode = false;
|
let findNode = false;
|
||||||
allModels.editor.find(item => {
|
allModels.editor.find(item => {
|
||||||
if (item.editor.protyle.wysiwyg.element.isSameNode(eventPath0)) {
|
if (item.editor.protyle.wysiwyg.element.isSameNode(eventPath0)) {
|
||||||
item.editor.protyle.gutter.render(item.editor.protyle, targetBlockElement, item.editor.protyle.wysiwyg.element);
|
item.editor.protyle.gutter.render(item.editor.protyle, targetBlockElement, item.editor.protyle.wysiwyg.element, rowElement);
|
||||||
findNode = true;
|
findNode = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -102,7 +106,7 @@ export const windowMouseMove = (event: MouseEvent & { target: HTMLElement }, mou
|
||||||
window.siyuan.blockPanels.find(item => {
|
window.siyuan.blockPanels.find(item => {
|
||||||
item.editors.find(eItem => {
|
item.editors.find(eItem => {
|
||||||
if (eItem.protyle.wysiwyg.element.contains(eventPath0)) {
|
if (eItem.protyle.wysiwyg.element.contains(eventPath0)) {
|
||||||
eItem.protyle.gutter.render(eItem.protyle, targetBlockElement, eItem.protyle.wysiwyg.element);
|
eItem.protyle.gutter.render(eItem.protyle, targetBlockElement, eItem.protyle.wysiwyg.element, rowElement);
|
||||||
findNode = true;
|
findNode = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -116,7 +120,7 @@ export const windowMouseMove = (event: MouseEvent & { target: HTMLElement }, mou
|
||||||
allModels.backlink.find(item => {
|
allModels.backlink.find(item => {
|
||||||
item.editors.find(eItem => {
|
item.editors.find(eItem => {
|
||||||
if (eItem.protyle.wysiwyg.element.isSameNode(eventPath0)) {
|
if (eItem.protyle.wysiwyg.element.isSameNode(eventPath0)) {
|
||||||
eItem.protyle.gutter.render(eItem.protyle, targetBlockElement, eItem.protyle.wysiwyg.element);
|
eItem.protyle.gutter.render(eItem.protyle, targetBlockElement, eItem.protyle.wysiwyg.element, rowElement);
|
||||||
findNode = true;
|
findNode = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,8 @@ import {appearanceMenu} from "../toolbar/Font";
|
||||||
import {setPosition} from "../../util/setPosition";
|
import {setPosition} from "../../util/setPosition";
|
||||||
import {avRender} from "../render/av/render";
|
import {avRender} from "../render/av/render";
|
||||||
import {emitOpenMenu} from "../../plugin/EventBus";
|
import {emitOpenMenu} from "../../plugin/EventBus";
|
||||||
|
import {insertAttrViewBlockAnimation} from "../render/av/row";
|
||||||
|
import {avContextmenu} from "../render/av/action";
|
||||||
|
|
||||||
export class Gutter {
|
export class Gutter {
|
||||||
public element: HTMLElement;
|
public element: HTMLElement;
|
||||||
|
|
@ -183,6 +185,43 @@ export class Gutter {
|
||||||
window.siyuan.menus.menu.remove();
|
window.siyuan.menus.menu.remove();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (buttonElement.dataset.type === "NodeAttributeViewRowMenu" || buttonElement.dataset.type === "NodeAttributeViewRow") {
|
||||||
|
const rowElement = protyle.wysiwyg.element.querySelector(`.av__row[data-id="${buttonElement.dataset.nodeId}"]`) as HTMLElement;
|
||||||
|
if (!rowElement) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const blockElement = hasClosestBlock(rowElement)
|
||||||
|
if (!blockElement) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
blockElement.querySelector(".av__cell--select")?.classList.remove("av__cell--select");
|
||||||
|
if (buttonElement.dataset.type === "NodeAttributeViewRow") {
|
||||||
|
const avID = blockElement.getAttribute("data-av-id");
|
||||||
|
const srcIDs = [Lute.NewNodeID()];
|
||||||
|
const previousID = event.altKey ? (rowElement.previousElementSibling.getAttribute("data-id") || "") : buttonElement.dataset.nodeId;
|
||||||
|
transaction(protyle, [{
|
||||||
|
action: "insertAttrViewBlock",
|
||||||
|
avID,
|
||||||
|
previousID,
|
||||||
|
srcIDs,
|
||||||
|
isDetached: true,
|
||||||
|
}], [{
|
||||||
|
action: "removeAttrViewBlock",
|
||||||
|
srcIDs,
|
||||||
|
avID,
|
||||||
|
}]);
|
||||||
|
insertAttrViewBlockAnimation(blockElement, srcIDs, previousID, avID);
|
||||||
|
} else {
|
||||||
|
const gutterRect = buttonElement.getBoundingClientRect();
|
||||||
|
avContextmenu(protyle, rowElement, {
|
||||||
|
x: gutterRect.left,
|
||||||
|
y: gutterRect.bottom,
|
||||||
|
w: gutterRect.width,
|
||||||
|
h: gutterRect.height
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (isOnlyMeta(event)) {
|
if (isOnlyMeta(event)) {
|
||||||
zoomOut({protyle, id});
|
zoomOut({protyle, id});
|
||||||
} else if (event.altKey) {
|
} else if (event.altKey) {
|
||||||
|
|
@ -1805,7 +1844,7 @@ export class Gutter {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public render(protyle: IProtyle, element: Element, wysiwyg: HTMLElement) {
|
public render(protyle: IProtyle, element: Element, wysiwyg: HTMLElement, target?: Element) {
|
||||||
// https://github.com/siyuan-note/siyuan/issues/4659
|
// https://github.com/siyuan-note/siyuan/issues/4659
|
||||||
const titleElement = wysiwyg.parentElement.querySelector(".protyle-title__input");
|
const titleElement = wysiwyg.parentElement.querySelector(".protyle-title__input");
|
||||||
if (titleElement && titleElement.getAttribute("data-render") !== "true") {
|
if (titleElement && titleElement.getAttribute("data-render") !== "true") {
|
||||||
|
|
@ -1830,6 +1869,15 @@ export class Gutter {
|
||||||
if (isShow) {
|
if (isShow) {
|
||||||
type = nodeElement.getAttribute("data-type");
|
type = nodeElement.getAttribute("data-type");
|
||||||
}
|
}
|
||||||
|
if (type === "NodeAttributeView" && target) {
|
||||||
|
const rowElement = hasClosestByClassName(target, "av__row");
|
||||||
|
if (rowElement && !rowElement.classList.contains("av__row--header")) {
|
||||||
|
element = rowElement;
|
||||||
|
html = `<button data-type="NodeAttributeViewRow" data-node-id="${rowElement.dataset.id}" class="ariaLabel" data-position="right" aria-label="${isMac() ? window.siyuan.languages.addBelowAbove : window.siyuan.languages.addBelowAbove.replace("⌥", "Alt+")}"><svg><use xlink:href="#iconAdd"></use></svg></button>
|
||||||
|
<button data-type="NodeAttributeViewRowMenu" data-node-id="${rowElement.dataset.id}" class="ariaLabel" data-position="right" aria-label="${window.siyuan.languages.rowTip}"><svg><use xlink:href="#iconDrag"></use></svg><span ${protyle.disabled ? "" : 'draggable="true"'}></span></button>`
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (index === 0) {
|
if (index === 0) {
|
||||||
// 不单独显示,要不然在块的间隔中,gutter 会跳来跳去的
|
// 不单独显示,要不然在块的间隔中,gutter 会跳来跳去的
|
||||||
if (["NodeBlockquote", "NodeList", "NodeSuperBlock"].includes(type)) {
|
if (["NodeBlockquote", "NodeList", "NodeSuperBlock"].includes(type)) {
|
||||||
|
|
@ -1924,8 +1972,9 @@ data-type="fold"><svg style="width:10px${fold && fold === "1" ? "" : ";transform
|
||||||
} else if (rect.height < Math.floor(window.siyuan.config.editor.fontSize * 1.625) + 8 ||
|
} else if (rect.height < Math.floor(window.siyuan.config.editor.fontSize * 1.625) + 8 ||
|
||||||
(rect.height > Math.floor(window.siyuan.config.editor.fontSize * 1.625) + 8 && rect.height < Math.floor(window.siyuan.config.editor.fontSize * 1.625) * 2 + 8)) {
|
(rect.height > Math.floor(window.siyuan.config.editor.fontSize * 1.625) + 8 && rect.height < Math.floor(window.siyuan.config.editor.fontSize * 1.625) * 2 + 8)) {
|
||||||
marginHeight = (rect.height - this.element.clientHeight) / 2;
|
marginHeight = (rect.height - this.element.clientHeight) / 2;
|
||||||
} else if ((nodeElement.getAttribute("data-type") === "NodeAttributeView" ||
|
} else if (!element.classList.contains("av__row") &&
|
||||||
element.getAttribute("data-type") === "NodeAttributeView") && contentTop < rect.top) {
|
(nodeElement.getAttribute("data-type") === "NodeAttributeView" || element.getAttribute("data-type") === "NodeAttributeView") &&
|
||||||
|
contentTop < rect.top) {
|
||||||
marginHeight = 8;
|
marginHeight = 8;
|
||||||
}
|
}
|
||||||
this.element.style.top = `${Math.max(rect.top, contentTop) + marginHeight}px`;
|
this.element.style.top = `${Math.max(rect.top, contentTop) + marginHeight}px`;
|
||||||
|
|
|
||||||
|
|
@ -159,39 +159,6 @@ export const avClick = (protyle: IProtyle, event: MouseEvent & { target: HTMLEle
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
return true;
|
return true;
|
||||||
} else if (target.classList.contains("av__gutter")) {
|
|
||||||
const rowElement = hasClosestByClassName(target, "av__row");
|
|
||||||
if (!rowElement) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (target.dataset.action === "add") {
|
|
||||||
const avID = blockElement.getAttribute("data-av-id");
|
|
||||||
const srcIDs = [Lute.NewNodeID()];
|
|
||||||
const previousID = event.altKey ? (rowElement.previousElementSibling.getAttribute("data-id") || "") : rowElement.getAttribute("data-id");
|
|
||||||
transaction(protyle, [{
|
|
||||||
action: "insertAttrViewBlock",
|
|
||||||
avID,
|
|
||||||
previousID,
|
|
||||||
srcIDs,
|
|
||||||
isDetached: true,
|
|
||||||
}], [{
|
|
||||||
action: "removeAttrViewBlock",
|
|
||||||
srcIDs,
|
|
||||||
avID,
|
|
||||||
}]);
|
|
||||||
insertAttrViewBlockAnimation(blockElement, srcIDs, previousID, avID);
|
|
||||||
} else {
|
|
||||||
const gutterRect = target.getBoundingClientRect();
|
|
||||||
avContextmenu(protyle, rowElement, {
|
|
||||||
x: gutterRect.left,
|
|
||||||
y: gutterRect.bottom,
|
|
||||||
w: gutterRect.width,
|
|
||||||
h: gutterRect.height
|
|
||||||
});
|
|
||||||
}
|
|
||||||
event.preventDefault();
|
|
||||||
event.stopPropagation();
|
|
||||||
return true;
|
|
||||||
} else if (target.classList.contains("av__firstcol")) {
|
} else if (target.classList.contains("av__firstcol")) {
|
||||||
window.siyuan.menus.menu.remove();
|
window.siyuan.menus.menu.remove();
|
||||||
selectRow(target, "toggle");
|
selectRow(target, "toggle");
|
||||||
|
|
|
||||||
|
|
@ -120,11 +120,7 @@ style="width: ${column.width || "200px"}">${getCalcValue(column) || '<svg><use x
|
||||||
</div>`;
|
</div>`;
|
||||||
// body
|
// body
|
||||||
data.rows.forEach((row: IAVRow) => {
|
data.rows.forEach((row: IAVRow) => {
|
||||||
tableHTML += `<div class="av__row" data-id="${row.id}">
|
tableHTML += `<div class="av__row" data-id="${row.id}">`;
|
||||||
<div class="av__gutters">
|
|
||||||
<button class="av__gutter ariaLabel" data-action="add" data-position="right" aria-label="${isMac() ? window.siyuan.languages.addBelowAbove : window.siyuan.languages.addBelowAbove.replace("⌥", "Alt+")}"><svg><use xlink:href="#iconAdd"></use></svg></button>
|
|
||||||
<button class="av__gutter ariaLabel" draggable="true" data-position="right" aria-label="${window.siyuan.languages.rowTip}"><svg><use xlink:href="#iconDrag"></use></svg></button>
|
|
||||||
</div>`;
|
|
||||||
if (pinIndex > -1) {
|
if (pinIndex > -1) {
|
||||||
tableHTML += '<div class="av__colsticky"><div class="av__firstcol"><svg><use xlink:href="#iconUncheck"></use></svg></div>';
|
tableHTML += '<div class="av__colsticky"><div class="av__firstcol"><svg><use xlink:href="#iconUncheck"></use></svg></div>';
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -379,7 +379,6 @@ export class WYSIWYG {
|
||||||
}
|
}
|
||||||
const target = event.target as HTMLElement;
|
const target = event.target as HTMLElement;
|
||||||
if (hasClosestByClassName(target, "protyle-action") ||
|
if (hasClosestByClassName(target, "protyle-action") ||
|
||||||
hasClosestByClassName(target, "av__gutters") ||
|
|
||||||
hasClosestByClassName(target, "av__cellheader")) {
|
hasClosestByClassName(target, "av__cellheader")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -1511,22 +1510,7 @@ export class WYSIWYG {
|
||||||
if (embedElement) {
|
if (embedElement) {
|
||||||
protyle.gutter.render(protyle, embedElement, this.element);
|
protyle.gutter.render(protyle, embedElement, this.element);
|
||||||
} else {
|
} else {
|
||||||
// database 行块标
|
protyle.gutter.render(protyle, nodeElement, this.element, event.target);
|
||||||
const rowElement = hasClosestByClassName(event.target, "av__row");
|
|
||||||
if (rowElement && rowElement.dataset.id) {
|
|
||||||
const guttersElement = rowElement.querySelector(".av__gutters");
|
|
||||||
if (guttersElement) {
|
|
||||||
guttersElement.classList.remove("av__gutters--min");
|
|
||||||
let guttersLeft = rowElement.parentElement.parentElement.getBoundingClientRect().left - guttersElement.clientWidth;
|
|
||||||
const contentLeft = protyle.contentElement.getBoundingClientRect().left;
|
|
||||||
if (guttersLeft < contentLeft) {
|
|
||||||
guttersLeft = contentLeft;
|
|
||||||
guttersElement.classList.add("av__gutters--min");
|
|
||||||
}
|
|
||||||
guttersElement.setAttribute("style", `left:${guttersLeft}px;top:${rowElement.getBoundingClientRect().top}px`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
protyle.gutter.render(protyle, nodeElement, this.element);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue