umbraco-workspace について
コンテンツ、メディア、メンバーなどの編集に使う Umbraco ワークスペースの構築を支援する開発スキルです。default と routable の選択から、コンテキスト、ビュー、アクション、プロジェクト設定まで扱います。
主な機能
- 01default と routable の種類選択をガイド
- 02コンテキスト、ビュー、アクションの実装パターン
- 03さまざまなエンティティタイプのワークスペースに対応
- 04拡張機能を Umbraco プロジェクトに接続する手順
- 05最新ドキュメントとソース例を参照
活用シーン
- 01エンティティタイプ用のワークスペース作成
- 02ツリーナビゲーション連動の編集機能追加
- 03ワークスペースのビューとアクションの設計
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ umbraco/ umbraco-cms-backoffice-skills --skill umbraco-workspaceインストール後、Claude Code で/umbraco-workspaceを入力して読み込まれたか確認します。
詳細
Umbraco ワークスペース
これは何ですか?
ワークスペースは、Umbraco の特定のエンティティタイプ向けに設計された専用の編集環境です。コンテンツ、メディア、メンバー、その他のエンティティを、タイプごとに特化したインターフェースで編集できる分離された領域を作成します。ワークスペースは、公開バージョンとは別にエンティティデータの下書きコピーを保持し、コンテキスト、ビュー、アクション、フッターアプリなど複数の拡張タイプをサポートします。
ドキュメント
実装する前に、常に最新のドキュメントを取得してください:
- メインドキュメント: https://docs.umbraco.com/umbraco-cms/extend-your-project/backoffice-extensions/extending-overview/extension-types/workspaces
- ワークスペースコンテキスト: https://docs.umbraco.com/umbraco-cms/extend-your-project/backoffice-extensions/extending-overview/extension-types/workspaces/workspace-context
- ワークスペースビュー: https://docs.umbraco.com/umbraco-cms/extend-your-project/backoffice-extensions/extending-overview/extension-types/workspaces/workspace-views
- ワークスペースアクション: https://docs.umbraco.com/umbraco-cms/extend-your-project/backoffice-extensions/extending-overview/extension-types/workspaces/workspace-editor-actions
- 基盤: https://docs.umbraco.com/umbraco-cms/extend-your-project/backoffice-extensions/foundation
- 拡張レジストリ: https://docs.umbraco.com/umbraco-cms/extend-your-project/backoffice-extensions/extending-overview/extension-registry
重要: ワークスペースの種類
kind: 'default' と kind: 'routable'
| 機能 | kind: 'default' | kind: 'routable' |
|---|---|---|
| 用途 | 静的ページ、ルートワークスペース | 一意の ID を持つエンティティの編集 |
| ツリー連携 | 選択状態なし | 適切な選択状態 |
| URL ルーティング | ルートパラメータなし | edit/:unique をサポート |
| コンテキスト | シンプル | unique observable を持つ |
ツリー項目のナビゲーションには、常に kind: 'routable' を使用してください - そうしないと:
- 項目間をクリックしてもツリー項目の選択が更新されません
- 同じタイプの項目間のナビゲーションが機能しません
- 「永久に読み込み中」が発生することがあります
ルーティング可能なワークスペースコンテキストのパターン
kind: 'routable' のワークスペースでは、ワークスペースコンテキストクラスを作成する必要があります:
import { UmbWorkspaceRouteManager, UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace';
import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import { UmbContextBase } from '@umbraco-cms/backoffice/class-api';
import { LitElement, html } from '@umbraco-cms/backoffice/external/lit';
import { customElement } from '@umbraco-cms/backoffice/external/lit';
// Workspace editor element that renders views
@customElement('my-workspace-editor')
class MyWorkspaceEditorElement extends LitElement {
override render() {
return html`<umb-workspace-editor></umb-workspace-editor>`;
}
}
interface MyEntityData {
unique: string;
name?: string;
}
export class MyWorkspaceContext extends UmbContextBase {
public readonly workspaceAlias = 'My.Workspace';
#data = new UmbObjectState<MyEntityData | undefined>(undefined);
readonly data = this.#data.asObservable();
// CRITICAL: Observable unique for workspace views to consume
readonly unique = this.#data.asObservablePart((data) => data?.unique);
readonly name = this.#data.asObservablePart((data) => data?.name);
readonly routes = new UmbWorkspaceRouteManager(this);
constructor(host: UmbControllerHost) {
super(host, UMB_WORKSPACE_CONTEXT);
// Route pattern for tree item navigation
this.routes.setRoutes([
{
path: 'edit/:unique',
component: MyWorkspaceEditorElement,
setup: (_component, info) => {
const unique = info.match.params.unique;
this.load(unique);
},
},
]);
}
async load(unique: string) {
// Load entity data and update state
this.#data.setValue({ unique });
}
getUnique() {
return this.#data.getValue()?.unique;
}
getEntityType() {
return 'my-entity'; // Must match tree item entityType!
}
public override destroy(): void {
this.#data.destroy();
super.destroy();
}
}
export { MyWorkspaceContext as api };
コンテキストを利用するワークスペースビュー
ワークスペースビューは、ナビゲーションに反応するためにコンテキストの unique を監視します:
import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace';
override connectedCallback() {
super.connectedCallback();
this.consumeContext(UMB_WORKSPACE_CONTEXT, (context) => {
if (!context) return;
// Observe unique - will fire when navigating between items
this.observe((context as any).unique, (unique: string | null) => {
if (unique) {
this._loadData(unique);
}
});
});
}
参照例
Umbraco のソースには動作する例が含まれています:
ワークスペースコンテキストカウンター: /Umbraco-CMS/src/Umbraco.Web.UI.Client/examples/workspace-context-counter/
この例では、コンテキスト、ビュー、フッターアプリを備えたワークスペースを紹介します。ユニットテストも含まれます。
ワークスペースコンテキストの初期名: /Umbraco-CMS/src/Umbraco.Web.UI.Client/examples/workspace-context-initial-name/
この例では、ワークスペースコンテキストの初期化パターンを示します。
ワークスペースビューヒント: /Umbraco-CMS/src/Umbraco.Web.UI.Client/examples/workspace-view-hint/
この例では、ワークスペースビューのヒントとメタデータを紹介します。
関連する基盤スキル
ワークスペースを実装する際にこれらの基盤となる概念を説明する必要がある場合は、以下のスキルを参照してください:
-
Context API: ワークスペースコンテキストの実装、コンテキストの利用、またはワークスペース拡張の通信を説明する場合
- 参照スキル:
umbraco-context-api
- 参照スキル:
-
状態管理: 下書き状態、observable、リアクティブ更新、またはワークスペースデータ管理を実装する場合
- 参照スキル:
umbraco-state-management
- 参照スキル:
-
Umbraco Element: ワークスペースビュー要素の実装、UmbElementMixin の説明、またはワークスペースコンポーネントの作成を行う場合
- 参照スキル:
umbraco-umbraco-element
- 参照スキル:
-
コントローラー: ワークスペースアクション、コントローラー、副作用、またはアクションロジックを実装する場合
- 参照スキル:
umbraco-controllers
- 参照スキル:
-
ツリー: ワークスペースがツリーナビゲーションにリンクされている場合
- 参照スキル:
umbraco-tree
- 参照スキル:
ワークフロー
- ドキュメントを取得 - 上記のドキュメント URL に対して WebFetch を使用し、最新のコード例とパターンを取得します
- 質問する - どのエンティティ型ですか?どのビューが必要ですか?どのアクションが必要ですか?これはツリーにリンクされていますか?
- kind を選択 - ツリーナビゲーションには
kind: 'routable'を、静的ページにはkind: 'default'を使用します - ファイルを生成 - 取得したドキュメントに基づいて、マニフェスト + ワークスペースコンテキスト + ビュー + アクションを作成します
- プロジェクト参照を追加 - 拡張機能が動作するには、メインの Umbraco プロジェクトから参照される必要があります:
- 現在の作業ディレクトリで
.csprojファイルを検索します - Umbraco インスタンスがちょうど 1 つ見つかった場合は、それに参照を追加します
- Umbraco インスタンスが複数見つかった場合は、どれを使用するかをユーザーに尋ねます
- Umbraco インスタンスが見つからない場合は、パスをユーザーに尋ねます
- 現在の作業ディレクトリで
- 説明 - 何が作成されたか、およびテスト方法を示します
最小限のマニフェスト例
export const manifests: UmbExtensionManifest[] = [
// Routable workspace for tree integration
{
type: 'workspace',
kind: 'routable',
alias: 'My.Workspace',
name: 'My Workspace',
api: () => import('./my-workspace.context.js'),
meta: {
entityType: 'my-entity', // Must match tree item entityType!
},
},
// Workspace view
{
type: 'workspaceView',
alias: 'My.WorkspaceView',
name: 'My Workspace View',
element: () => import('./my-workspace-view.element.js'),
weight: 100,
meta: {
label: 'Details',
pathname: 'details',
icon: 'icon-info',
},
conditions: [
{
alias: 'Umb.Condition.WorkspaceAlias',
match: 'My.Workspace',
},
],
},
];
コードを生成する前に、常に最新のドキュメントを取得してください - API とパターンが変更されている可能性があります。