mirror of
https://github.com/outline/outline.git
synced 2026-06-13 03:14:59 +03:00
fix: Hide position submenu for alphabetically-sorted collections (#12377)
When a collection is sorted alphabetically the document position is auto-determined, so the "New document" submenu (Before/After/Nested) is replaced by a direct "New document" action that creates a nested document.
This commit is contained in:
@@ -269,10 +269,14 @@ const createDocumentBefore = createInternalLinkAction({
|
||||
return false;
|
||||
}
|
||||
const document = stores.documents.get(activeDocumentId);
|
||||
return (
|
||||
!!document?.collectionId &&
|
||||
stores.policies.abilities(currentTeamId).createDocument
|
||||
);
|
||||
if (!document?.collectionId) {
|
||||
return false;
|
||||
}
|
||||
const collection = stores.collections.get(document.collectionId);
|
||||
if (collection?.sort.field === "title") {
|
||||
return false;
|
||||
}
|
||||
return stores.policies.abilities(currentTeamId).createDocument;
|
||||
},
|
||||
to: ({ activeDocumentId, stores, sidebarContext }) => {
|
||||
const document = activeDocumentId
|
||||
@@ -307,10 +311,14 @@ const createDocumentAfter = createInternalLinkAction({
|
||||
return false;
|
||||
}
|
||||
const document = stores.documents.get(activeDocumentId);
|
||||
return (
|
||||
!!document?.collectionId &&
|
||||
stores.policies.abilities(currentTeamId).createDocument
|
||||
);
|
||||
if (!document?.collectionId) {
|
||||
return false;
|
||||
}
|
||||
const collection = stores.collections.get(document.collectionId);
|
||||
if (collection?.sort.field === "title") {
|
||||
return false;
|
||||
}
|
||||
return stores.policies.abilities(currentTeamId).createDocument;
|
||||
},
|
||||
to: ({ activeDocumentId, stores, sidebarContext }) => {
|
||||
const document = activeDocumentId
|
||||
@@ -335,6 +343,18 @@ const createDocumentAfter = createInternalLinkAction({
|
||||
},
|
||||
});
|
||||
|
||||
function isAlphabeticallySorted(
|
||||
stores: ActionContext["stores"],
|
||||
activeDocumentId: string
|
||||
): boolean {
|
||||
const document = stores.documents.get(activeDocumentId);
|
||||
if (!document?.collectionId) {
|
||||
return false;
|
||||
}
|
||||
const collection = stores.collections.get(document.collectionId);
|
||||
return collection?.sort.field === "title";
|
||||
}
|
||||
|
||||
export const createNewDocument = createActionWithChildren({
|
||||
name: ({ t }) => t("New document"),
|
||||
analyticsName: "New document",
|
||||
@@ -342,17 +362,48 @@ export const createNewDocument = createActionWithChildren({
|
||||
icon: <NewDocumentIcon />,
|
||||
keywords: "create",
|
||||
visible: ({ currentTeamId, activeDocumentId, stores }) => {
|
||||
if (!activeDocumentId) {
|
||||
if (!activeDocumentId || !currentTeamId) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return (
|
||||
!!currentTeamId && stores.policies.abilities(currentTeamId).createDocument
|
||||
);
|
||||
if (!stores.policies.abilities(currentTeamId).createDocument) {
|
||||
return false;
|
||||
}
|
||||
return !isAlphabeticallySorted(stores, activeDocumentId);
|
||||
},
|
||||
children: [createDocumentBefore, createDocumentAfter, createNestedDocument],
|
||||
});
|
||||
|
||||
export const createNewDocumentInAlphabeticalCollection =
|
||||
createInternalLinkAction({
|
||||
name: ({ t }) => t("New document"),
|
||||
analyticsName: "New document",
|
||||
section: ActiveDocumentSection,
|
||||
icon: <NewDocumentIcon />,
|
||||
keywords: "create",
|
||||
visible: ({ currentTeamId, activeDocumentId, stores }) => {
|
||||
if (!activeDocumentId || !currentTeamId) {
|
||||
return false;
|
||||
}
|
||||
if (!stores.policies.abilities(currentTeamId).createDocument) {
|
||||
return false;
|
||||
}
|
||||
if (!stores.policies.abilities(activeDocumentId).createChildDocument) {
|
||||
return false;
|
||||
}
|
||||
return isAlphabeticallySorted(stores, activeDocumentId);
|
||||
},
|
||||
to: ({ activeDocumentId, sidebarContext }) => {
|
||||
const [pathname, search] =
|
||||
newNestedDocumentPath(activeDocumentId).split("?");
|
||||
|
||||
return {
|
||||
pathname,
|
||||
search,
|
||||
state: { sidebarContext },
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
export const starDocument = createAction({
|
||||
name: ({ t }) => t("Star"),
|
||||
analyticsName: "Star document",
|
||||
@@ -1528,6 +1579,7 @@ export const rootDocumentActions = [
|
||||
createDocument,
|
||||
createDraftDocument,
|
||||
createNewDocument,
|
||||
createNewDocumentInAlphabeticalCollection,
|
||||
createNestedDocument,
|
||||
createTemplateFromDocument,
|
||||
deleteDocument,
|
||||
|
||||
@@ -12,6 +12,7 @@ import {
|
||||
editDocument,
|
||||
shareDocument,
|
||||
createNewDocument,
|
||||
createNewDocumentInAlphabeticalCollection,
|
||||
importDocument,
|
||||
createTemplateFromDocument,
|
||||
duplicateDocument,
|
||||
@@ -103,6 +104,7 @@ export function useDocumentMenuAction({
|
||||
applyTemplateFactory({ actions: templateMenuActions }),
|
||||
importDocument,
|
||||
createNewDocument,
|
||||
createNewDocumentInAlphabeticalCollection,
|
||||
pinDocument,
|
||||
ActionSeparator,
|
||||
openDocumentComments,
|
||||
|
||||
Reference in New Issue
Block a user