All files / js/sidebar PageActions.tsx

39.28% Statements 11/28
0% Branches 0/18
0% Functions 0/5
40.74% Lines 11/27

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 1011x 1x       1x   1x 1x 1x 1x 1x   1x                                                                   1x                                                                                                       1x  
import React, { MouseEvent, memo, useCallback } from "react";
import {
  getUrlRecordPath,
  RecordPathDetails,
} from "../components/RecordComponent";
import Link from "../components/Link";
import { RecordInfo } from "../components/types";
import { trans } from "../i18n";
import { getPlatform } from "../utils";
import { loadData } from "../fetch";
import { showErrorDialog } from "../error-dialog";
import LinkWithHotkey from "../components/LinkWithHotkey";
 
const getBrowseButtonTitle = () => {
  const platform = getPlatform();
  if (platform === "mac") {
    return trans("BROWSE_FS_MAC");
  } else if (platform === "windows") {
    return trans("BROWSE_FS_WINDOWS");
  } else {
    return trans("BROWSE_FS");
  }
};
 
function BrowseFSLink({ record }: { record: RecordPathDetails }) {
  const fsOpen = useCallback(
    (ev: MouseEvent) => {
      ev.preventDefault();
      loadData(
        "/browsefs",
        { path: record.path, alt: record.alt },
        { method: "POST" }
      ).then((resp) => {
        if (!resp.okay) {
          alert(trans("ERROR_CANNOT_BROWSE_FS"));
        }
      }, showErrorDialog);
    },
    [record]
  );
  return (
    <a href="#" onClick={fsOpen}>
      {getBrowseButtonTitle()}
    </a>
  );
}
 
const editKey = { key: "Control+e", mac: "Meta+e", preventDefault: true };
 
function PageActions({
  record,
  recordInfo,
}: {
  record: RecordPathDetails;
  recordInfo: RecordInfo;
}) {
  const urlPath = getUrlRecordPath(record.path, record.alt);
 
  return (
    <div className="section">
      <h3>
        {recordInfo.is_attachment
          ? trans("ATTACHMENT_ACTIONS")
          : trans("PAGE_ACTIONS")}
      </h3>
      <ul className="nav">
        <li key="edit">
          <LinkWithHotkey to={`${urlPath}/edit`} shortcut={editKey}>
            {recordInfo.is_attachment ? trans("EDIT_METADATA") : trans("EDIT")}
          </LinkWithHotkey>
        </li>
        {recordInfo.can_be_deleted && (
          <li key="delete">
            <Link to={`${urlPath}/delete`}>{trans("DELETE")}</Link>
          </li>
        )}
        <li key="preview">
          <Link to={`${urlPath}/preview`}>{trans("PREVIEW")}</Link>
        </li>
        {recordInfo.exists && (
          <li key="fs-open">
            <BrowseFSLink record={record} />
          </li>
        )}
        {recordInfo.can_have_children && (
          <li key="add-child">
            <Link to={`${urlPath}/add-child`}>{trans("ADD_CHILD_PAGE")}</Link>
          </li>
        )}
        {recordInfo.can_have_attachments && (
          <li key="add-attachment">
            <Link to={`${urlPath}/upload`}>{trans("ADD_ATTACHMENT")}</Link>
          </li>
        )}
      </ul>
    </div>
  );
}
 
export default memo(PageActions);