Files
mvd_tcg_deck/views/mvd_tcg_deck_views.xml
2026-04-03 23:08:57 +02:00

500 lines
23 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="mvd_tcg_deck_view_search" model="ir.ui.view">
<field name="name">mvd.tcg.deck.view.search</field>
<field name="model">mvd.tcg.deck</field>
<field name="arch" type="xml">
<search string="Decks">
<field name="name"/>
<field name="game_id"/>
<field name="user_id"/>
<separator/>
<filter name="filter_my_decks" string="My Decks" domain="[('user_id', '=', uid)]"/>
<filter name="filter_archived" string="Archived" domain="[('active', '=', False)]"/>
<group>
<filter name="group_by_game" string="Game" context="{'group_by': 'game_id'}"/>
<filter name="group_by_owner" string="Owner" context="{'group_by': 'user_id'}"/>
</group>
</search>
</field>
</record>
<record id="mvd_tcg_deck_line_view_search" model="ir.ui.view">
<field name="name">mvd.tcg.deck.line.view.search</field>
<field name="model">mvd.tcg.deck.line</field>
<field name="arch" type="xml">
<search string="Deck Lines">
<field name="card_id"/>
<field name="deck_id"/>
<field name="board_id"/>
<field name="role_ids"/>
<separator/>
<filter name="filter_with_roles" string="With Roles" domain="[('role_ids', '!=', False)]"/>
<group>
<filter name="group_by_deck" string="Deck" context="{'group_by': 'deck_id'}"/>
<filter name="group_by_board" string="Board" context="{'group_by': 'board_id'}"/>
<filter name="group_by_primary_role" string="Primary Role" context="{'group_by': 'primary_role_id'}"/>
</group>
</search>
</field>
</record>
<record id="mvd_tcg_deck_view_kanban" model="ir.ui.view">
<field name="name">mvd.tcg.deck.view.kanban</field>
<field name="model">mvd.tcg.deck</field>
<field name="arch" type="xml">
<kanban sample="1">
<field name="name"/>
<field name="cover_image"/>
<field name="game_id"/>
<field name="total_card_count"/>
<field name="distinct_card_count"/>
<field name="board_count"/>
<field name="user_id"/>
<templates>
<t t-name="card">
<div class="oe_kanban_global_click rounded overflow-hidden border">
<div class="row g-0">
<div class="col-4 bg-light">
<t t-if="record.cover_image.raw_value">
<field name="cover_image" widget="image" class="w-100 h-100"/>
</t>
<t t-else="">
<div class="d-flex align-items-center justify-content-center h-100 text-muted p-3">
<span>No cover</span>
</div>
</t>
</div>
<div class="col-8 p-3">
<div class="fw-bold mb-1">
<field name="name"/>
</div>
<div class="text-muted mb-2">
<field name="game_id"/> · <field name="user_id"/>
</div>
<div class="d-flex flex-wrap gap-1 small">
<span class="badge rounded-pill text-bg-light">
<field name="total_card_count"/> cards
</span>
<span class="badge rounded-pill text-bg-light">
<field name="distinct_card_count"/> distinct
</span>
<span class="badge rounded-pill text-bg-light">
<field name="board_count"/> boards
</span>
</div>
</div>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record id="mvd_tcg_deck_view_list" model="ir.ui.view">
<field name="name">mvd.tcg.deck.view.list</field>
<field name="model">mvd.tcg.deck</field>
<field name="arch" type="xml">
<list string="Decks">
<field name="name"/>
<field name="game_id"/>
<field name="user_id" optional="show"/>
<field name="board_count" optional="show"/>
<field name="total_card_count"/>
<field name="distinct_card_count" optional="show"/>
<field name="write_date" optional="hide"/>
</list>
</field>
</record>
<record id="mvd_tcg_deck_board_view_list" model="ir.ui.view">
<field name="name">mvd.tcg.deck.board.view.list</field>
<field name="model">mvd.tcg.deck.board</field>
<field name="arch" type="xml">
<list editable="bottom">
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="include_in_total"/>
<field name="total_card_count" string="Cards"/>
<field name="distinct_card_count" string="Distinct" optional="show"/>
</list>
</field>
</record>
<record id="mvd_tcg_deck_board_view_form" model="ir.ui.view">
<field name="name">mvd.tcg.deck.board.view.form</field>
<field name="model">mvd.tcg.deck.board</field>
<field name="arch" type="xml">
<form string="Deck Board">
<sheet>
<div class="oe_button_box" name="button_box">
<button
name="action_open_line_manager"
type="object"
class="oe_stat_button"
icon="fa-list"
>
<div class="o_stat_info">
<span class="o_stat_text">Manage Lines</span>
</div>
</button>
</div>
<div class="oe_title">
<label for="name" string="Board"/>
<h1>
<field name="name"/>
</h1>
</div>
<group>
<group>
<field name="deck_id"/>
<field name="sequence"/>
</group>
<group>
<field name="include_in_total"/>
<field name="total_card_count" readonly="1"/>
<field name="distinct_card_count" readonly="1"/>
</group>
</group>
<notebook>
<page string="Cards" name="cards">
<field name="line_ids" nolabel="1" mode="list,form">
<list editable="bottom" default_order="sequence, id">
<field name="sequence" widget="handle"/>
<field
name="card_image_128"
widget="mvd_deck_zoom_image"
optional="show"
options="{'preview_image': 'card_image_1920', 'zoom': true, 'zoom_delay': 0, 'size': [0, 96]}"
/>
<field name="quantity"/>
<field name="card_id"/>
<field name="role_ids" widget="many2many_tags" options="{'color_field': 'color'}" optional="show"/>
<field name="note" optional="show"/>
</list>
</field>
</page>
<page string="Notes" name="notes">
<field name="note" nolabel="1"/>
</page>
<page
string="Technical"
name="technical"
groups="mvd_tcg_base.mvd_tcg_base_group_administrator,base.group_system"
>
<group>
<field name="code"/>
</group>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="mvd_tcg_deck_line_view_list" model="ir.ui.view">
<field name="name">mvd.tcg.deck.line.view.list</field>
<field name="model">mvd.tcg.deck.line</field>
<field name="arch" type="xml">
<list editable="bottom" default_order="primary_role_sequence, board_sequence, sequence, id">
<field name="board_sequence" column_invisible="True"/>
<field name="sequence" widget="handle"/>
<field name="board_id"/>
<field
name="card_image_128"
widget="mvd_deck_zoom_image"
optional="show"
options="{'preview_image': 'card_image_1920', 'zoom': true, 'zoom_delay': 0, 'size': [0, 96]}"
/>
<field name="quantity"/>
<field name="card_id"/>
<field name="primary_role_id" optional="show"/>
<field name="role_ids" widget="many2many_tags" options="{'color_field': 'color'}" optional="show"/>
<field name="note" optional="show"/>
</list>
</field>
</record>
<record id="mvd_tcg_deck_line_view_form" model="ir.ui.view">
<field name="name">mvd.tcg.deck.line.view.form</field>
<field name="model">mvd.tcg.deck.line</field>
<field name="arch" type="xml">
<form string="Deck Entry">
<sheet>
<div class="oe_button_box" name="button_box">
<button
name="action_open_line"
type="object"
class="oe_stat_button"
icon="fa-external-link"
>
<div class="o_stat_info">
<span class="o_stat_text">Open</span>
</div>
</button>
</div>
<div class="d-flex gap-3 align-items-start">
<field
name="card_image_512"
widget="mvd_deck_zoom_image"
class="oe_avatar"
nolabel="1"
options="{'preview_image': 'card_image_1920', 'zoom': true, 'zoom_delay': 0, 'size': [220, 306], 'img_class': 'rounded border'}"
readonly="1"
/>
<div class="oe_title flex-grow-1">
<label for="card_id" string="Card"/>
<h1>
<field name="card_id"/>
</h1>
<div class="d-flex gap-2 flex-wrap">
<field name="board_id" widget="badge"/>
<field name="quantity" widget="badge"/>
</div>
</div>
</div>
<group>
<group>
<field name="board_id"/>
<field name="quantity"/>
</group>
<group>
<field name="primary_role_id" readonly="1"/>
<field name="role_ids" widget="many2many_tags" options="{'color_field': 'color'}"/>
</group>
</group>
<group col="1">
<field name="note" placeholder="Add an internal note for this deck entry."/>
</group>
</sheet>
</form>
</field>
</record>
<record id="mvd_tcg_deck_role_view_list" model="ir.ui.view">
<field name="name">mvd.tcg.deck.role.view.list</field>
<field name="model">mvd.tcg.deck.role</field>
<field name="arch" type="xml">
<list string="Deck Roles">
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="color" widget="color_picker" optional="show"/>
<field name="active" optional="show"/>
</list>
</field>
</record>
<record id="mvd_tcg_deck_role_view_form" model="ir.ui.view">
<field name="name">mvd.tcg.deck.role.view.form</field>
<field name="model">mvd.tcg.deck.role</field>
<field name="arch" type="xml">
<form string="Deck Role">
<sheet>
<div class="oe_title">
<label for="name" string="Role"/>
<h1>
<field name="name"/>
</h1>
</div>
<group>
<group>
<field name="sequence"/>
<field name="active"/>
</group>
<group>
<field name="color" widget="color_picker"/>
</group>
</group>
<group col="1">
<field name="note" nolabel="1" placeholder="Describe what this role should represent in deck construction."/>
</group>
<group
string="Technical"
groups="mvd_tcg_base.mvd_tcg_base_group_administrator,base.group_system"
>
<field name="technical_key"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="mvd_tcg_deck_view_form" model="ir.ui.view">
<field name="name">mvd.tcg.deck.view.form</field>
<field name="model">mvd.tcg.deck</field>
<field name="arch" type="xml">
<form string="Deck">
<sheet>
<widget name="web_ribbon" title="Archived" bg_color="text-bg-danger" invisible="active"/>
<div class="oe_button_box" name="button_box">
<button
name="action_open_cards"
type="object"
class="oe_stat_button"
icon="fa-clone"
>
<field name="distinct_card_count" string="Cards" widget="statinfo"/>
</button>
<button
name="action_open_add_to_deck_wizard"
type="object"
class="oe_stat_button"
icon="fa-plus-square"
>
<div class="o_stat_info">
<span class="o_stat_text">Add Card</span>
</div>
</button>
<button
name="action_open_line_manager"
type="object"
class="oe_stat_button"
icon="fa-list"
>
<div class="o_stat_info">
<span class="o_stat_text">Manage Lines</span>
</div>
</button>
<button
name="action_open_deck_import_wizard"
type="object"
class="oe_stat_button"
icon="fa-sign-in"
>
<div class="o_stat_info">
<span class="o_stat_text">Import List</span>
</div>
</button>
<button
name="action_open_deck_export_wizard"
type="object"
class="oe_stat_button"
icon="fa-sign-out"
>
<div class="o_stat_info">
<span class="o_stat_text">Export List</span>
</div>
</button>
<button
name="action_seed_default_boards"
type="object"
class="oe_stat_button"
icon="fa-columns"
invisible="board_count != 0"
>
<div class="o_stat_info">
<span class="o_stat_text">Create Default Boards</span>
</div>
</button>
</div>
<div class="d-flex gap-3 align-items-start mb-3">
<field
name="cover_image"
widget="image"
class="oe_avatar"
nolabel="1"
options="{'size': [220, 306], 'img_class': 'rounded border'}"
/>
<div class="oe_title flex-grow-1">
<h1 class="mb-1">
<field name="name"/>
</h1>
<div class="d-flex gap-2 flex-wrap align-items-center">
<field name="game_id" widget="badge"/>
<field name="user_id" widget="badge"/>
</div>
<div class="mt-3 d-flex flex-wrap gap-2">
<span class="badge rounded-pill text-bg-light">
<strong class="me-1">Boards</strong>
<field name="board_count"/>
</span>
<span class="badge rounded-pill text-bg-light">
<strong class="me-1">Cards</strong>
<field name="total_card_count"/>
</span>
<span class="badge rounded-pill text-bg-light">
<strong class="me-1">Distinct</strong>
<field name="distinct_card_count"/>
</span>
</div>
</div>
</div>
<notebook>
<page string="Overview" name="overview">
<group>
<group>
<field name="game_id"/>
<field name="user_id" readonly="1"/>
<field name="active"/>
</group>
<group>
<field name="board_count" readonly="1"/>
<field name="total_card_count" readonly="1"/>
<field name="distinct_card_count" readonly="1"/>
</group>
</group>
<group col="1">
<field
name="description"
widget="html"
nolabel="1"
placeholder="Describe the deck plan, power level, win conditions or upgrade path."
/>
</group>
</page>
<page string="Boards" name="boards">
<field name="board_ids" nolabel="1" mode="list,form"/>
</page>
<page string="All Cards" name="cards">
<field name="line_ids" nolabel="1" mode="list"/>
</page>
<page string="Notes" name="notes">
<field name="note" placeholder="Add internal deck notes."/>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="mvd_tcg_deck_line_action" model="ir.actions.act_window">
<field name="name">Deck Lines</field>
<field name="res_model">mvd.tcg.deck.line</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="mvd_tcg_deck.mvd_tcg_deck_line_view_search"/>
</record>
<record id="mvd_tcg_deck_role_action" model="ir.actions.act_window">
<field name="name">Deck Roles</field>
<field name="res_model">mvd.tcg.deck.role</field>
<field name="view_mode">list,form</field>
</record>
<record id="mvd_tcg_deck_action" model="ir.actions.act_window">
<field name="name">Decks</field>
<field name="res_model">mvd.tcg.deck</field>
<field name="view_mode">kanban,list,form</field>
<field name="view_id" ref="mvd_tcg_deck.mvd_tcg_deck_view_kanban"/>
<field name="search_view_id" ref="mvd_tcg_deck.mvd_tcg_deck_view_search"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new deck
</p>
<p>
Decks stay game-neutral. Boards organize the cards inside one deck,
while game adapters can later add format- and rules-specific behavior.
</p>
</field>
</record>
<menuitem
id="mvd_tcg_deck_roles_menu"
name="Deck Roles"
parent="mvd_tcg_base.mvd_tcg_operations_menu"
sequence="20"
action="mvd_tcg_deck.mvd_tcg_deck_role_action"
groups="mvd_tcg_base.mvd_tcg_base_group_manager,base.group_system"
/>
</odoo>