🎉 Initialize module repository

This commit is contained in:
Marc Wempe
2026-04-03 23:08:57 +02:00
commit d81e8a87e3
25 changed files with 4584 additions and 0 deletions

11
views/menu_views.xml Normal file
View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<menuitem
id="mvd_tcg_decks_menu"
name="All Decks"
parent="mvd_tcg_base.mvd_tcg_operations_menu"
sequence="10"
action="mvd_tcg_deck.mvd_tcg_deck_action"
groups="mvd_tcg_base.mvd_tcg_base_group_manager,base.group_system"
/>
</odoo>

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="mvd_tcg_add_to_deck_view_form" model="ir.ui.view">
<field name="name">mvd.tcg.add.to.deck.view.form</field>
<field name="model">mvd.tcg.add.to.deck</field>
<field name="arch" type="xml">
<form string="Add to Deck">
<group>
<field name="card_id"/>
<field name="deck_id"/>
<field name="board_id"/>
<field name="quantity"/>
<field name="role_ids" widget="many2many_tags" options="{'color_field': 'color'}"/>
<field name="note"/>
</group>
<footer>
<button name="action_add_to_deck" type="object" string="Add" class="btn-primary"/>
<button string="Cancel" class="btn-secondary" special="cancel"/>
</footer>
</form>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="mvd_tcg_card_view_form_deck_inherit" model="ir.ui.view">
<field name="name">mvd.tcg.card.view.form.deck.inherit</field>
<field name="model">mvd.tcg.card</field>
<field name="inherit_id" ref="mvd_tcg_base.mvd_tcg_card_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='button_box']" position="inside">
<button
name="action_open_decks"
type="object"
class="oe_stat_button"
icon="fa-layer-group"
>
<field name="deck_count" string="Decks" widget="statinfo"/>
</button>
</xpath>
<xpath expr="//header" position="inside">
<button
name="action_open_add_to_deck_wizard"
string="Add to Deck"
type="object"
class="btn-secondary"
/>
</xpath>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="mvd_tcg_deck_text_transfer_view_form" model="ir.ui.view">
<field name="name">mvd.tcg.deck.text.transfer.view.form</field>
<field name="model">mvd.tcg.deck.text.transfer</field>
<field name="arch" type="xml">
<form string="Deck List Transfer">
<group>
<group>
<field name="operation"/>
<field name="deck_id"/>
<field name="game_id"/>
</group>
<group>
<field
name="replace_existing"
invisible="operation != 'import'"
/>
</group>
</group>
<group col="1">
<field
name="line_text"
nolabel="1"
readonly="operation == 'export'"
placeholder="# Mainboard&#10;1 Card Name&#10;1 Another Card (TDM 101)&#10;# Sideboard&#10;1 Third Card"
/>
</group>
<footer>
<button
name="action_apply_text_transfer"
type="object"
string="Apply"
class="btn-primary"
invisible="operation != 'import'"
/>
<button
string="Close"
class="btn-primary"
special="cancel"
invisible="operation != 'export'"
/>
<button
string="Cancel"
class="btn-secondary"
special="cancel"
invisible="operation == 'export'"
/>
</footer>
</form>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,499 @@
<?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>