Skip to content

New Report Type: Section Report #7

@hidakatsuya

Description

@hidakatsuya

これは v1.0 における 機能の実装コンセプト であり、この内容を基にユーザからのフィードバックを得てよりよい仕様を議論し、
導き出すことが目的。コメント欄での議論により、内容は適宜更新される。また、技術的な制約など、実際の機能が必ずしもコンセプト通りになるとは限らない。


Summary

  • 現在のレイアウト形式(単票レイアウトと呼ぶ)とは別に用意する新しいレイアウト形式
  • セクションレイアウトと呼ぶ
  • 新規作成時にレイアウトフォーマットが 単票 or セクション かを選択することができる

Why?

  • 現在のレイアウトフォーマットは「単票フォーマット」と言える
  • レイアウト定義時点で用紙の高さによる制約がある
  • この仕様で、一覧表などの動的なレイアウトを実現しようとすると現状リストツールを使うわけだが、高さが固定されているレイアウトの中で高さが動的に決まる結果を実現しようとしているため、Generator 自体の実装も、これを使った PDF 出力処理もかなり複雑になってしまう
  • これを解決するために、レイアウト定義時点でページの制約をなくし、出力した結果によってページを決めるレイアウトフォーマットを新たに用意し、用途によって「単票フォーマット(現状)」「セクションフォーマット」を選択できるようにしてはどうか

Features

  • セクションを定義し、それらを組み合わせて出力する
  • セクションには、ヘッダー/繰り返し行/フッターがある
  • ヘッダー/フッターは [最初のページに表示する]/[毎ページ表示する] を制御できる
  • 繰り返し行は複数定義できる
  • レイアウト定義時のページ幅は選択した用紙幅になる
  • レイアウト定義時のページの高さはないが、出力したページの高さは用紙の高さになる
  • 描画した結果、ページの高さから溢れる場合は自動的に改ページされる

Section

Header Section

  • ページの先頭に表示されるセクション。繰り返し行の前に表示される
  • 設定によって [最初のページのみ][毎ページ] を設定することができる
  • id をつけて複数定義できる

Property

Property Default Description
表示 true 表示するかどうか
高さ -- セクションの高さを px/mm で設定する
表示位置 毎ページ [毎ページ] または [最初のページのみ] 表示するかを設定する
id Empty ruby から操作する際の id

Footer Section

  • ページの末尾に追加されるセクション。繰り返し行の後に表示される
  • 設定によって [最後のページのみ][毎ページ] を設定することができる
  • id をつけて複数定義できる

Property

Property Default Description
表示 true 表示するかどうか
高さ -- セクションの高さを px/mm で設定する
表示位置 毎ページ [毎ページ] または [最後のページのみ] 表示するかを設定する
下部に固定 false 下部に固定するかどうか
id Empty ruby から操作する際の id

Detail Section

  • ヘッダーの後に追加されるセクション
  • id をつけて複数定義できる

Property

Property Default Description
高さ -- セクションの高さを px/mm で設定する
自動拡張 false 内容に応じて高さを拡張する
id "default" ruby から操作する際の id。 "default" の場合は id を省略できる
  • 表示設定はできない

Rendering Order

セクションは以下の順序で描画される。

  1. ヘッダーセクション
  2. 繰り返しセクション
  3. フッターセクション

ヘッダー/フッターは自動的に描画される。その描画順序は定義順となる。

Concept for Editor

新規作成時のレイアウトフォーマット選択

new_reports

セクションレイアウトフォーマット

list-layout-format 2

  • セクションの並び順は左の [=] をドラッグして変更できるが、ヘッダー・繰り返し行・フッターという順序を超えることはできない
  • セクションは右の [+] によって、同じ種類のセクションを追加することができる
  • 右端の [x] によって、セクションを削除することができるが、ヘッダー・繰り返し行・フッターそれぞれ最後の一つは削除することができない

Concept for API

require 'thinreports'

report_params = {
  type: :section,
  layout: '/path/to/section_layout.tlf',
  params: {
    start_page_number: 1,
    groups: [
      {
        headers: {
          default: {
            items: {
              no: estimate.no
            }
          },
          estimate_header: {
            items: {
              user_name: user.name,
              total_price: estimate.total_price,
              logo: user.logo.path,
              stamp: estimate.stamp.path
            }
          },
          foo: {
            enabled: true
          }
        },
        details: [
          {
            id: :default,
            items: {
              no: 11,
              name: { value: 'hoge', style: { color: 'red' } },
              price: 1000
            }
          },
          {
            id: :total,
            items: {
              price: { value: 'hoge', display: false }
            }
          }
        ],
        footers: {
          sub_footer: {
            no: estimate.no
          }
        }
      }
    ]
  }
}

Thinreports.generate(report_params, filename: 'foo.tlf')

Layout Schema

{
  "version": "0.0.0",
  "title": "Report Title",
  "report": {
    "paper-type": "A4",
    "width": 0.0,
    "height": 0.0,
    "orientation": "landscape",
    "margin": [0.0, 0.0, 0.0, 0.0]
  },
  "state": {
    "layout-guides": [
      { "type": "x", "position": 0.0 }
    ]
  },
  "sections": [
    {
      "id": "hoge",
      "type": "header",
      "height": 100.0,
      "display": true, # for header and footer
      "every-page": true, # for header
      "fixed-bottom": true, # for footer
      "auto-expand": true, # for detail
      "items": [
         { "type": "rect", "x": 100.0, "y": <relative x position>,... }
      ]
    }
  ]
}

セクションプロパティの仕様
https://docs.google.com/spreadsheets/d/1Qo1yLt5zIgM1uFc9zHcswhd36e8GaLakOFtpKlZbObc/edit#gid=0

Limitation

  • List is not supported
  • 作成後の通常/セクションフォーマットの切り替えはできない

やらないこと

  • セクションの表示/非表示の動的切り替え

Editor

  • セクションの並び替え
  • セクションの使う/使わないの切り替え(item がなければ保存しない)
  • フッターの下部固定表示のOn/Offで表示を変えない

Note

img_0815

Metadata

Metadata

Assignees

No one assigned

    Labels

    rfcConcept for new feature

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions