import { CollectionIcon, EditIcon, PadlockIcon, PlusIcon, StarredIcon, TrashIcon, UnstarredIcon, } from "outline-icons"; import * as React from "react"; import stores from "~/stores"; import Collection from "~/models/Collection"; import CollectionEdit from "~/scenes/CollectionEdit"; import CollectionNew from "~/scenes/CollectionNew"; import CollectionPermissions from "~/scenes/CollectionPermissions"; import CollectionDeleteDialog from "~/components/CollectionDeleteDialog"; import DynamicCollectionIcon from "~/components/Icons/CollectionIcon"; import { createAction } from "~/actions"; import { CollectionSection } from "~/actions/sections"; import history from "~/utils/history"; const ColorCollectionIcon = ({ collection }: { collection: Collection }) => ( ); export const openCollection = createAction({ name: ({ t }) => t("Open collection"), analyticsName: "Open collection", section: CollectionSection, shortcut: ["o", "c"], icon: , children: ({ stores }) => { const collections = stores.collections.orderedData; return collections.map((collection) => ({ // Note: using url which includes the slug rather than id here to bust // cache if the collection is renamed id: collection.path, name: collection.name, icon: , section: CollectionSection, perform: () => history.push(collection.path), })); }, }); export const createCollection = createAction({ name: ({ t }) => t("New collection"), analyticsName: "New collection", section: CollectionSection, icon: , keywords: "create", visible: ({ stores }) => stores.policies.abilities(stores.auth.team?.id || "").createCollection, perform: ({ t, event }) => { event?.preventDefault(); event?.stopPropagation(); stores.dialogs.openModal({ title: t("Create a collection"), content: , }); }, }); export const editCollection = createAction({ name: ({ t, isContextMenu }) => isContextMenu ? `${t("Edit")}…` : t("Edit collection"), analyticsName: "Edit collection", section: CollectionSection, icon: , visible: ({ stores, activeCollectionId }) => !!activeCollectionId && stores.policies.abilities(activeCollectionId).update, perform: ({ t, activeCollectionId }) => { if (!activeCollectionId) { return; } stores.dialogs.openModal({ title: t("Edit collection"), content: ( ), }); }, }); export const editCollectionPermissions = createAction({ name: ({ t, isContextMenu }) => isContextMenu ? `${t("Permissions")}…` : t("Collection permissions"), analyticsName: "Collection permissions", section: CollectionSection, icon: , visible: ({ stores, activeCollectionId }) => !!activeCollectionId && stores.policies.abilities(activeCollectionId).update, perform: ({ t, activeCollectionId }) => { if (!activeCollectionId) { return; } stores.dialogs.openModal({ title: t("Collection permissions"), content: , }); }, }); export const starCollection = createAction({ name: ({ t }) => t("Star"), analyticsName: "Star collection", section: CollectionSection, icon: , keywords: "favorite bookmark", visible: ({ activeCollectionId, stores }) => { if (!activeCollectionId) { return false; } const collection = stores.collections.get(activeCollectionId); return ( !collection?.isStarred && stores.policies.abilities(activeCollectionId).star ); }, perform: async ({ activeCollectionId, stores }) => { if (!activeCollectionId) { return; } const collection = stores.collections.get(activeCollectionId); await collection?.star(); }, }); export const unstarCollection = createAction({ name: ({ t }) => t("Unstar"), analyticsName: "Unstar collection", section: CollectionSection, icon: , keywords: "unfavorite unbookmark", visible: ({ activeCollectionId, stores }) => { if (!activeCollectionId) { return false; } const collection = stores.collections.get(activeCollectionId); return ( !!collection?.isStarred && stores.policies.abilities(activeCollectionId).unstar ); }, perform: async ({ activeCollectionId, stores }) => { if (!activeCollectionId) { return; } const collection = stores.collections.get(activeCollectionId); await collection?.unstar(); }, }); export const deleteCollection = createAction({ name: ({ t }) => `${t("Delete")}…`, analyticsName: "Delete collection", section: CollectionSection, dangerous: true, icon: , visible: ({ activeCollectionId, stores }) => { if (!activeCollectionId) { return false; } return stores.policies.abilities(activeCollectionId).delete; }, perform: ({ activeCollectionId, stores, t }) => { if (!activeCollectionId) { return; } const collection = stores.collections.get(activeCollectionId); if (!collection) { return; } stores.dialogs.openModal({ isCentered: true, title: t("Delete collection"), content: ( ), }); }, }); export const rootCollectionActions = [ openCollection, createCollection, starCollection, unstarCollection, deleteCollection, ];