[{"id":"08e0fe96-3025-463b-bcee-87f4b29c462b","tags":[{"product":null,"links":null,"id":"92283933-94f9-4e9a-8d93-15ba4ec8b3ec","name":"upd","color":"#7e678a","productId":"77f3d9a0-2c87-4130-b77a-b94ccf13e3cb"}]},{"id":"0d5035e7-1a53-4dc5-b32e-9ce261bfa47e","tags":[{"product":null,"links":null,"id":"92283933-94f9-4e9a-8d93-15ba4ec8b3ec","name":"upd","color":"#7e678a","productId":"77f3d9a0-2c87-4130-b77a-b94ccf13e3cb"}]},{"id":"2fb2b485-f567-436c-9ca9-06dd71ceadb3","tags":[{"product":null,"links":null,"id":"92283933-94f9-4e9a-8d93-15ba4ec8b3ec","name":"upd","color":"#7e678a","productId":"77f3d9a0-2c87-4130-b77a-b94ccf13e3cb"}]},{"id":"c1466f0c-9710-41d3-9812-c7321630328a","tags":[{"product":null,"links":null,"id":"e1d31134-0bda-4c05-bee0-b1f21f82940b","name":"new","color":"#00A273","productId":"77f3d9a0-2c87-4130-b77a-b94ccf13e3cb"}]},{"id":"b0e616b5-b520-405e-b108-e81363a8dd74","tags":[{"product":null,"links":null,"id":"92283933-94f9-4e9a-8d93-15ba4ec8b3ec","name":"upd","color":"#7e678a","productId":"77f3d9a0-2c87-4130-b77a-b94ccf13e3cb"}]},{"id":"f5712fda-d364-4652-9783-3073e2560b97","tags":[{"product":null,"links":null,"id":"92283933-94f9-4e9a-8d93-15ba4ec8b3ec","name":"upd","color":"#7e678a","productId":"77f3d9a0-2c87-4130-b77a-b94ccf13e3cb"}]},{"id":"8f03c498-1e02-459a-a6de-ee619033d6d2","tags":[{"product":null,"links":null,"id":"92283933-94f9-4e9a-8d93-15ba4ec8b3ec","name":"upd","color":"#7e678a","productId":"77f3d9a0-2c87-4130-b77a-b94ccf13e3cb"}]},{"id":"2b701643-01a1-40e0-b49b-0a6e93c1f847","tags":[{"product":null,"links":null,"id":"e1d31134-0bda-4c05-bee0-b1f21f82940b","name":"new","color":"#00A273","productId":"77f3d9a0-2c87-4130-b77a-b94ccf13e3cb"}]},{"id":"07b4f367-7ddc-4c8a-932c-b180f112364e","tags":[{"product":null,"links":null,"id":"e1d31134-0bda-4c05-bee0-b1f21f82940b","name":"new","color":"#00A273","productId":"77f3d9a0-2c87-4130-b77a-b94ccf13e3cb"}]}]
        
(Showing Draft Content)

レポートの保存

Webデザイナコンポーネントで表示されるレポートを保存する形式と方法は、アプリケーションのアーキテクチャによって異なります。このトピックでは、いくつかの一般的なシナリオについて説明しています。

[保存/名前を付けて保存]ボタンを有効にする

Webデザイナコンポーネントでは、ツールバーに[保存]および[名前を付けて保存]ボタンが含まれています。


save-saveas


ただし、これは既定で非表示になっています。このボタンを有効にするには、コードでWebデザイナコンポーネントのインスタンスに対してonSaveおよびonSaveAsアクションハンドラを設定する必要があります。詳細については、アクションハンドラを参照してください。onSaveAsアクションハンドラハンドラは、レポートのidとオプションのdisplayNameプロパティを含むオブジェクトに解決されるPromiseを返す必要があります。前者はレポートを一意に識別し、後者はWebデザイナコンポーネントのリボンに表示されます。onSaveアクションハンドラハンドラは、オプションのdisplayNameプロパティを含むオブジェクトに解決されるPromiseを返す必要があります。以下は、ReactアプリケーションでonSaveおよびonSaveAsアクションハンドラを使用してレポートを保存するサンプルです。これらのハンドラはPromiseオブジェクトを返す非同期関数であるため、上記の方法を使用して、REST APIにリクエストを送信することでレポートを保存できます。

import React, { Fragment } from "react";
import {
  Designer as ReportDesigner,
} from "@mescius/activereportsjs/reportdesigner";

export const DesignerHost: React.FC = () => {
  const designerRef = React.useRef<ReportDesigner | undefined>();
  const counter = React.useRef<number>(0);
  const [reportStorage, setReportStorage] = React.useState(new Map());

  React.useEffect(() => {
    designerRef.current = new ReportDesigner("#designer-host");
    designerRef.current.setActionHandlers({
      onSave: function (info) {
        const reportId = info.id || `report${counter.current++}`;
        setReportStorage(new Map(reportStorage.set(reportId, info.definition)));
        return Promise.resolve({displayName: reportId});
      },
      onSaveAs: function (info) {
        const reportId = info.id || `report${counter.current++}`;
        setReportStorage(new Map(reportStorage.set(reportId, info.definition)));
        return Promise.resolve({id: reportId, displayName: reportId });
      },
    });
  }, []);
  return (
    <div id="designer-host"></div>
  );
};

React、Angular、Vue、およびPureJSアプリケーションの完全な実装例については、デモを参照してください。

自動保存

WebデザイナコンポーネントのprocessCommandメソッドは、savesaveAscreateopen、およびrenderのいずれかの引数を受け取り、対応するアクションハンドラを呼び出します。詳細については、アクションハンドラを参照してください。ユーザーがデザイナインスタンスに読み込まれているレポートを変更すると、デザイナコンポーネントのdocumentChangedイベントが発生します。イベントハンドラは、レポートレイアウトが最後に保存されてから、何らかの変更が加えられたかどうかを示すisDirtyフラグを含むオブジェクトを受け取ります。これらの2つのメソッドを併用することで、自動保存機能を実装することができます。以下は、Reactアプリケーションで自動保存機能を実装するサンプルです。この方法は、Angular、Vue、およびPureJSアプリケーションでも同じように使用できます。

import {
  Designer as ReportDesigner,
  templates,
} from "@mescius/activereportsjs/reportdesigner";
import React, { Fragment } from "react";
import "@mescius/activereportsjs/styles/ar-js-ui.css";
import "@mescius/activereportsjs/styles/ar-js-designer.css";

export const DesignerHost: React.FC = () => {
  const designerRef = React.useRef<ReportDesigner | undefined>();
  React.useEffect(() => {
    designerRef.current = new ReportDesigner("#designer-host");

    // onSaveおよびonSaveAsアクションハンドラはここで定義されます。

    const saveIntervalId = setInterval(async () => {
      const reportInfo = await designerRef.current?.getReport();
      if (reportInfo?.isDirty) {
        designerRef.current?.processCommand("save");
      }
    }, 2000);
    return () => clearInterval(saveIntervalId);
  }, []);
  return (
   <div id="designer-host"></div>
  );
};

関連トピック