From 6a3d2b684e175ed4ce400e42025fd52e96143faa Mon Sep 17 00:00:00 2001 From: David Date: Tue, 12 Mar 2024 13:48:53 +0100 Subject: [PATCH 1/6] [ADD] web_filter_header_button: New module TT47127 --- web_filter_header_button/README.rst | 139 +++++ web_filter_header_button/__init__.py | 0 web_filter_header_button/__manifest__.py | 20 + .../demo/ir_module_module_view.xml | 19 + .../i18n/web_filter_header_button.pot | 13 + web_filter_header_button/readme/CONFIGURE.md | 32 ++ web_filter_header_button/readme/CONTEXT.md | 1 + .../readme/CONTRIBUTORS.md | 2 + .../readme/DESCRIPTION.md | 1 + web_filter_header_button/readme/ROADMAP.md | 2 + web_filter_header_button/readme/USAGE.md | 2 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 479 ++++++++++++++++++ .../src/control_panel/control_panel.esm.js | 11 + .../src/control_panel/control_panel.xml | 10 + .../control_panel_model_extension.esm.js | 36 ++ .../src/filter_button/filter_button.esm.js | 50 ++ .../src/filter_button/filter_button.xml | 38 ++ 18 files changed, 855 insertions(+) create mode 100644 web_filter_header_button/README.rst create mode 100644 web_filter_header_button/__init__.py create mode 100644 web_filter_header_button/__manifest__.py create mode 100644 web_filter_header_button/demo/ir_module_module_view.xml create mode 100644 web_filter_header_button/i18n/web_filter_header_button.pot create mode 100644 web_filter_header_button/readme/CONFIGURE.md create mode 100644 web_filter_header_button/readme/CONTEXT.md create mode 100644 web_filter_header_button/readme/CONTRIBUTORS.md create mode 100644 web_filter_header_button/readme/DESCRIPTION.md create mode 100644 web_filter_header_button/readme/ROADMAP.md create mode 100644 web_filter_header_button/readme/USAGE.md create mode 100644 web_filter_header_button/static/description/icon.png create mode 100644 web_filter_header_button/static/description/index.html create mode 100644 web_filter_header_button/static/src/control_panel/control_panel.esm.js create mode 100644 web_filter_header_button/static/src/control_panel/control_panel.xml create mode 100644 web_filter_header_button/static/src/control_panel/control_panel_model_extension.esm.js create mode 100644 web_filter_header_button/static/src/filter_button/filter_button.esm.js create mode 100644 web_filter_header_button/static/src/filter_button/filter_button.xml diff --git a/web_filter_header_button/README.rst b/web_filter_header_button/README.rst new file mode 100644 index 000000000..80879470a --- /dev/null +++ b/web_filter_header_button/README.rst @@ -0,0 +1,139 @@ +============= +Filter Button +============= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:9da8b47931a94c1b0a4f43e7a450e88a87095f7d1d6aa5fdf36fc59efbb75fe4 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/15.0/web_filter_header_button + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-15-0/web-15-0-web_filter_header_button + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=15.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows to add some selected filters as buttons in the header +control panel. + +**Table of contents** + +.. contents:: + :local: + +Use Cases / Context +=================== + +This developement is aimed to ease the filter access for touch screens +users. + +Configuration +============= + +To show a filter in the header of the views, it should have the a +``context`` attribute with the key ``shown_in_panel``. + +.. code:: xml + + + +This will show the filter in the header with its name. You can customize +the button adding an icon or with a custom name passing an object to +that key: + +.. code:: python + + {'shown_in_panel': {'icon': 'fa-thumbs-up', 'name': 'Ok'}} + +You might be interested in leaving just the icon. In that case, set an +empty string on the ``name`` property: + +.. code:: python + + {'shown_in_panel': {'icon': 'fa-thumbs-up', 'name': ''}} + +You could also want to add a hotkey. In such case add the ``hotkey`` +property: + +.. code:: python + + {'shown_in_panel': {'icon': 'fa-thumbs-up', 'hotkey': 'F'}} + +You can show filter, groups or even favorites. + +Usage +===== + +There's a demo implementation in ``Apps`` and you can play around +following the *Configure* section. + +Known issues / Roadmap +====================== + +- Group filters by kind +- As we use the ``context`` attribute, the inheritance could be + limiting in some cases. Keep it in mind or use + ``base_view_inheritance_extension`` if you want to use proper context + inheritance. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Tecnativa + +Contributors +------------ + +- `Tecnativa `__ + + - David Vidal + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/web `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/web_filter_header_button/__init__.py b/web_filter_header_button/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/web_filter_header_button/__manifest__.py b/web_filter_header_button/__manifest__.py new file mode 100644 index 000000000..1587328bc --- /dev/null +++ b/web_filter_header_button/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright 2024 Tecnativa - David Vidal +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Filter Button", + "version": "15.0.1.0.0", + "summary": "Show selected filters as buttons in the control panel", + "author": "Tecnativa, Odoo Community Association (OCA)", + "license": "AGPL-3", + "category": "Server UX", + "website": "https://github.com/OCA/web", + "depends": ["web"], + "data": [], + "demo": [ + "demo/ir_module_module_view.xml", + ], + "assets": { + "web.assets_backend": ["web_filter_header_button/static/src/**/*.js"], + "web.assets_qweb": ["web_filter_header_button/static/src/**/*.xml"], + }, +} diff --git a/web_filter_header_button/demo/ir_module_module_view.xml b/web_filter_header_button/demo/ir_module_module_view.xml new file mode 100644 index 000000000..77773bbe8 --- /dev/null +++ b/web_filter_header_button/demo/ir_module_module_view.xml @@ -0,0 +1,19 @@ + + + + ir.module.module + + + + {'shown_in_panel': {'icon': 'fa-toggle-on', 'hotkey': 'i'}} + + + {'shown_in_panel': {'icon': 'fa-toggle-off', 'hotkey': 'u'}} + + + + diff --git a/web_filter_header_button/i18n/web_filter_header_button.pot b/web_filter_header_button/i18n/web_filter_header_button.pot new file mode 100644 index 000000000..a11baf5cd --- /dev/null +++ b/web_filter_header_button/i18n/web_filter_header_button.pot @@ -0,0 +1,13 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" diff --git a/web_filter_header_button/readme/CONFIGURE.md b/web_filter_header_button/readme/CONFIGURE.md new file mode 100644 index 000000000..8f87f4e5b --- /dev/null +++ b/web_filter_header_button/readme/CONFIGURE.md @@ -0,0 +1,32 @@ +To show a filter in the header of the views, it should have the a `context` attribute with the key `shown_in_panel`. + +```xml + +``` + +This will show the filter in the header with its name. You can customize the button +adding an icon or with a custom name passing an object to that key: + +```python +{'shown_in_panel': {'icon': 'fa-thumbs-up', 'name': 'Ok'}} +``` + +You might be interested in leaving just the icon. In that case, set an empty string on +the `name` property: + +```python +{'shown_in_panel': {'icon': 'fa-thumbs-up', 'name': ''}} +``` + +You could also want to add a hotkey. In such case add the `hotkey` property: + +```python +{'shown_in_panel': {'icon': 'fa-thumbs-up', 'hotkey': 'F'}} +``` + +You can show filter, groups or even favorites. diff --git a/web_filter_header_button/readme/CONTEXT.md b/web_filter_header_button/readme/CONTEXT.md new file mode 100644 index 000000000..2d9eb2fe0 --- /dev/null +++ b/web_filter_header_button/readme/CONTEXT.md @@ -0,0 +1 @@ +This developement is aimed to ease the filter access for touch screens users. diff --git a/web_filter_header_button/readme/CONTRIBUTORS.md b/web_filter_header_button/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..96d0c4c7f --- /dev/null +++ b/web_filter_header_button/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +- [Tecnativa](https://tecnativa.com) + - David Vidal diff --git a/web_filter_header_button/readme/DESCRIPTION.md b/web_filter_header_button/readme/DESCRIPTION.md new file mode 100644 index 000000000..064783469 --- /dev/null +++ b/web_filter_header_button/readme/DESCRIPTION.md @@ -0,0 +1 @@ +This module allows to add some selected filters as buttons in the header control panel. diff --git a/web_filter_header_button/readme/ROADMAP.md b/web_filter_header_button/readme/ROADMAP.md new file mode 100644 index 000000000..804bf5e48 --- /dev/null +++ b/web_filter_header_button/readme/ROADMAP.md @@ -0,0 +1,2 @@ +- Group filters by kind +- As we use the `context` attribute, the inheritance could be limiting in some cases. Keep it in mind or use `base_view_inheritance_extension` if you want to use proper context inheritance. diff --git a/web_filter_header_button/readme/USAGE.md b/web_filter_header_button/readme/USAGE.md new file mode 100644 index 000000000..ad0e8190e --- /dev/null +++ b/web_filter_header_button/readme/USAGE.md @@ -0,0 +1,2 @@ +There's a demo implementation in `Apps` and you can play around following the *Configure* +section. diff --git a/web_filter_header_button/static/description/icon.png b/web_filter_header_button/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 zcmW++2RxMjAAjx~&dlBk9S+%}OXg)AGE&Cb*&}d0jUxM@u(PQx^-s)697TX`ehR4?GS^qbkof1cslKgkU)h65qZ9Oc=ml_0temigYLJfnz{IDzUf>bGs4N!v3=Z3jMq&A#7%rM5eQ#dc?k~! zVpnB`o+K7|Al`Q_U;eD$B zfJtP*jH`siUq~{KE)`jP2|#TUEFGRryE2`i0**z#*^6~AI|YzIWy$Cu#CSLW3q=GA z6`?GZymC;dCPk~rBS%eCb`5OLr;RUZ;D`}um=H)BfVIq%7VhiMr)_#G0N#zrNH|__ zc+blN2UAB0=617@>_u;MPHN;P;N#YoE=)R#i$k_`UAA>WWCcEVMh~L_ zj--gtp&|K1#58Yz*AHCTMziU1Jzt_jG0I@qAOHsk$2}yTmVkBp_eHuY$A9)>P6o~I z%aQ?!(GqeQ-Y+b0I(m9pwgi(IIZZzsbMv+9w{PFtd_<_(LA~0H(xz{=FhLB@(1&qHA5EJw1>>=%q2f&^X>IQ{!GJ4e9U z&KlB)z(84HmNgm2hg2C0>WM{E(DdPr+EeU_N@57;PC2&DmGFW_9kP&%?X4}+xWi)( z;)z%wI5>D4a*5XwD)P--sPkoY(a~WBw;E~AW`Yue4kFa^LM3X`8x|}ZUeMnqr}>kH zG%WWW>3ml$Yez?i%)2pbKPI7?5o?hydokgQyZsNEr{a|mLdt;X2TX(#B1j35xPnPW z*bMSSOauW>o;*=kO8ojw91VX!qoOQb)zHJ!odWB}d+*K?#sY_jqPdg{Sm2HdYzdEx zOGVPhVRTGPtv0o}RfVP;Nd(|CB)I;*t&QO8h zFfekr30S!-LHmV_Su-W+rEwYXJ^;6&3|L$mMC8*bQptyOo9;>Qb9Q9`ySe3%V$A*9 zeKEe+b0{#KWGp$F+tga)0RtI)nhMa-K@JS}2krK~n8vJ=Ngm?R!9G<~RyuU0d?nz# z-5EK$o(!F?hmX*2Yt6+coY`6jGbb7tF#6nHA zuKk=GGJ;ZwON1iAfG$E#Y7MnZVmrY|j0eVI(DN_MNFJmyZ|;w4tf@=CCDZ#5N_0K= z$;R~bbk?}TpfDjfB&aiQ$VA}s?P}xPERJG{kxk5~R`iRS(SK5d+Xs9swCozZISbnS zk!)I0>t=A<-^z(cmSFz3=jZ23u13X><0b)P)^1T_))Kr`e!-pb#q&J*Q`p+B6la%C zuVl&0duN<;uOsB3%T9Fp8t{ED108<+W(nOZd?gDnfNBC3>M8WE61$So|P zVvqH0SNtDTcsUdzaMDpT=Ty0pDHHNL@Z0w$Y`XO z2M-_r1S+GaH%pz#Uy0*w$Vdl=X=rQXEzO}d6J^R6zjM1u&c9vYLvLp?W7w(?np9x1 zE_0JSAJCPB%i7p*Wvg)pn5T`8k3-uR?*NT|J`eS#_#54p>!p(mLDvmc-3o0mX*mp_ zN*AeS<>#^-{S%W<*mz^!X$w_2dHWpcJ6^j64qFBft-o}o_Vx80o0>}Du;>kLts;$8 zC`7q$QI(dKYG`Wa8#wl@V4jVWBRGQ@1dr-hstpQL)Tl+aqVpGpbSfN>5i&QMXfiZ> zaA?T1VGe?rpQ@;+pkrVdd{klI&jVS@I5_iz!=UMpTsa~mBga?1r}aRBm1WS;TT*s0f0lY=JBl66Upy)-k4J}lh=P^8(SXk~0xW=T9v*B|gzIhN z>qsO7dFd~mgxAy4V?&)=5ieYq?zi?ZEoj)&2o)RLy=@hbCRcfT5jigwtQGE{L*8<@Yd{zg;CsL5mvzfDY}P-wos_6PfprFVaeqNE%h zKZhLtcQld;ZD+>=nqN~>GvROfueSzJD&BE*}XfU|H&(FssBqY=hPCt`d zH?@s2>I(|;fcW&YM6#V#!kUIP8$Nkdh0A(bEVj``-AAyYgwY~jB zT|I7Bf@%;7aL7Wf4dZ%VqF$eiaC38OV6oy3Z#TER2G+fOCd9Iaoy6aLYbPTN{XRPz z;U!V|vBf%H!}52L2gH_+j;`bTcQRXB+y9onc^wLm5wi3-Be}U>k_u>2Eg$=k!(l@I zcCg+flakT2Nej3i0yn+g+}%NYb?ta;R?(g5SnwsQ49U8Wng8d|{B+lyRcEDvR3+`O{zfmrmvFrL6acVP%yG98X zo&+VBg@px@i)%o?dG(`T;n*$S5*rnyiR#=wW}}GsAcfyQpE|>a{=$Hjg=-*_K;UtD z#z-)AXwSRY?OPefw^iI+ z)AXz#PfEjlwTes|_{sB?4(O@fg0AJ^g8gP}ex9Ucf*@_^J(s_5jJV}c)s$`Myn|Kd z$6>}#q^n{4vN@+Os$m7KV+`}c%4)4pv@06af4-x5#wj!KKb%caK{A&Y#Rfs z-po?Dcb1({W=6FKIUirH&(yg=*6aLCekcKwyfK^JN5{wcA3nhO(o}SK#!CINhI`-I z1)6&n7O&ZmyFMuNwvEic#IiOAwNkR=u5it{B9n2sAJV5pNhar=j5`*N!Na;c7g!l$ z3aYBqUkqqTJ=Re-;)s!EOeij=7SQZ3Hq}ZRds%IM*PtM$wV z@;rlc*NRK7i3y5BETSKuumEN`Xu_8GP1Ri=OKQ$@I^ko8>H6)4rjiG5{VBM>B|%`&&s^)jS|-_95&yc=GqjNo{zFkw%%HHhS~e=s zD#sfS+-?*t|J!+ozP6KvtOl!R)@@-z24}`9{QaVLD^9VCSR2b`b!KC#o;Ki<+wXB6 zx3&O0LOWcg4&rv4QG0)4yb}7BFSEg~=IR5#ZRj8kg}dS7_V&^%#Do==#`u zpy6{ox?jWuR(;pg+f@mT>#HGWHAJRRDDDv~@(IDw&R>9643kK#HN`!1vBJHnC+RM&yIh8{gG2q zA%e*U3|N0XSRa~oX-3EAneep)@{h2vvd3Xvy$7og(sayr@95+e6~Xvi1tUqnIxoIH zVWo*OwYElb#uyW{Imam6f2rGbjR!Y3`#gPqkv57dB6K^wRGxc9B(t|aYDGS=m$&S!NmCtrMMaUg(c zc2qC=2Z`EEFMW-me5B)24AqF*bV5Dr-M5ig(l-WPS%CgaPzs6p_gnCIvTJ=Y<6!gT zVt@AfYCzjjsMEGi=rDQHo0yc;HqoRNnNFeWZgcm?f;cp(6CNylj36DoL(?TS7eU#+ z7&mfr#y))+CJOXQKUMZ7QIdS9@#-}7y2K1{8)cCt0~-X0O!O?Qx#E4Og+;A2SjalQ zs7r?qn0H044=sDN$SRG$arw~n=+T_DNdSrarmu)V6@|?1-ZB#hRn`uilTGPJ@fqEy zGt(f0B+^JDP&f=r{#Y_wi#AVDf-y!RIXU^0jXsFpf>=Ji*TeqSY!H~AMbJdCGLhC) zn7Rx+sXw6uYj;WRYrLd^5IZq@6JI1C^YkgnedZEYy<&4(z%Q$5yv#Boo{AH8n$a zhb4Y3PWdr269&?V%uI$xMcUrMzl=;w<_nm*qr=c3Rl@i5wWB;e-`t7D&c-mcQl7x! zZWB`UGcw=Y2=}~wzrfLx=uet<;m3~=8I~ZRuzvMQUQdr+yTV|ATf1Uuomr__nDf=X zZ3WYJtHp_ri(}SQAPjv+Y+0=fH4krOP@S&=zZ-t1jW1o@}z;xk8 z(Nz1co&El^HK^NrhVHa-_;&88vTU>_J33=%{if;BEY*J#1n59=07jrGQ#IP>@u#3A z;!q+E1Rj3ZJ+!4bq9F8PXJ@yMgZL;>&gYA0%_Kbi8?S=XGM~dnQZQ!yBSgcZhY96H zrWnU;k)qy`rX&&xlDyA%(a1Hhi5CWkmg(`Gb%m(HKi-7Z!LKGRP_B8@`7&hdDy5n= z`OIxqxiVfX@OX1p(mQu>0Ai*v_cTMiw4qRt3~NBvr9oBy0)r>w3p~V0SCm=An6@3n)>@z!|o-$HvDK z|3D2ZMJkLE5loMKl6R^ez@Zz%S$&mbeoqH5`Bb){Ei21q&VP)hWS2tjShfFtGE+$z zzCR$P#uktu+#!w)cX!lWN1XU%K-r=s{|j?)Akf@q#3b#{6cZCuJ~gCxuMXRmI$nGtnH+-h z+GEi!*X=AP<|fG`1>MBdTb?28JYc=fGvAi2I<$B(rs$;eoJCyR6_bc~p!XR@O-+sD z=eH`-ye})I5ic1eL~TDmtfJ|8`0VJ*Yr=hNCd)G1p2MMz4C3^Mj?7;!w|Ly%JqmuW zlIEW^Ft%z?*|fpXda>Jr^1noFZEwFgVV%|*XhH@acv8rdGxeEX{M$(vG{Zw+x(ei@ zmfXb22}8-?Fi`vo-YVrTH*C?a8%M=Hv9MqVH7H^J$KsD?>!SFZ;ZsvnHr_gn=7acz z#W?0eCdVhVMWN12VV^$>WlQ?f;P^{(&pYTops|btm6aj>_Uz+hqpGwB)vWp0Cf5y< zft8-je~nn?W11plq}N)4A{l8I7$!ks_x$PXW-2XaRFswX_BnF{R#6YIwMhAgd5F9X zGmwdadS6(a^fjHtXg8=l?Rc0Sm%hk6E9!5cLVloEy4eh(=FwgP`)~I^5~pBEWo+F6 zSf2ncyMurJN91#cJTy_u8Y}@%!bq1RkGC~-bV@SXRd4F{R-*V`bS+6;W5vZ(&+I<9$;-V|eNfLa5n-6% z2(}&uGRF;p92eS*sE*oR$@pexaqr*meB)VhmIg@h{uzkk$9~qh#cHhw#>O%)b@+(| z^IQgqzuj~Sk(J;swEM-3TrJAPCq9k^^^`q{IItKBRXYe}e0Tdr=Huf7da3$l4PdpwWDop%^}n;dD#K4s#DYA8SHZ z&1!riV4W4R7R#C))JH1~axJ)RYnM$$lIR%6fIVA@zV{XVyx}C+a-Dt8Y9M)^KU0+H zR4IUb2CJ{Hg>CuaXtD50jB(_Tcx=Z$^WYu2u5kubqmwp%drJ6 z?Fo40g!Qd<-l=TQxqHEOuPX0;^z7iX?Ke^a%XT<13TA^5`4Xcw6D@Ur&VT&CUe0d} z1GjOVF1^L@>O)l@?bD~$wzgf(nxX1OGD8fEV?TdJcZc2KoUe|oP1#=$$7ee|xbY)A zDZq+cuTpc(fFdj^=!;{k03C69lMQ(|>uhRfRu%+!k&YOi-3|1QKB z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/web_filter_header_button/static/description/index.html b/web_filter_header_button/static/description/index.html new file mode 100644 index 000000000..f80e0c98e --- /dev/null +++ b/web_filter_header_button/static/description/index.html @@ -0,0 +1,479 @@ + + + + + + +Filter Button + + + +
+

Filter Button

+ + +

Beta License: AGPL-3 OCA/web Translate me on Weblate Try me on Runboat

+

This module allows to add some selected filters as buttons in the header +control panel.

+

Table of contents

+ +
+

Use Cases / Context

+

This developement is aimed to ease the filter access for touch screens +users.

+
+
+

Configuration

+

To show a filter in the header of the views, it should have the a +context attribute with the key shown_in_panel.

+
+<filter
+    string="My filter"
+    name="my_filter"
+    domain="[('active', '!=', False)]"
+    context="{'shown_in_panel': True}"
+>
+
+

This will show the filter in the header with its name. You can customize +the button adding an icon or with a custom name passing an object to +that key:

+
+{'shown_in_panel': {'icon': 'fa-thumbs-up', 'name': 'Ok'}}
+
+

You might be interested in leaving just the icon. In that case, set an +empty string on the name property:

+
+{'shown_in_panel': {'icon': 'fa-thumbs-up', 'name': ''}}
+
+

You could also want to add a hotkey. In such case add the hotkey +property:

+
+{'shown_in_panel': {'icon': 'fa-thumbs-up', 'hotkey': 'F'}}
+
+

You can show filter, groups or even favorites.

+
+
+

Usage

+

There’s a demo implementation in Apps and you can play around +following the Configure section.

+
+
+

Known issues / Roadmap

+
    +
  • Group filters by kind
  • +
  • As we use the context attribute, the inheritance could be +limiting in some cases. Keep it in mind or use +base_view_inheritance_extension if you want to use proper context +inheritance.
  • +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Tecnativa
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/web project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/web_filter_header_button/static/src/control_panel/control_panel.esm.js b/web_filter_header_button/static/src/control_panel/control_panel.esm.js new file mode 100644 index 000000000..75b54f56d --- /dev/null +++ b/web_filter_header_button/static/src/control_panel/control_panel.esm.js @@ -0,0 +1,11 @@ +/** @odoo-module **/ +import {FilterButton} from "../filter_button/filter_button.esm"; +import LegacyControlPanel from "web.ControlPanel"; +import {patch} from "web.utils"; + +patch(LegacyControlPanel, "filter_button.ControlPanel", { + components: { + ...LegacyControlPanel.components, + FilterButton, + }, +}); diff --git a/web_filter_header_button/static/src/control_panel/control_panel.xml b/web_filter_header_button/static/src/control_panel/control_panel.xml new file mode 100644 index 000000000..7a11ebf55 --- /dev/null +++ b/web_filter_header_button/static/src/control_panel/control_panel.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/web_filter_header_button/static/src/control_panel/control_panel_model_extension.esm.js b/web_filter_header_button/static/src/control_panel/control_panel_model_extension.esm.js new file mode 100644 index 000000000..57716199d --- /dev/null +++ b/web_filter_header_button/static/src/control_panel/control_panel_model_extension.esm.js @@ -0,0 +1,36 @@ +/** @odoo-module **/ +import LegacyControlPanelModelExtension from "web/static/src/js/control_panel/control_panel_model_extension.js"; +import {patch} from "web.utils"; + +patch( + LegacyControlPanelModelExtension.prototype, + "filter_button.ControlPanelModelExtension", + { + /** + * Clean the `show_in_panel` context to avoid showing it in the panel + * @private + * @override + * @param {Object} preFilter + * @returns {Promise} + */ + async _saveQuery() { + const preFilter = await this._super(...arguments); + if (preFilter && preFilter.context) { + delete preFilter.context.shown_in_panel; + } + return preFilter; + }, + /** + * Clear the `show_in_panel` context to prevent it being saved with this context + * @override + * @returns {Object} + */ + getIrFilterValues() { + const preFilter = this._super(...arguments); + if (preFilter && preFilter.context) { + delete preFilter.context.shown_in_panel; + } + return preFilter; + }, + } +); diff --git a/web_filter_header_button/static/src/filter_button/filter_button.esm.js b/web_filter_header_button/static/src/filter_button/filter_button.esm.js new file mode 100644 index 000000000..a7499b571 --- /dev/null +++ b/web_filter_header_button/static/src/filter_button/filter_button.esm.js @@ -0,0 +1,50 @@ +/** @odoo-module **/ +const {Component} = owl; + +export class FilterButton extends Component { + setup() { + this.model = this.env.searchModel; + } + /** + * Filter flagged filters to be shown in the control panel. + * + * @param {Array} filters + * @returns {Array} + */ + shownFilters(filters) { + return filters.filter((filter) => { + return filter.context && filter.context.shown_in_panel; + }); + } + /** + * Return custom properties depending on the filter properties + * + * @param {Object} filter + * @returns {Object} + */ + mapFilterType(filter) { + const mapping = { + filter: { + color: "primary", + }, + favorite: { + color: "warning", + }, + }; + return mapping[filter.type]; + } + /** + * Clear filters + */ + onClickReset() { + this.model.dispatch("clearQuery"); + } + /** + * Set / unset filter + * @param {Object} filter + */ + onToggleFilter(filter) { + this.model.dispatch("toggleFilter", filter.id); + } +} +FilterButton.template = "filter_button.FilterButton"; diff --git a/web_filter_header_button/static/src/filter_button/filter_button.xml b/web_filter_header_button/static/src/filter_button/filter_button.xml new file mode 100644 index 000000000..425bd508d --- /dev/null +++ b/web_filter_header_button/static/src/filter_button/filter_button.xml @@ -0,0 +1,38 @@ + + + + + +
+ + + + + + + + + + +
+
+
From ed3d7bc0c615704c03ab6479bf0aee22a67a2470 Mon Sep 17 00:00:00 2001 From: David Date: Fri, 24 May 2024 10:42:25 +0200 Subject: [PATCH 2/6] [IMP] web_filter_header_button: show groupBy filters Now we can configure group filters to show up along the other filters so users can easily access those as well. TT49232 --- .../demo/ir_module_module_view.xml | 5 +++++ .../control_panel_model_extension.esm.js | 12 ++++++++++++ .../static/src/filter_button/filter_button.esm.js | 3 +++ 3 files changed, 20 insertions(+) diff --git a/web_filter_header_button/demo/ir_module_module_view.xml b/web_filter_header_button/demo/ir_module_module_view.xml index 77773bbe8..1742e196d 100644 --- a/web_filter_header_button/demo/ir_module_module_view.xml +++ b/web_filter_header_button/demo/ir_module_module_view.xml @@ -14,6 +14,11 @@ name="context" >{'shown_in_panel': {'icon': 'fa-toggle-off', 'hotkey': 'u'}} + + {'group_by':'state', 'shown_in_panel': {'icon': 'fa-th-list', 'hotkey': 's'}} + diff --git a/web_filter_header_button/static/src/control_panel/control_panel_model_extension.esm.js b/web_filter_header_button/static/src/control_panel/control_panel_model_extension.esm.js index 57716199d..c08124e43 100644 --- a/web_filter_header_button/static/src/control_panel/control_panel_model_extension.esm.js +++ b/web_filter_header_button/static/src/control_panel/control_panel_model_extension.esm.js @@ -32,5 +32,17 @@ patch( } return preFilter; }, + /** + * Allow groupBy filters to show up as buttons + * @override + * @param {Object} filter + * @param {Object} attrs + */ + _extractAttributes(filter, attrs) { + this._super(...arguments); + if (filter.type === "groupBy" && attrs.context.shown_in_panel) { + filter.context = attrs.context; + } + }, } ); diff --git a/web_filter_header_button/static/src/filter_button/filter_button.esm.js b/web_filter_header_button/static/src/filter_button/filter_button.esm.js index a7499b571..b0881432f 100644 --- a/web_filter_header_button/static/src/filter_button/filter_button.esm.js +++ b/web_filter_header_button/static/src/filter_button/filter_button.esm.js @@ -30,6 +30,9 @@ export class FilterButton extends Component { favorite: { color: "warning", }, + groupBy: { + color: "info", + }, }; return mapping[filter.type]; } From 17698e59316ccc805d12229e58b97f5d137c83ea Mon Sep 17 00:00:00 2001 From: David Date: Thu, 30 May 2024 17:54:01 +0200 Subject: [PATCH 3/6] [IMP] web_filter_header_button: put buttons in their own row When there are too many buttons, they won't fit in the window and they will overlap with other ui elemnets. We can prevent it putting them in their own row. TT49431 --- web_filter_header_button/README.rst | 6 +- web_filter_header_button/__manifest__.py | 2 +- web_filter_header_button/readme/ROADMAP.md | 3 + .../static/description/index.html | 7 ++- .../src/control_panel/control_panel.xml | 2 +- .../src/filter_button/filter_button.xml | 56 ++++++++++--------- 6 files changed, 44 insertions(+), 32 deletions(-) diff --git a/web_filter_header_button/README.rst b/web_filter_header_button/README.rst index 80879470a..709cdb9d5 100644 --- a/web_filter_header_button/README.rst +++ b/web_filter_header_button/README.rst @@ -7,7 +7,7 @@ Filter Button !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:9da8b47931a94c1b0a4f43e7a450e88a87095f7d1d6aa5fdf36fc59efbb75fe4 + !! source digest: sha256:474ef01827c48e1ba05df2c8301f718da67a2251d4ae3282ab86a3537dd7d3f2 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -95,6 +95,10 @@ Known issues / Roadmap limiting in some cases. Keep it in mind or use ``base_view_inheritance_extension`` if you want to use proper context inheritance. +- Another nice to have would be to be able to hide the filters in the + filter list to be able to show them just in the header, although + there's not a straigh forward way to do it and it could lead to side + effects. Bug Tracker =========== diff --git a/web_filter_header_button/__manifest__.py b/web_filter_header_button/__manifest__.py index 1587328bc..b3eba5ba6 100644 --- a/web_filter_header_button/__manifest__.py +++ b/web_filter_header_button/__manifest__.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Filter Button", - "version": "15.0.1.0.0", + "version": "15.0.1.1.0", "summary": "Show selected filters as buttons in the control panel", "author": "Tecnativa, Odoo Community Association (OCA)", "license": "AGPL-3", diff --git a/web_filter_header_button/readme/ROADMAP.md b/web_filter_header_button/readme/ROADMAP.md index 804bf5e48..b91b7003b 100644 --- a/web_filter_header_button/readme/ROADMAP.md +++ b/web_filter_header_button/readme/ROADMAP.md @@ -1,2 +1,5 @@ - Group filters by kind - As we use the `context` attribute, the inheritance could be limiting in some cases. Keep it in mind or use `base_view_inheritance_extension` if you want to use proper context inheritance. +- Another nice to have would be to be able to hide the filters in the filter list to be + able to show them just in the header, although there's not a straigh forward way to + do it and it could lead to side effects. diff --git a/web_filter_header_button/static/description/index.html b/web_filter_header_button/static/description/index.html index f80e0c98e..10cda641a 100644 --- a/web_filter_header_button/static/description/index.html +++ b/web_filter_header_button/static/description/index.html @@ -1,4 +1,3 @@ - @@ -367,7 +366,7 @@ ul.auto-toc { !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:9da8b47931a94c1b0a4f43e7a450e88a87095f7d1d6aa5fdf36fc59efbb75fe4 +!! source digest: sha256:474ef01827c48e1ba05df2c8301f718da67a2251d4ae3282ab86a3537dd7d3f2 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/web Translate me on Weblate Try me on Runboat

This module allows to add some selected filters as buttons in the header @@ -436,6 +435,10 @@ following the Configure section.

limiting in some cases. Keep it in mind or use base_view_inheritance_extension if you want to use proper context inheritance. +
  • Another nice to have would be to be able to hide the filters in the +filter list to be able to show them just in the header, although +there’s not a straigh forward way to do it and it could lead to side +effects.
  • diff --git a/web_filter_header_button/static/src/control_panel/control_panel.xml b/web_filter_header_button/static/src/control_panel/control_panel.xml index 7a11ebf55..93ce85281 100644 --- a/web_filter_header_button/static/src/control_panel/control_panel.xml +++ b/web_filter_header_button/static/src/control_panel/control_panel.xml @@ -1,7 +1,7 @@ - + diff --git a/web_filter_header_button/static/src/filter_button/filter_button.xml b/web_filter_header_button/static/src/filter_button/filter_button.xml index 425bd508d..fcdf2f2b4 100644 --- a/web_filter_header_button/static/src/filter_button/filter_button.xml +++ b/web_filter_header_button/static/src/filter_button/filter_button.xml @@ -3,36 +3,38 @@ -
    - - - - - - - - +
    +
    - + + + + + + + + + +
    From bca27476119e947cfbc083668d292449c856cef3 Mon Sep 17 00:00:00 2001 From: David Date: Tue, 18 Jun 2024 17:01:00 +0200 Subject: [PATCH 4/6] [FIX] web_filter_header_button: custom view compatibility In custom views, like the reconciliation one, that use the control panel we must prevent loading the FilterButton component. TT49664 --- web_filter_header_button/README.rst | 2 +- web_filter_header_button/__manifest__.py | 2 +- web_filter_header_button/static/description/index.html | 2 +- .../static/src/control_panel/control_panel.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/web_filter_header_button/README.rst b/web_filter_header_button/README.rst index 709cdb9d5..f2bfa6fcf 100644 --- a/web_filter_header_button/README.rst +++ b/web_filter_header_button/README.rst @@ -7,7 +7,7 @@ Filter Button !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:474ef01827c48e1ba05df2c8301f718da67a2251d4ae3282ab86a3537dd7d3f2 + !! source digest: sha256:c2b64cc19b28ee8850599360a44f1ba6ad28db0bc8574f041a845a5ca9529af1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/web_filter_header_button/__manifest__.py b/web_filter_header_button/__manifest__.py index b3eba5ba6..2b7aa29fb 100644 --- a/web_filter_header_button/__manifest__.py +++ b/web_filter_header_button/__manifest__.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Filter Button", - "version": "15.0.1.1.0", + "version": "15.0.1.1.1", "summary": "Show selected filters as buttons in the control panel", "author": "Tecnativa, Odoo Community Association (OCA)", "license": "AGPL-3", diff --git a/web_filter_header_button/static/description/index.html b/web_filter_header_button/static/description/index.html index 10cda641a..af6d42538 100644 --- a/web_filter_header_button/static/description/index.html +++ b/web_filter_header_button/static/description/index.html @@ -366,7 +366,7 @@ ul.auto-toc { !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:474ef01827c48e1ba05df2c8301f718da67a2251d4ae3282ab86a3537dd7d3f2 +!! source digest: sha256:c2b64cc19b28ee8850599360a44f1ba6ad28db0bc8574f041a845a5ca9529af1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

    Beta License: AGPL-3 OCA/web Translate me on Weblate Try me on Runboat

    This module allows to add some selected filters as buttons in the header diff --git a/web_filter_header_button/static/src/control_panel/control_panel.xml b/web_filter_header_button/static/src/control_panel/control_panel.xml index 93ce85281..8b3654da5 100644 --- a/web_filter_header_button/static/src/control_panel/control_panel.xml +++ b/web_filter_header_button/static/src/control_panel/control_panel.xml @@ -2,7 +2,7 @@ - + From c23491dd109946c9e32535564fbf47c0e7bc9fcf Mon Sep 17 00:00:00 2001 From: David Date: Mon, 24 Mar 2025 17:57:59 +0100 Subject: [PATCH 5/6] [IMP] web_filter_header_button: pre-commit auto fixes --- web_filter_header_button/pyproject.toml | 3 +++ .../static/src/filter_button/filter_button.xml | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 web_filter_header_button/pyproject.toml diff --git a/web_filter_header_button/pyproject.toml b/web_filter_header_button/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/web_filter_header_button/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/web_filter_header_button/static/src/filter_button/filter_button.xml b/web_filter_header_button/static/src/filter_button/filter_button.xml index fcdf2f2b4..1fc5df24f 100644 --- a/web_filter_header_button/static/src/filter_button/filter_button.xml +++ b/web_filter_header_button/static/src/filter_button/filter_button.xml @@ -1,6 +1,5 @@ -

    From ac2c345b8ed685aa8e8089c892a0d7c60b0c11e0 Mon Sep 17 00:00:00 2001 From: David Date: Wed, 26 Mar 2025 17:31:48 +0100 Subject: [PATCH 6/6] [MIG] web_filter_header_button: Migration to 18.0 TT54366 --- web_filter_header_button/README.rst | 13 +++-- web_filter_header_button/__manifest__.py | 5 +- web_filter_header_button/readme/USAGE.md | 3 + .../static/description/index.html | 19 ++++--- .../src/control_panel/control_panel.esm.js | 11 ---- .../src/control_panel/control_panel.xml | 35 ++++++++++-- .../control_panel_model_extension.esm.js | 48 ---------------- .../control_panel/control_panel_patch.esm.js | 37 +++++++++++++ .../src/filter_button/filter_button.esm.js | 23 +++----- .../src/filter_button/filter_button.xml | 14 ++--- .../search/search_arch_parser_patch.esm.js | 23 ++++++++ .../src/search/search_model_patch.esm.js | 55 +++++++++++++++++++ 12 files changed, 184 insertions(+), 102 deletions(-) delete mode 100644 web_filter_header_button/static/src/control_panel/control_panel.esm.js delete mode 100644 web_filter_header_button/static/src/control_panel/control_panel_model_extension.esm.js create mode 100644 web_filter_header_button/static/src/control_panel/control_panel_patch.esm.js create mode 100644 web_filter_header_button/static/src/search/search_arch_parser_patch.esm.js create mode 100644 web_filter_header_button/static/src/search/search_model_patch.esm.js diff --git a/web_filter_header_button/README.rst b/web_filter_header_button/README.rst index f2bfa6fcf..b2c3bd49a 100644 --- a/web_filter_header_button/README.rst +++ b/web_filter_header_button/README.rst @@ -17,13 +17,13 @@ Filter Button :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github - :target: https://github.com/OCA/web/tree/15.0/web_filter_header_button + :target: https://github.com/OCA/web/tree/18.0/web_filter_header_button :alt: OCA/web .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/web-15-0/web-15-0-web_filter_header_button + :target: https://translation.odoo-community.org/projects/web-18-0/web-18-0-web_filter_header_button :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=15.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=18.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -84,6 +84,9 @@ You can show filter, groups or even favorites. Usage ===== +In a search view with header filter buttons, you'll see a filter icon +(funnel). Use it to unfold the filters. + There's a demo implementation in ``Apps`` and you can play around following the *Configure* section. @@ -106,7 +109,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -138,6 +141,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/web `_ project on GitHub. +This module is part of the `OCA/web `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/web_filter_header_button/__manifest__.py b/web_filter_header_button/__manifest__.py index 2b7aa29fb..dcf1f8403 100644 --- a/web_filter_header_button/__manifest__.py +++ b/web_filter_header_button/__manifest__.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Filter Button", - "version": "15.0.1.1.1", + "version": "18.0.1.0.0", "summary": "Show selected filters as buttons in the control panel", "author": "Tecnativa, Odoo Community Association (OCA)", "license": "AGPL-3", @@ -14,7 +14,6 @@ "demo/ir_module_module_view.xml", ], "assets": { - "web.assets_backend": ["web_filter_header_button/static/src/**/*.js"], - "web.assets_qweb": ["web_filter_header_button/static/src/**/*.xml"], + "web.assets_backend": ["web_filter_header_button/static/src/**/*"], }, } diff --git a/web_filter_header_button/readme/USAGE.md b/web_filter_header_button/readme/USAGE.md index ad0e8190e..16c1ab4e8 100644 --- a/web_filter_header_button/readme/USAGE.md +++ b/web_filter_header_button/readme/USAGE.md @@ -1,2 +1,5 @@ +In a search view with header filter buttons, you'll see a filter icon (funnel). Use it +to unfold the filters. + There's a demo implementation in `Apps` and you can play around following the *Configure* section. diff --git a/web_filter_header_button/static/description/index.html b/web_filter_header_button/static/description/index.html index af6d42538..9c227eaa5 100644 --- a/web_filter_header_button/static/description/index.html +++ b/web_filter_header_button/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ pre.literal-block, pre.doctest-block, pre.math, pre.code { margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.option { span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { @@ -368,7 +369,7 @@ ul.auto-toc { !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:c2b64cc19b28ee8850599360a44f1ba6ad28db0bc8574f041a845a5ca9529af1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

    Beta License: AGPL-3 OCA/web Translate me on Weblate Try me on Runboat

    +

    Beta License: AGPL-3 OCA/web Translate me on Weblate Try me on Runboat

    This module allows to add some selected filters as buttons in the header control panel.

    Table of contents

    @@ -424,6 +425,8 @@ property:

    Usage

    +

    In a search view with header filter buttons, you’ll see a filter icon +(funnel). Use it to unfold the filters.

    There’s a demo implementation in Apps and you can play around following the Configure section.

    @@ -446,7 +449,7 @@ effects.

    Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -feedback.

    +feedback.

    Do not contact contributors directly about support or help with technical issues.

    @@ -469,11 +472,13 @@ If you spotted it first, help us to smash it by providing a detailed and welcome

    Maintainers

    This module is maintained by the OCA.

    -Odoo Community Association + +Odoo Community Association +

    OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

    -

    This module is part of the OCA/web project on GitHub.

    +

    This module is part of the OCA/web project on GitHub.

    You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

    diff --git a/web_filter_header_button/static/src/control_panel/control_panel.esm.js b/web_filter_header_button/static/src/control_panel/control_panel.esm.js deleted file mode 100644 index 75b54f56d..000000000 --- a/web_filter_header_button/static/src/control_panel/control_panel.esm.js +++ /dev/null @@ -1,11 +0,0 @@ -/** @odoo-module **/ -import {FilterButton} from "../filter_button/filter_button.esm"; -import LegacyControlPanel from "web.ControlPanel"; -import {patch} from "web.utils"; - -patch(LegacyControlPanel, "filter_button.ControlPanel", { - components: { - ...LegacyControlPanel.components, - FilterButton, - }, -}); diff --git a/web_filter_header_button/static/src/control_panel/control_panel.xml b/web_filter_header_button/static/src/control_panel/control_panel.xml index 8b3654da5..8913d8eb1 100644 --- a/web_filter_header_button/static/src/control_panel/control_panel.xml +++ b/web_filter_header_button/static/src/control_panel/control_panel.xml @@ -1,10 +1,35 @@ - - - - - + + + + + +
    + +
    +
    + + + +
    diff --git a/web_filter_header_button/static/src/control_panel/control_panel_model_extension.esm.js b/web_filter_header_button/static/src/control_panel/control_panel_model_extension.esm.js deleted file mode 100644 index c08124e43..000000000 --- a/web_filter_header_button/static/src/control_panel/control_panel_model_extension.esm.js +++ /dev/null @@ -1,48 +0,0 @@ -/** @odoo-module **/ -import LegacyControlPanelModelExtension from "web/static/src/js/control_panel/control_panel_model_extension.js"; -import {patch} from "web.utils"; - -patch( - LegacyControlPanelModelExtension.prototype, - "filter_button.ControlPanelModelExtension", - { - /** - * Clean the `show_in_panel` context to avoid showing it in the panel - * @private - * @override - * @param {Object} preFilter - * @returns {Promise} - */ - async _saveQuery() { - const preFilter = await this._super(...arguments); - if (preFilter && preFilter.context) { - delete preFilter.context.shown_in_panel; - } - return preFilter; - }, - /** - * Clear the `show_in_panel` context to prevent it being saved with this context - * @override - * @returns {Object} - */ - getIrFilterValues() { - const preFilter = this._super(...arguments); - if (preFilter && preFilter.context) { - delete preFilter.context.shown_in_panel; - } - return preFilter; - }, - /** - * Allow groupBy filters to show up as buttons - * @override - * @param {Object} filter - * @param {Object} attrs - */ - _extractAttributes(filter, attrs) { - this._super(...arguments); - if (filter.type === "groupBy" && attrs.context.shown_in_panel) { - filter.context = attrs.context; - } - }, - } -); diff --git a/web_filter_header_button/static/src/control_panel/control_panel_patch.esm.js b/web_filter_header_button/static/src/control_panel/control_panel_patch.esm.js new file mode 100644 index 000000000..f2ece582a --- /dev/null +++ b/web_filter_header_button/static/src/control_panel/control_panel_patch.esm.js @@ -0,0 +1,37 @@ +import {ControlPanel} from "@web/search/control_panel/control_panel"; +import {FilterButton} from "../filter_button/filter_button.esm"; +import {browser} from "@web/core/browser/browser"; +import {patch} from "@web/core/utils/patch"; +import {useState} from "@odoo/owl"; +import {user} from "@web/core/user"; + +patch(ControlPanel, { + components: {...ControlPanel.components, FilterButton}, +}); + +patch(ControlPanel.prototype, { + setup() { + super.setup(...arguments); + this.buttonFiltersVisibilityKey = `visibleHeaderButtons${this.env.config.actionId}+${user.userId}`; + this.state = useState({ + ...this.state, + headerButtonFilters: this.env.searchModel?.headerButtonFilters, + showButtonFilters: + this.env.searchModel?.headerButtonFilters.length > 0 && + Boolean(this.env.config.actionId) && + Boolean( + JSON.parse( + browser.localStorage.getItem(this.buttonFiltersVisibilityKey) + ) + ), + }); + }, + onClickShowshowButtonFilters() { + if (this.state.showButtonFilters) { + browser.localStorage.removeItem(this.buttonFiltersVisibilityKey); + } else { + browser.localStorage.setItem(this.buttonFiltersVisibilityKey, true); + } + this.state.showButtonFilters = !this.state.showButtonFilters; + }, +}); diff --git a/web_filter_header_button/static/src/filter_button/filter_button.esm.js b/web_filter_header_button/static/src/filter_button/filter_button.esm.js index b0881432f..a62f20fc2 100644 --- a/web_filter_header_button/static/src/filter_button/filter_button.esm.js +++ b/web_filter_header_button/static/src/filter_button/filter_button.esm.js @@ -1,21 +1,13 @@ -/** @odoo-module **/ -const {Component} = owl; +import {Component} from "@odoo/owl"; export class FilterButton extends Component { + static template = "filter_button.FilterButton"; + static props = { + filters: {type: Object, optional: false}, + }; setup() { this.model = this.env.searchModel; } - /** - * Filter flagged filters to be shown in the control panel. - * - * @param {Array} filters - * @returns {Array} - */ - shownFilters(filters) { - return filters.filter((filter) => { - return filter.context && filter.context.shown_in_panel; - }); - } /** * Return custom properties depending on the filter properties * @@ -40,14 +32,13 @@ export class FilterButton extends Component { * Clear filters */ onClickReset() { - this.model.dispatch("clearQuery"); + this.model.clearQuery(); } /** * Set / unset filter * @param {Object} filter */ onToggleFilter(filter) { - this.model.dispatch("toggleFilter", filter.id); + this.model.toggleSearchItem(filter.id); } } -FilterButton.template = "filter_button.FilterButton"; diff --git a/web_filter_header_button/static/src/filter_button/filter_button.xml b/web_filter_header_button/static/src/filter_button/filter_button.xml index 1fc5df24f..366770d53 100644 --- a/web_filter_header_button/static/src/filter_button/filter_button.xml +++ b/web_filter_header_button/static/src/filter_button/filter_button.xml @@ -1,13 +1,13 @@ - - + +
    -
    +
    @@ -22,8 +22,8 @@ t-value="options.name !== undefined ? options.name : filter.description" />