0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AuraにはContentDocumentを表示するfileCardというコンポーネントがありますが、LWCにはありません。
ideasには2020年から上がっていますが、採用されるかどうかも不明です。
であるならば、自分で作った方が良さそうです。

AuraのfileCardについて

Auraの標準コンポーネントのfileCardは、LDS(Lightning Design System)のfileのデザインで、サムネイルとファイルアイコン、説明が表示されます。サムネイルをクリックするとプレビューが表示されます。
下記はAuraのfileCardの使用例です。

スクリーンショット 2025-01-30 19.27.19.png
image.png

<lightning:fileCard fileId="069XXXXXXXXXXXXXXX" description="description"></lightning:fileCard>

LWCでfileCardを実装する

HTMLとCSSは単にLDSのfileそのままです。

fileCard.hhtml
<template>
    <div class="slds-file slds-file_card slds-has-title file-card">
        <figure>
            <a class="slds-file__crop" onclick={previewFile}>
                <span class="slds-assistive-text">Preview:</span>
                <img src={src} />
            </a>
            <figcaption class="slds-file__title slds-file__title_card">
                <div class="slds-media slds-media_small slds-media_center">
                    <div class="slds-media__figure slds-line-height_reset">
                        <lightning-icon icon-name={iconName} size="x-small"></lightning-icon>
                    </div>
                    <div class="slds-media__body">
                        <span class="slds-file__text slds-truncate" title={title}>{title}</span>
                    </div>
                </div>
            </figcaption>
        </figure>
    </div>
</template>
fileCard.css
.file-card {
    width: 20rem;
}

サムネイルには/sfc/servlet.shepherd/version/renditionDownload?rendition={種別}&versionId={ContentVersionId}を使用します。このURLにアクセスすることでContentVersionのプレビューを取得できます。

クリック時にはNavigationを使用してファイルを開きます。詳細はこちら

この記事で紹介するサーブレットURLは公式にサポートされているものではなく、予告なく変更される可能性があります。

fileCard.js
import { LightningElement, api, wire } from "lwc";
import { NavigationMixin } from "lightning/navigation";
import { getRecord, getFieldValue } from "lightning/uiRecordApi";
import DOCUMENT_VERSION_ID_FIELD from "@salesforce/schema/ContentDocument.LatestPublishedVersionId";
import DOCUMENT_TITLE_FIELD from "@salesforce/schema/ContentDocument.Title";
import DOCUMENT_FILE_TYPE_FIELD from "@salesforce/schema/ContentDocument.FileType";
import getIconName from "./fileIcons.js";

const RENDITION = "THUMB240BY180";
const FIELDS = [DOCUMENT_VERSION_ID_FIELD, DOCUMENT_TITLE_FIELD, DOCUMENT_FILE_TYPE_FIELD];

/**
 * @typedef {Object} ContentDocument
 * @property {string} Id
 * @property {string} LatestPublishedVersionId
 * @property {string} Title
 * @prop {string} FileType
 */

/**
 * {@link https://www.lightningdesignsystem.com/components/files/}
 */
export default class FileCard extends NavigationMixin(LightningElement) {
    @api fileId;
    @api description;
    rendition = RENDITION;

    /** @type {ContentDocument} */
    @wire(getRecord, { recordId: "$fileId", fields: FIELDS })
    document;

    get title() {
        return this.description ? this.description : getFieldValue(this.document.data, DOCUMENT_TITLE_FIELD);
    }

    get versionId() {
        return getFieldValue(this.document.data, DOCUMENT_VERSION_ID_FIELD);
    }

    get fileType() {
        return getFieldValue(this.document.data, DOCUMENT_FILE_TYPE_FIELD);
    }

    get src() {
        return `/sfc/servlet.shepherd/version/renditionDownload?rendition=${this.rendition}&versionId=${this.versionId}&operationContext=CHATTER&contentId=${this.fileId}`;
    }

    get iconName() {
        return getIconName(this.fileType);
    }

    previewFile() {
        this[NavigationMixin.Navigate]({
            type: "standard__namedPage",
            attributes: {
                pageName: "filePreview"
            },
            state: {
                selectedRecordId: this.fileId
            }
        });
    }
}

ファイルアイコンはLDSのiconsを使用します。

fileIcons.js
/**
 * {@link https://www.lightningdesignsystem.com/icons/#doctype}
 */
const doctypeIcon = {
    CSV: "doctype:csv",
    EXCEL: "doctype:excel",
    IMAGE: "doctype:image",
    PDF: "doctype:pdf",
    PPT: "doctype:ppt",
    TXT: "doctype:txt",
    UNKNOWN: "doctype:unknown",
    WORD: "doctype:word",
    XML: "doctype:xml",
    ZIP: "doctype:zip"
};

export default function getIconName(fileType) {
    switch (fileType) {
        // PDF
        case "PDF":
            return doctypeIcon.PDF;
        // microsoft
        case "EXCEL":
        case "EXCEL_X":
            return doctypeIcon.EXCEL;
        case "WORD":
        case "WORD_X":
            return doctypeIcon.WORD;
        case "POWER_POINT":
        case "POWER_POINT_X":
            return doctypeIcon.PPT;
        // テキスト
        case "CSV":
            return doctypeIcon.CSV;
        case "JSON":
            return doctypeIcon.UNKNOWN;
        case "XML":
            return doctypeIcon.XML;
        case "TEXT":
            return doctypeIcon.TXT;
        // 画像
        case "IMAGE":
        case "GIF":
        case "JFIF":
        case "PNG":
            return doctypeIcon.IMAGE;
        // 書庫ファイル
        case "ZIP":
            return doctypeIcon.ZIP;
        // その他
        default:
            return doctypeIcon.UNKNOWN;
    }
}

参照

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?