* web, web_editor, website, website_theme_install, portal, theme_default, theme_bootswatch The purpose of this task is to make the customize dialog as generic as possible, that is theme-independant: 1) The design is now totally generic (Odoo visuals) 2) The XML definition is form-view like. This allows themes to extend the dialog without any risk of breaking the style and also allows to not care about lots of technical details. 3) New options have been included. Those were themes options that are now generic and which themes can simply adapt without touching the customize modal (navbar colors, footer color, navbar layout, fonts, body background, ...). The color palette can now also be customized with user colors. Using sass functionnalities, color palettes and fonts integration is now a lot better. Thanks to @qha-odoo for the original design. task-31677
101 lines
5.8 KiB
XML
101 lines
5.8 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<odoo>
|
|
<!-- Custom module kanban : install button (even if already installed) which redirects to website after (fake or not) installation + live preview button -->
|
|
<record model="ir.ui.view" id="theme_view_kanban">
|
|
<field name="name">Themes Kanban</field>
|
|
<field name="model">ir.module.module</field>
|
|
<field name="arch" type="xml">
|
|
<kanban create="false" class="o_theme_kanban" default_order="state,sequence,name">
|
|
<field name="icon"/>
|
|
<field name="name"/>
|
|
<field name="state"/>
|
|
<field name="url"/>
|
|
<field name="image_ids"/>
|
|
<field name="category_id"/>
|
|
<field name="display_name"/>
|
|
<templates>
|
|
<div t-name="kanban-box" t-attf-class="o_theme_preview mb16 mt16 #{record.state.raw_value == 'installed'? 'o_theme_installed' : ''}">
|
|
<t t-set="has_image" t-value="record.image_ids.raw_value.length > 0"/>
|
|
<t t-set="has_screenshot" t-value="record.image_ids.raw_value.length > 1"/>
|
|
<t t-set="image_url" t-value="has_image ? 'web/image/' + record.image_ids.raw_value[0] : record.icon.value"/>
|
|
|
|
<div class="o_theme_preview_top bg-white mb4">
|
|
<div class="o_browser_bar"/>
|
|
<i states="installed" class="text-center bg-white text-success rounded-circle fa fa-check-circle" role="img" aria-label="Installed" title="Installed"/>
|
|
<div t-attf-class="bg-gray-lighter #{has_screenshot? 'o_theme_screenshot' : (has_image ? 'o_theme_cover' : 'o_theme_logo')}" t-attf-style="background-image: url(#{image_url});"/>
|
|
<div states="uninstalled" class="o_button_area">
|
|
<button type="object" name="button_choose_theme" class="btn btn-primary">Use this theme</button>
|
|
<hr t-if="record.url.value"/>
|
|
<a role="button" t-if="record.url.value" class="btn btn-secondary" t-att-href="record.url.value" target="_blank">Live Preview</a>
|
|
</div>
|
|
</div>
|
|
<div class="o_theme_preview_bottom clearfix">
|
|
<h5 t-if="record.display_name.value" class="text-uppercase float-left">
|
|
<img class="float-left mr4" t-att-src="record.icon.value" height="16" width="16" alt="Theme preview"/>
|
|
<b><t t-esc="record.display_name.value.replace(('Theme'), '').replace(('theme'), '')"/></b>
|
|
</h5>
|
|
<h6 t-if="record.category_id.value" class="text-muted float-right">
|
|
<b><t t-esc="record.category_id.value"/></b>
|
|
</h6>
|
|
</div>
|
|
</div>
|
|
</templates>
|
|
</kanban>
|
|
</field>
|
|
</record>
|
|
<record model="ir.ui.view" id="theme_view_search">
|
|
<field name="name">Themes Search</field>
|
|
<field name="model">ir.module.module</field>
|
|
<field name="priority">50</field>
|
|
<field name="arch" type="xml">
|
|
<search>
|
|
<field name="name" filter_domain="['|', '|', ('summary', 'ilike', self), ('shortdesc', 'ilike', self), ('name', 'ilike', self)]" string="Theme"/>
|
|
<field name="category_id" filter_domain="['|', '|', ('summary', 'ilike', self), ('shortdesc', 'ilike', self), ('category_id', 'ilike', self)]" string="Category"/>
|
|
<group>
|
|
<filter string="Author" name="author" domain="[]" context="{'group_by':'author'}"/>
|
|
<filter string="Category" name="category" domain="[]" context="{'group_by':'category_id'}"/>
|
|
</group>
|
|
</search>
|
|
</field>
|
|
</record>
|
|
|
|
<!-- Actions to list themes with custom kanban (launched on module installation) -->
|
|
<record id="theme_install_kanban_action" model="ir.actions.act_window">
|
|
<field name="name">Choose Your Theme</field>
|
|
<field name="res_model">ir.module.module</field>
|
|
<field name="view_mode">kanban</field>
|
|
<field name="view_id" ref="theme_view_kanban"/>
|
|
<field name="search_view_id" ref="theme_view_search"/>
|
|
<field name="domain" eval="[
|
|
('category_id', 'not in', [ref('base.module_category_theme_hidden', False)]),
|
|
'|', ('category_id', '=', ref('base.module_category_theme', False)), ('category_id.parent_id', '=', ref('base.module_category_theme', False))
|
|
]"/>
|
|
</record>
|
|
<record id="theme_install_todo_action" model="ir.actions.server">
|
|
<field name="name">Config: Choose Your Theme</field>
|
|
<field name="model_id" ref="model_ir_module_module"/>
|
|
<field name="state">code</field>
|
|
<field name="code">
|
|
model.update_list()
|
|
action = {
|
|
'type': 'ir.actions.act_url',
|
|
'url': '/web?reload#action=website_theme_install.theme_install_kanban_action', # the ?reload option is there to fool the webclient into thinking it is a different location and so to force a reload
|
|
'target': 'self',
|
|
}
|
|
</field>
|
|
</record>
|
|
<record id="theme_install_todo" model="ir.actions.todo">
|
|
<field name="action_id" ref="theme_install_todo_action"/>
|
|
<field name="sequence">0</field>
|
|
</record>
|
|
|
|
<!-- Add link to theme install in default customize modal -->
|
|
<template id="customize_modal" inherit_id="website.theme_customize" priority="1">
|
|
<xpath expr="//div" position="replace">
|
|
<div>
|
|
Please <a href="/web#action=website_theme_install.theme_install_kanban_action">install a theme</a> to customize your website.
|
|
</div>
|
|
</xpath>
|
|
</template>
|
|
</odoo>
|