XrefFoundFiles.tsx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import * as React from "react";
  2. import { CommandBar, ContextualMenuItemType, ICommandBarItemProps } from "@fluentui/react";
  3. import { useConst } from "@fluentui/react-hooks";
  4. import { scopedLogger } from "@hpcc-js/util";
  5. import { HolyGrail } from "../layouts/HolyGrail";
  6. import * as WsDFUXref from "src/WsDFUXref";
  7. import * as Observable from "dojo/store/Observable";
  8. import { Memory } from "src/Memory";
  9. import { useConfirm } from "../hooks/confirm";
  10. import { useGrid } from "../hooks/grid";
  11. import { ShortVerticalDivider } from "./Common";
  12. import { selector } from "./DojoGrid";
  13. import nlsHPCC from "src/nlsHPCC";
  14. const logger = scopedLogger("src-react/components/XrefFoundFiles.tsx");
  15. const defaultUIState = {
  16. hasSelection: false,
  17. };
  18. interface XrefFoundFilesProps {
  19. name: string;
  20. }
  21. export const XrefFoundFiles: React.FunctionComponent<XrefFoundFilesProps> = ({
  22. name
  23. }) => {
  24. const [uiState, setUIState] = React.useState({ ...defaultUIState });
  25. // Grid ---
  26. const store = useConst(new Observable(new Memory("name")));
  27. const [Grid, selection, refreshTable, copyButtons] = useGrid({
  28. store,
  29. query: {},
  30. sort: [{ attribute: "modified", "descending": false }],
  31. filename: "xrefsFoundFiles",
  32. columns: {
  33. check: selector({ width: 27 }, "checkbox"),
  34. name: { width: 180, label: nlsHPCC.Name },
  35. modified: { width: 80, label: nlsHPCC.Modified },
  36. parts: { width: 80, label: nlsHPCC.Parts },
  37. size: { width: 80, label: nlsHPCC.Size }
  38. }
  39. });
  40. // Selection ---
  41. React.useEffect(() => {
  42. const state = { ...defaultUIState };
  43. if (selection.length > 0) {
  44. state.hasSelection = true;
  45. }
  46. setUIState(state);
  47. }, [selection]);
  48. const refreshData = React.useCallback(() => {
  49. WsDFUXref.DFUXRefFoundFiles(name)
  50. .then(rows => {
  51. if (rows.length) {
  52. store.setData(rows.map((item, idx) => {
  53. return {
  54. name: item.Name,
  55. modified: item.Modified,
  56. parts: item.Parts,
  57. size: item.Size
  58. };
  59. }));
  60. refreshTable();
  61. }
  62. })
  63. .catch(err => logger.error(err))
  64. ;
  65. }, [name, refreshTable, store]);
  66. const [AttachConfirm, setShowAttachConfirm] = useConfirm({
  67. title: nlsHPCC.Attach,
  68. message: nlsHPCC.AddTheseFilesToDali,
  69. items: selection.map(file => file.name),
  70. onSubmit: React.useCallback(() => {
  71. WsDFUXref.DFUXRefArrayAction(selection, nlsHPCC.Attach, name, "Found")
  72. .then(response => {
  73. refreshData();
  74. })
  75. .catch(err => logger.error(err))
  76. ;
  77. }, [name, refreshData, selection])
  78. });
  79. const [DeleteConfirm, setShowDeleteConfirm] = useConfirm({
  80. title: nlsHPCC.Delete,
  81. message: nlsHPCC.DeleteSelectedFiles,
  82. items: selection.map(file => file.name),
  83. onSubmit: React.useCallback(() => {
  84. WsDFUXref.DFUXRefArrayAction(selection, nlsHPCC.Delete, name, "Found")
  85. .then(response => {
  86. refreshData();
  87. })
  88. .catch(err => logger.error(err))
  89. ;
  90. }, [name, refreshData, selection])
  91. });
  92. // Command Bar ---
  93. const buttons = React.useMemo((): ICommandBarItemProps[] => [
  94. {
  95. key: "refresh", text: nlsHPCC.Refresh, iconProps: { iconName: "Refresh" },
  96. onClick: () => refreshData()
  97. },
  98. { key: "divider_1", itemType: ContextualMenuItemType.Divider, onRender: () => <ShortVerticalDivider /> },
  99. {
  100. key: "attach", text: nlsHPCC.Attach, disabled: !uiState.hasSelection,
  101. onClick: () => setShowAttachConfirm(true)
  102. },
  103. {
  104. key: "delete", text: nlsHPCC.Delete, disabled: !uiState.hasSelection,
  105. onClick: () => setShowDeleteConfirm(true)
  106. },
  107. { key: "divider_2", itemType: ContextualMenuItemType.Divider, onRender: () => <ShortVerticalDivider /> },
  108. ], [refreshData, setShowAttachConfirm, setShowDeleteConfirm, uiState]);
  109. React.useEffect(() => {
  110. refreshData();
  111. }, [refreshData]);
  112. return <HolyGrail
  113. header={<CommandBar items={buttons} farItems={copyButtons} />}
  114. main={
  115. <>
  116. <Grid />
  117. <AttachConfirm />
  118. <DeleteConfirm />
  119. </>
  120. }
  121. />;
  122. };