From f0015590a6ffd5a3e120218e3dfae9b3967843a5 Mon Sep 17 00:00:00 2001 From: Milan Topuzov Date: Tue, 7 Oct 2025 19:39:44 +0200 Subject: [PATCH 1/2] 19.0 migrate: web_calendar_slot_duration - Copy module from calendar repo 19.0-migrate-calendar - functional --- web_calendar_slot_duration/README.rst | 130 +++++ web_calendar_slot_duration/__init__.py | 0 web_calendar_slot_duration/__manifest__.py | 23 + .../demo/scheduled_actions.xml | 8 + web_calendar_slot_duration/i18n/de.po | 0 web_calendar_slot_duration/i18n/it.po | 0 web_calendar_slot_duration/i18n/pt_BR.po | 0 .../i18n/web_calendar_slot_duration.pot | 13 + web_calendar_slot_duration/pyproject.toml | 3 + .../readme/CONFIGURE.md | 14 + .../readme/CONTRIBUTORS.md | 3 + .../readme/DESCRIPTION.md | 3 + web_calendar_slot_duration/readme/ROADMAP.md | 2 + web_calendar_slot_duration/readme/USAGE.md | 4 + .../static/description/calendar_result.png | Bin 0 -> 2582 bytes .../static/description/edit_action.png | Bin 0 -> 15385 bytes .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 467 ++++++++++++++++++ .../src/js/calendar_common_renderer.esm.js | 15 + .../static/src/js/calendar_model.esm.js | 24 + 20 files changed, 709 insertions(+) create mode 100644 web_calendar_slot_duration/README.rst create mode 100644 web_calendar_slot_duration/__init__.py create mode 100644 web_calendar_slot_duration/__manifest__.py create mode 100644 web_calendar_slot_duration/demo/scheduled_actions.xml create mode 100644 web_calendar_slot_duration/i18n/de.po create mode 100644 web_calendar_slot_duration/i18n/it.po create mode 100644 web_calendar_slot_duration/i18n/pt_BR.po create mode 100644 web_calendar_slot_duration/i18n/web_calendar_slot_duration.pot create mode 100644 web_calendar_slot_duration/pyproject.toml create mode 100644 web_calendar_slot_duration/readme/CONFIGURE.md create mode 100644 web_calendar_slot_duration/readme/CONTRIBUTORS.md create mode 100644 web_calendar_slot_duration/readme/DESCRIPTION.md create mode 100644 web_calendar_slot_duration/readme/ROADMAP.md create mode 100644 web_calendar_slot_duration/readme/USAGE.md create mode 100644 web_calendar_slot_duration/static/description/calendar_result.png create mode 100644 web_calendar_slot_duration/static/description/edit_action.png create mode 100644 web_calendar_slot_duration/static/description/icon.png create mode 100644 web_calendar_slot_duration/static/description/index.html create mode 100644 web_calendar_slot_duration/static/src/js/calendar_common_renderer.esm.js create mode 100644 web_calendar_slot_duration/static/src/js/calendar_model.esm.js diff --git a/web_calendar_slot_duration/README.rst b/web_calendar_slot_duration/README.rst new file mode 100644 index 000000000000..7fcf17a10c47 --- /dev/null +++ b/web_calendar_slot_duration/README.rst @@ -0,0 +1,130 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +====================== +Calendar slot duration +====================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:f4d4e1daaaaf9380d55af539273f0e6303157a519d96242ee8f56e510f178f88 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png + :target: https://odoo-community.org/page/development-status + :alt: Production/Stable +.. |badge2| image:: https://img.shields.io/badge/license-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fcalendar-lightgray.png?logo=github + :target: https://github.com/OCA/calendar/tree/19.0/web_calendar_slot_duration + :alt: OCA/calendar +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/calendar-19-0/calendar-19-0-web_calendar_slot_duration + :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/calendar&target_branch=19.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module extends the functionality of backend calendars to support +custom slot durations and to allow you to provide more specific UX +regarding event duration and snapping. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +This documentation is for developers. + +If you want to configure your calendar view's snap duration, make sure +that your window action includes a context similar to this (example is +the default value): + +:: + + {"calendar_slot_duration": "00:30:00"} + +It can be added in actions defined on python or as +``ir.actions.act_window`` records. + +|edit action settings| + +|result| + +.. |edit action settings| image:: https://raw.githubusercontent.com/OCA/calendar/19.0/web_calendar_slot_duration/static/description/edit_action.png +.. |result| image:: https://raw.githubusercontent.com/OCA/calendar/19.0/web_calendar_slot_duration/static/description/calendar_result.png + +Usage +===== + +To use this module, you need to install some other addon that uses it, +as it doesn't provide any end-user functionality. + +As demo data, this module modifies the "Scheduled Actions" calendar to +have slots of 10 minutes as feature demonstration. + +Known issues / Roadmap +====================== + +- Drop module if/when https://github.com/odoo/odoo/pull/66739 is merged. + +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 `__: + + - Jairo Llopis + - Stefan Ungureanu + +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. + +.. |maintainer-Yajo| image:: https://github.com/Yajo.png?size=40px + :target: https://github.com/Yajo + :alt: Yajo + +Current `maintainer `__: + +|maintainer-Yajo| + +This module is part of the `OCA/calendar `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/web_calendar_slot_duration/__init__.py b/web_calendar_slot_duration/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/web_calendar_slot_duration/__manifest__.py b/web_calendar_slot_duration/__manifest__.py new file mode 100644 index 000000000000..bb5dd4532212 --- /dev/null +++ b/web_calendar_slot_duration/__manifest__.py @@ -0,0 +1,23 @@ +# Copyright 2021 Tecnativa - Jairo Llopis +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). +{ + "name": "Calendar slot duration", + "summary": "Customizable calendar slot durations", + "version": "19.0.1.0.0", + "development_status": "Production/Stable", + "category": "Extra Tools", + "website": "https://github.com/OCA/calendar", + "author": "Tecnativa, Odoo Community Association (OCA)", + "maintainers": ["Yajo"], + "license": "LGPL-3", + "application": False, + "installable": True, + "assets": { + "web.assets_backend": [ + "web_calendar_slot_duration/static/src/js/calendar_common_renderer.esm.js", + "web_calendar_slot_duration/static/src/js/calendar_model.esm.js", + ] + }, + "data": ["demo/scheduled_actions.xml"], + "depends": ["web"], +} diff --git a/web_calendar_slot_duration/demo/scheduled_actions.xml b/web_calendar_slot_duration/demo/scheduled_actions.xml new file mode 100644 index 000000000000..1570adc25909 --- /dev/null +++ b/web_calendar_slot_duration/demo/scheduled_actions.xml @@ -0,0 +1,8 @@ + + + + {'search_default_all': 1, "calendar_slot_duration": "00:10:00"} + + diff --git a/web_calendar_slot_duration/i18n/de.po b/web_calendar_slot_duration/i18n/de.po new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/web_calendar_slot_duration/i18n/it.po b/web_calendar_slot_duration/i18n/it.po new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/web_calendar_slot_duration/i18n/pt_BR.po b/web_calendar_slot_duration/i18n/pt_BR.po new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/web_calendar_slot_duration/i18n/web_calendar_slot_duration.pot b/web_calendar_slot_duration/i18n/web_calendar_slot_duration.pot new file mode 100644 index 000000000000..aadee09bfeda --- /dev/null +++ b/web_calendar_slot_duration/i18n/web_calendar_slot_duration.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 18.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_calendar_slot_duration/pyproject.toml b/web_calendar_slot_duration/pyproject.toml new file mode 100644 index 000000000000..4231d0cccb3d --- /dev/null +++ b/web_calendar_slot_duration/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/web_calendar_slot_duration/readme/CONFIGURE.md b/web_calendar_slot_duration/readme/CONFIGURE.md new file mode 100644 index 000000000000..05195bff039d --- /dev/null +++ b/web_calendar_slot_duration/readme/CONFIGURE.md @@ -0,0 +1,14 @@ +This documentation is for developers. + +If you want to configure your calendar view's snap duration, make sure +that your window action includes a context similar to this (example is the +default value): + + {"calendar_slot_duration": "00:30:00"} + +It can be added in actions defined on python or as +`ir.actions.act_window` records. + +![edit action settings](../static/description/edit_action.png) + +![result](../static/description/calendar_result.png) diff --git a/web_calendar_slot_duration/readme/CONTRIBUTORS.md b/web_calendar_slot_duration/readme/CONTRIBUTORS.md new file mode 100644 index 000000000000..3541fd95f37f --- /dev/null +++ b/web_calendar_slot_duration/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- [Tecnativa](https://www.tecnativa.com): + - Jairo Llopis + - Stefan Ungureanu diff --git a/web_calendar_slot_duration/readme/DESCRIPTION.md b/web_calendar_slot_duration/readme/DESCRIPTION.md new file mode 100644 index 000000000000..400326b7726f --- /dev/null +++ b/web_calendar_slot_duration/readme/DESCRIPTION.md @@ -0,0 +1,3 @@ +This module extends the functionality of backend calendars to support +custom slot durations and to allow you to provide more specific UX +regarding event duration and snapping. diff --git a/web_calendar_slot_duration/readme/ROADMAP.md b/web_calendar_slot_duration/readme/ROADMAP.md new file mode 100644 index 000000000000..027c78daea3d --- /dev/null +++ b/web_calendar_slot_duration/readme/ROADMAP.md @@ -0,0 +1,2 @@ +- Drop module if/when is + merged. diff --git a/web_calendar_slot_duration/readme/USAGE.md b/web_calendar_slot_duration/readme/USAGE.md new file mode 100644 index 000000000000..698cd24be750 --- /dev/null +++ b/web_calendar_slot_duration/readme/USAGE.md @@ -0,0 +1,4 @@ +To use this module, you need to install some other addon that uses it, +as it doesn't provide any end-user functionality. + +As demo data, this module modifies the "Scheduled Actions" calendar to have slots of 10 minutes as feature demonstration. \ No newline at end of file diff --git a/web_calendar_slot_duration/static/description/calendar_result.png b/web_calendar_slot_duration/static/description/calendar_result.png new file mode 100644 index 0000000000000000000000000000000000000000..0f651aef8ae9192876229fa7586ee541e507afa3 GIT binary patch literal 2582 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 literal 0 HcmV?d00001 diff --git a/web_calendar_slot_duration/static/description/edit_action.png b/web_calendar_slot_duration/static/description/edit_action.png new file mode 100644 index 0000000000000000000000000000000000000000..d2fb48a41fa7965340443d80f6d12538ec339a66 GIT binary patch literal 15385 zcmeIZcT`i||1KEyRZtXOMMb2kC@2I_5Rfh^BGRRWZlp;K212L-sR{}L5(K14@1Z61 z2)qawI)n}pA+!*B0wfS7`2GIAcV^9<`Qxs+vu52jXRWM#a_T;NpZ(d-=Xsvd@KHH0^LBNo95`>%_S?ff}O%n<)dRzZ^ej8YR2&UH)t(GXRXNSmGWv zX5mXQvX%9J=Tcre^Ed-}IzD$qSMFPdj{CUwgw&5v>GX%Q*(PymJy%s0|526Sy53Fq zXqqx#Nb_4ZHqt5-+1Lwu?1xSDTh)g31Wb95=KVwiX@TExCR+qnW_&^$6!IR3IfI^bx( zY0S;#pucWzFQ^8JA8pHsueuK;sYAH+!*v7sw-=5dZIsv0Y=w$a-*!jz9<^SO&STKi ziH+K$U44$MxYr8GTu1Bj=fK>q?SD>rn0FnRMc%bI+Pru_)UJvzo$Y8nH5~N;J?n9d zxtcNfH?rT$|Ib}LueL~zNB`enygQd2H<$w_mS8H016Agus+Y@BKVzOtxrw}@J*Pg1 z9CjU!Pl5g>$G`CTovYAS=P%Ci&|=W$%5EAD%F32@SX=8acrKYhY2PpH5#!ADT0=w+ zUyqEOS(Xl#9}Kv4C_a9fS*wTbfM;;_V-d1;{o2lhBNcAh_q_6Oeveh#GR$|m{Vz$$X55Hftha=#*odi|1rp4iSH+)nA+ zda{A&8*%e*Ep2RvKPs|#RJ{5h+a+? z>TsZ5;@LoN=@2^hA0Ab^s(GFbCx7#DxMq8(hJ>L5TJtym3Cbf>q2t)>`FrDw&==D#J z8p2vTl=$pHuUnbV0=nO((8f~5&*~GtS&k>Xa>h^~ioI*5D;RxD8-#~> z`5>?HP>J2hzm(fKB7JS;(9!sZuYs(=wGWfoN}Rb(b-X8r9oxf0i5bfElN>lB`zP3$ z*+SO<6~E3|JoxVLt1V#QlR7t$6(-j1mZ|zk5*zWT(&KiV;dX6*)$GrHPs+H$hA5EF z?EkB49IU|gto6KU<=T%H=zM*TS?*LD8MK31p)RD4tiX|YXxZwwS*IVqfmE&A_^h_t z^(7W_3PhrYrYghbEk*ES7a$9adaaxTCTMM9AZg5PkiRSotXC)ZS~sF z;#!%T^+kkhz*3zEKvurutFw*!Sv7Lsz?yR&#iTb%smZ>j;=+mqU1sIi1CJP&vhKP- zYF7tjh2DWcQTUtLgJHmR#)}w5VUqoE$SioQ)S0v%Qa%>W<##mv`Rq6&?5dtz$(8+1 zV${Bid2logUJJKKo~enQgLx0tbvPf?-p%@jk99n%V(MGeS>5$7)#5z7pQ}fkN4kH@QIEztDhW?=e3Gx>7$IzEH&Hn=>cDE2jd?MsyW2zbJ|wK*)I3OUI1F_b@H%W*Io#6b;)A8L@t@2TfDRbV& zB*^FS2Bb5hE02I*cmL+u=GD;ru6ha+Xrgd9%AA(XU*v@ovn?IdEzaRK(8mF&ax+G7 znOXDj8tWEc*$CM8R-o*-7s@N!6yDS6#n=b6f4%rf3h*)tM+rb2V$Or*%v}Ul2&kUR zhmK`ctJ!}i9|MRDZK8NN(9-hlPg|k69=h_s?mlo>Fd>pkhuHw%FAp|@<;D+BS(j{1 zoH}Z%08o#jZ^GK=>Tz(b7fVv~Rcnvb!U>rIQU99?y`-92k8^<0!W+7tMy^jl(Ud7h zbx_(_Y#Hxt*xFUsV}O@R)z^W3e545BtYcncV7YT`g*{bU_+W(r{CSrteFycVBJvI9 zB#O@0Ig5J^9jqT0uMX(@;mOw`3CK7(egWys0xI$Xu}2c#+b?e`*aw;iHp#~Eenu%V zo0!}A98Oi^k=p@^_hKc%A4DC&9JqfZ8x^>n0DS-9s0-@(3%}2|ART5Gm}&<97P2O4 zvS7ld$_+r}z+6Dootzy3Y=O4kDL~cp6z2VomeeR_FEf{iLH`$JMhZW*fC%DqT{%if(d`Z|uZ!*a}l@!_}dJgct=s6vmz5Se!d92poPlwX%mMR0PwT=sk z5bxNPlFd3T3h#ZMD33INL%FU<8Y~;MKe#4~oci!CryNnOgZ&_0$4&a!#0!wgK}G{d zR=VspE2NUJlDD|vu8B>}cP^F5eu9_x!4N;Yi<2b;o+VOv zrH*x_q?)3i@B?K!9aUG_f=qT!!=q~y`N_iT?ThD0e9r9C?eIH$qwF7+59ok$2E+|OxXcZkZJL!af57|=pOI+>jW2w(E?_HY`Qy1?o zgqhgxS0zuIBh}rii6r?+s-Xk`DFPi$r{3aXONivvKkT;P&9}3x`v~9Ux~Q4Xfh*tf z`l7HtQ3vl}4BBii=9uRf`^yRCO)p7Lz_1?1ZXd#7#T{AYl@);zh?|Y-z61l3Kl!qn zKa9+|*Q}!QX~FF(kIi7H9j8@UM^(xshzX`=>Y)YF3McwRq#?iO)xlBphHPw;pj09~ z$0TNj${&a0Fyc6H2eGFhN=;lnMEOdrlIm|Q#4#*(-X63{&Mvc^AkFzS_MGHCtN^y( zfDsp)6j*;Sx_5u<92h<&n2;J&gf#67em5nIRjh<>kBZsZg*c1EfFbOQ5reN^b2IDAp<6rc<8z1h#qQ_qui7 zQ#zQ=_|U7Aut&GsD|f25j%f72n(ItieImA*axah=K_i9qY*gOsM}*SZ;L3sk>{DdGw(L$QFSvuhRgPM1LL_tb&PeP#iz^(kBV*J zQm;`!DK;j8$Un9Pw<$cd{?r+_suGeip}b=Vq7)g8rEGj$t4Dxzdb(#~O^pb_AJWH4 zdRl`f^EU#VX;8rES2F=*NKe-^rSV$4Bd9Cf?tm}X6~dcP+iawLF zCZD3-5c87=zLa6fA}g04oR4t)GIbY+1>HTy2>PICd?*8}OGNCE@_V+Nu;XhAc1a`g zJy2r4nM3-Au3N4!$^#jcFifjc4VDQG_HLO1)_mC}gIK(tY>RE}qC^CyFZz*lTCH6W zK%m2j(i<_251p@zu!?6tj~%4fcuBFQQpVp5x(W;_1mx6x6whreRdN!Tf3tM8-OLqh zM~xSc30>RXa5iyDZS6vrqo4F7j<}h#yybmephcM9di?4@S%O?Pn9_YC<|)+&cWEos z#On!Kgy%UE5t9y0*6bj;>Ro4jMlO~Hb_?VgSFQPi$5MILYV7uqyn{HEk9@*_mzB&Z z)L6@bn#-@98Xw!J>V3AQf(#UFgU#1HmTESKNBT~W*g*RlCTXv-NnEtQni;QC~@65n*K4tHg7M6E>z=0)UZ)Ht|&*7qWZ0BZ=$<@Hq zw<&eXsJlRVfDP5MlB)1jL`hZV|&qAs2HF7*zCf-=Zm)laSaC_z`xA)4CRDds-|Av5W#m0RH9e87U3yC+IKO5{0{%V#ClCmCWz`!Lw)s+$**sprocQ(GNdeuJHUK*179FJ z+v}vvK6RF}Nycp_c-UR4@yn?<33D3}UQT>R9xHm}+1Ke1%Eh)CyV@ma-7HU27@!fa zFYRDfky;aVaq5i%iFQ~sY!UV*rw5z;UJRV#!wjc$84RnzW3`J-veozD>f#*Jh0~2c zMDMVt$kZ4KT#t@0+=4(-tG*CpA1<LtXV$g=}j>yr{aerMswf--0v`a!PPafudQLRzMS>`n8gHka&pr z7NwLQPhEzoR?^XdDL$BeZx>@Ezi#Iz1ooYoN^O!GqbtG6Dy`zJX^9lAyiVty<}rY| zT1pFavoV+Kc7HT+?QAzsZan5qVNb(a2%BV@*FQ4e^cb^S1kRoja_5vOh7i`XZ(7tb zwQ~zr{;A<$pdra`F%9UG)j}hG!OI3kcVjZ z>? zN2rW1)Gi~w;9AmYB##Emik99H)oNw^XCDA?{Qrw(koJt<#WTd}+lv>Esu!ev-Ai9P zQx9#Wn#X)kkAP-*l+&583d$MzlVENpz%+PgX=rf!bBRgcoj))<<-52*5V9}Io+*Ii4eQJqQJmqB=cnXFA2H~GJJEt-pGg1 z2HV?`Iuz%ajH`bCzpLA*ci`99bj#f*%076WW#*GSFWSUYbmt@(Fykhe$FR_U9`yAa z5JDtt4U*^z$%j_mz`2z|HvMBP8H_K$S|5s5+6c_*lZI^S7W8>IJ71g!-0Dl`5wb-v zk!^Bkc*&%asAZvR-fD4;oRL(Hve81&q#ld(;Zo4bUIsA6c&g>xy;}?0J}>MR`ifH) zwt6UgcVr=A7E0Rtijo$3;)f&YlV<@Bg+Xa09km=(4G4xTTIaPAZ-8-CsjV&U_=h`y z>~8$SV`{7TY-2(6+HT3BwEDMI*gv9gRDEoprUfq8mze&i5Bi%>ylh2GF#MTRH6jg^ zFrIUV$M7>Q4KU`{ih!F#$f&oRpab%+PoxY}1c{+Uvc^xZ4|T2xFJv6~k?0d+TV z3^=~H`T1%c!8r!FzDY?Va>zKF!)qaieO|VUNaqPo{oT0`E!C zjl8GC=^<%0wNOKJqujOjW&<}+ES=mytP?B@oKIE;U^OH)1;askX-dZx9=3W2&v+4a-;uyYwvHicyq;t}mm zp?gMn;X+d6Q3fDe*==AAPUkBx2m2_si5EJ5URvukhXm^CSX2%s4q@}~fuaJ1n>Rt2 z&Tk}Nyu4F_8h#q{e8Y}pwJrBz!R8*?B~?>1M)Oi77N&@v^N=cuo{5u(l*9JF?Ld_M zXuK@#B`PYk$^y+&@ts=jNJf`EQvLbn70BmqG_oQa!M`>SYrypr2uV zA-rLVwHm$>A0qNqJ*1Egw;&3ontVDRms2hMq)^M`@q62xeCp62YO}AK8kA8fx$M4tL)O>z-&vHv`)~C{*)#; z(an75^#e<62^_=AT_>zr3elqX-@*50AFQIf8iq72t;;Z)&j&aPlwU7~OxYVw4EgvB zhfg?Q=0HL#O`mw$jT8uXa9IS4j$xx&dpM)UCEbZ+*zPfL2C|u~;k{vS& zuyL?EWUtm8Nu1st7yFr%xT*4)$n1&vTx+$JZ}L{2fOU!e)414gkE7)UKA!q%;yCeC zAd%g%JOg88*T|%aJqnf;W&)AHjvhT{5X$zoW-6C;cn&@!yOXMQAqxW5`hGm}Kcu-l zBhg{RTU%e;)6Xh-Ms;oL*V2GjIxQ?e^&{}yWZJW*t33teT-!O}dZUFZb8($9w;nHO zyDK2Wt3 zR}>}$7)#mOu6d0~NjhA1xCQq4sf5VwO|^WLOZmvkmpmo^LsPm@lf2fbT1#_RMb58w zwC!xSsbMW(TmY$Cer|ylX>ogPa@+!nFZo?Hdx$@oZ$h5+vU<-MTiRA_Q{>O{@=k`NR<~@x)DJ-pT=7~NzGCk2zae0#IIu1Oe;2R z8lzBF=taXXYdvUc-K{_;X$dr966pHw-jO^Y) z!z!G-SxgPHJN%Z8;=Ln3cQLda)$n{mhE^k^2J!+Aa-b3QHVgT~4&B8?fnKrlFb(B3 zMg!{^r3^)N`Q>!oM`)}GNw}*FYVuPdoo%CSOnr(iFql5^2=u``7 zpc69(Ns1;HmS*1urqCMuN=IXVHz&u~B%y@}oL;GK#^pqlbTB#xxuuPEKG}?tiE5A6 zAik6$NWr)967)wQZ3));EwF$yW&z){Ey{zWgmuUSY;25bne~c5pOn~~*!yhJH90oo z@)D!M0W0q>W00|5UH6baLkfG!-t?21UbM&t3blTjt3K7D!D~QE_*PQ7n{0r=!7DAK zwLbP5r$!?U+qrp7u|D7y@tW2Va>p!|iG9>FPN=rULU>~?-xEy|@=cb=HM zYWC|}y=>zf=1jbCA)J`3X1!SS@Y82o9?q*bwqWm1orO%@w^*z*Qpi0Zs$My>W8F{k zB@MZ%S118LYgsoCY3F}w1H^#Z?UAfJJsg)KfHx?x2B|yd`-o1%oXNY~1 z2`kQAlc%+U9$kU3eNJ$di8)7dldF#=TO6pTSFOl{BZ}?h(ZMK}!x9XKCc5dY$IiIb z%`bXxPv1;Qwn22KXx%nbbz;<5DZV&iWi))jWcBMgexn_`5LE3upFH5!JShI*SIc(A zfm8)?2p?xpYt;Eei+Y$~&ie7(oCcIjOOe2Hqt{|nhS*;~&aWz3xt5=_^IX3N6n*}B zaC6c3*!YljYMMCSY<~G?F=>qrU}mTGL$`=9p^8m7PiA`+kVlYRck3crTRD^t7eo744CS3-xK4!0W_SBysZl^|8tkrBkc;5krs{&Z9juGH}-4<{$CG z*|tzIKGqw!fo~G~2YQ*qWi_Z5`ds@O*Y0LEv#}zkW-7G4yHoO-n@`5x|67e(mPkLA zW2JEQv@_T{iMk^&v`}W^?V^@5{ifDYr7H}!5UuU%(dnGRj!d#S6J0)Lqj?-YAjBEk zNGyLfyfFdFd(xXe(nDd#(Y&=bVp_|DAE<)^DB~$fYYE{h!ePvjRl-bV>$hhZh^6Oi zj8mkGAArK}7+2xMgZT4Q_8Pyhwby_XG&rvBfNQ?L)M;ZaFJgrOXaCqq%#a#p2E0a^ z$!fK6Sv>l`1oloP?99KUTS+g9dkH4*nCBBX6+DYVy@g+Oo1x}owR_4CS zhg6#Gz$nct%NZrb->U9SXdk0Vy251H_RAi2$MA1PkEEqH4H!}%cs5qMJuFTcRf9Dx z_UX&sF1o-b-2eL|s}eba2;%dtHI=;p+}BHF^Dex2>SM6i#f0R{9*FhFzvtGn`u{fE zsR^F#5Hrb{E)OFuP{-!ViHPV}nI@`t3T~8@Ocrf zeaSPD%2Ywa%~ae^krq*CP3=5_XKs%0~B zd3$oln+#7HqGBS5ze|3zk10>*$it?%9V(&d!4h+9BaVQd5Vh>otkd$_=}c>E)(-w~ z4Orh^MyXYNp~29xN9k-HPuNz#?btpG>=ilad9#TTf#V9wO_O97XhADltrd-<~(f{TGoOI~bJZH}X?Wx?DJg?&Y2yXsZYnmd`5 zk}ql<4n2o{1)YgULkgR)EeHo6`!0mAoX`EbOq5HS{c>U^-9s`n@<1xOFgks)$t(hQ zGKshTnqX;E1>po5mP-+q=!PEiI${=ly>*4+Q|D?@mI?!@>0K47mSIG5n!*ncDBePy zNm!J!2Ta|g_4#o;_ib3!ec~nXDGKAdJG=&{RrD5BqJHG8&yP-g8f-fwFMlzgh3*;p}dKyB`H_>`IFhM78jGKr~?z+0%2jG>&@$=Q8#O*6_zf02D z614fvOS}JcC;BmFusbSMHo#)0LCX=9+TR;FjZsivQna-0_t_dZFB+03bTc~@9bxCk zH7Y>vMgOj8p^0Bbmlx zYm4sDbKI0HZKTqFG`Zvz4HXbR+$^%gecL{&j{X0eJpAn z-C4jSuVY;&SPGiVM>eXL^Na+rD%{=LZl8;2E7p0S*d$zp3jwciP4*k10_v$hm>FQZCeS-H zXI>usj`jF^0Yy(f=@ZU3KkR0TbFEJ{+<$$)Kl*9ZX-SP##6c{2`L}>|*7f|=Hz(UO zH9>H17jWtftu{c$$ECLSQTE3&iyP$i2|fh~EbzxUw82Qcxp0N+e8aFKq-3B&p28-t z7S$?=>Tme8{M0x8lT%aHR|LzLw(KP&p&OD84B=L_?f0%Mxzo~ptDY-rG zHRiRC1eS?+;NJ#7vlSPRuAk^!hUP=cga3+VuR6sb-;dJMhQ|VfUUG0kcX8WE;%TK8 zCdX1=!;lz;bO*{`^HaW!%aZmo65Y{+uJ@hf4xG2Y|IbOH^OoCHKu}NLKrAt#-XTX5 z)|a>Xm!l8*rb7Ilr~&lNh}RO&*B2YUCu*a@1Y37(f0v3RsE!dz9&MF^eddhsRQYR0 z7m({|ILXT0N5;z*psxR>V`gYOg%d9&@lKY|npKl5Y*-q$9kHIU9UNXwp|QASD^`F# zdr%+8F$Y2TS_*lmvj8$$tNtxr9(No`@=Lm=Xs{gbI^|&ZiphsugO=Y_@qN}!O6>op zqg4JtC<0H7Xiux-9_{+?D43xY5>LN29&sIFEO5^y~cWC z2hp^8HS$Bc@t_}W>Dl@wlGsI%pE)CH0MNG>OJTRfW1w zRR{cAjQrJhi!TyoVJkSU3pzEPdkv_YwnMMVR{6L1s1ktpdnT@8sI=Y+-jU9>8VjT$ zyXy0b_T61bn?LC`7Y=dGEvP7N+-ky4m3`vBZCJ07@$v}4o7l)aG55#9B3vvQQZf)$tg z5oHmII_q+$JDj*004a2>sc-3{ z@;3!53wy0f`%Nw&M=V$2znC`78|QlW2-y9ezk+IpBZx+_aVssTfWORPT}yC8CD=6Z z&~buCo#;fX_{0UBtudRnj?HnnB=>DtngElD@fJwHwTe8fuOEpIQKII6y;_SW7uSz* z*I5T-*STYT64DDTV34Nf7sp|#I%(}{ku*Lh5YnIS4 z5gL^`b&d7AoffQe%?*oQ$^38iT)$8gg%?_eVqLN#M~2TzMe18haA$U`4hq!fzbQwS zPQ0XFNII~NjkFpu&vR2KttHoj{vlLl*7j1Lv-R3t zYpcs^pe=>Fdk6D~JbT2=a^=4Oec`C$uCoO}`}P|4#tVPQ5V^Uh9v@vmJxV_kE^@w0 z|G7vP_a>cpQd%S3lY7mdgNCKV{N;%<+PY`wSP}y_q zqsxMey7zzNyUAILd2!5{>8xd}Uss8n5_C#%q10p!q|d@<1#D;#%-hDb>k#e{G)pno zEzpQa%fE&`vBe`Eur2rD$aQ;q$+aEttlTd~bSINL-mgpyx$Y!R4HFzTyvk=O6NZxv z(3G@oPdBYvV#2s+U2)ijWj*;C5E3x6rmbYTu8_c-3g3`V<2p4P>-<(&D^r|Lrf$7b zV=wx9Vkf>rOL_P$OjW2|yyMvbyf?w<*J{G5)up;AKsDn1Xj-Gl6RZI;Ik5U3wEQJw zF6_+Og0jimnrVa-c(1^MycS!E*m);2o*RpDT&<|Tz*aC%n3i|EhZAh>!FIf}44pe} zYD4ZAq}XCAZxtx8esNTSp`)s5H&7N;TKBkKGn8$vQ;f#BI7qcyqk0NKBcY_j0l3!} z$y-~6B=a4Vi<{z3XTi^}UH-~y0%JGI2~o72+$65OR3}=w1>q#%wE;+{X{T!H<0<-P z>ekOh8|ZQ)-#p|#Nfts4a98~?NLZBdo@lQl^U`0Hfu_<%Q(*_7U4=sN9a$l^9Zk@x zR(TXaP@r)C;g{1Ubn6BaSw-|C_uN-ZO!7fSDs5mevqHI6s})#TkmO) z`i){)54U}J>ym&mw3)Bf{KDA3YhKZIYLb~>Z$gd51(v1hi^_;7#{6gsQ9XLWa`vL0Z?Op67vH zL+^>85gstN`6u%3pt{>Z-{&5aw~}WqtTLXTFfogJXe7ZjBp*!3ItQ>ZhJF7tV`a^_y}}v9Uu$$mj1XtzL@#AjbOD<_CCGDod#x-~99|_{KM^D*xT3C= z6mM7k`oBzOQC|4Fz+RJ6bH7Rlw+p1j_lC;;CgR%l8UTtKE!M0BHJKc1fB#6l=E*t4}wQ@+}ZwZuVdD@jQ4`=VHFYF6ZwfbFNH-McMa2a4aj>^}?w{hxWN4 zKZULi)btPK&D2n$!e+kWwMJiCV=)D)BY9#xe!(yJrHepw>8ZtM0P8y8#{w%zHzh1n z#kohejNKS?@`cFpowjOH&KRFIXmmF%%zsGIrr+R_W76jZJ}01$IoMwJABeb3I28mo zZ{e$T=U5K+AEwnWl`yehcKier>m?iijZFMO!&fYKk2pOz5?|>D5h5CaCPlsaPLyub ztrv`liv4bf)iKEZkAI$)$fUL4eDi1~uv*zvGTnT%6}kMKZum@5QBqX1_pwq+W+LXs*--Q6SD4D9Z0$|fmQAMAQbeoS+9y}ek49St&a}LN z-uvBBIqv1)IP6jfT_{eD4p29H!zDM?j`FjOse5qm3{|v9v_jDw8RA3_S>}~ci6UQ% zLN)NS;&>uZXYY%_XAKi}+Mi%)-@HJ^0fU=t_?=}(yo!=Rz?i0VWqz*)rkC376G}8u zW9l;>`8duxBfsoBPnMj!UQITi+{v!d&Qo{@T(p0dWWe|gFXYvY6e0g*9T z|IJe7C&XgpJ|c0hlEw?i@t*XJ_5LV@Ec#argT!8UX9-+OX&856$p+! zy;N3G@RCoZW_Z$JSL!FwV`e|uDbdO}ON{C;(9wJ1;ZyHHqr`%fQdcc5B5ejKw6Fez z4;7@Yn1%KBMy&);=Ki@zkhzTHFy$i$56HXd|q(=foE*gh?J!kSSn^?|Fw_#Ff zgHuh4c)`;BCr|%S@ugM@XIj!s`OocXysr8Wu=E5OyFQy(dE~gi`*;T7U^}jYG@~2R zYd)uCt$!W!cyZu!J69XQV{iCnn3ICw2SCrz>X|xOqq4At08hxD0n!LIP1*&)vZq1{ z1!01?6PJ=kV&HprYLh$#^f^O29pq3$LVJ0v9rm#orO^QCBb(>s3LaDTof3YW)mou` zxRaRzu_aZ(CywA}bNOP3e%H!FT}NIGxzczOJGRzj|IzI>B$9n$8l`06UAL(0E&*O!wu#LaJ`U-1<_51uQ1u zW1>n0;f`0Jn+Ckj60(96NX&D2iBPH8tvzT=An~M$`73O~3}~TD%RH?aeWwh3UyvtEE+= z%!zY)q<_1`?*CGV^%~zA7G~mChw>x*YD&;s`~zR9m;0WLYVprf)C~^EUD!t0z$@g) zX@`Cke>nEXcx)c2)6GHi1%~S>OhIy{@@2ir8C)`4@#CsNKfMEpb4gLL9{ZJ=zqJMU zv?IdI>9n7T3Dl_wa~2MfJXmoh8%KCRfU(XZYm{zf0yzP=Jv@%uues6APOgNc8}q@K zF05wFCgZvOQPVN(WB3mzz60a#Ex5}kKRMAvI@!FW-s@~f2YE(b5I4L}UgoKyFvO=R zgzzb5Rx+*F_y_yKO8u7_-B`@J@c_vW|{{O~`fbta@8r{l znpWQB3KTOx+iC?MEhPkog8|4wt{!HVc1&`LNtX7lFeGtVvL|>sx6AV7E5YUN^|`GT z1fl9K=Q09goPM@9GnM%&fj$7$f>i6-h-hpwJ>I0C!UCLvY^Q4*^Gp(FC=c!li@;BoF2~|p6KqZ V+RX%q|M_fCLrv#N>7$py{~PIP=CJ?( literal 0 HcmV?d00001 diff --git a/web_calendar_slot_duration/static/description/icon.png b/web_calendar_slot_duration/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/web_calendar_slot_duration/static/description/index.html b/web_calendar_slot_duration/static/description/index.html new file mode 100644 index 000000000000..9de3c5b54127 --- /dev/null +++ b/web_calendar_slot_duration/static/description/index.html @@ -0,0 +1,467 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

Calendar slot duration

+ +

Production/Stable License: LGPL-3 OCA/calendar Translate me on Weblate Try me on Runboat

+

This module extends the functionality of backend calendars to support +custom slot durations and to allow you to provide more specific UX +regarding event duration and snapping.

+

Table of contents

+ +
+

Configuration

+

This documentation is for developers.

+

If you want to configure your calendar view’s snap duration, make sure +that your window action includes a context similar to this (example is +the default value):

+
+{"calendar_slot_duration": "00:30:00"}
+
+

It can be added in actions defined on python or as +ir.actions.act_window records.

+

edit action settings

+

result

+
+
+

Usage

+

To use this module, you need to install some other addon that uses it, +as it doesn’t provide any end-user functionality.

+

As demo data, this module modifies the “Scheduled Actions” calendar to +have slots of 10 minutes as feature demonstration.

+
+
+

Known issues / Roadmap

+ +
+
+

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:
      +
    • Jairo Llopis
    • +
    • Stefan Ungureanu
    • +
    +
  • +
+
+
+

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.

+

Current maintainer:

+

Yajo

+

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

+

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

+
+
+
+
+ + diff --git a/web_calendar_slot_duration/static/src/js/calendar_common_renderer.esm.js b/web_calendar_slot_duration/static/src/js/calendar_common_renderer.esm.js new file mode 100644 index 000000000000..f2b103f4329f --- /dev/null +++ b/web_calendar_slot_duration/static/src/js/calendar_common_renderer.esm.js @@ -0,0 +1,15 @@ +/* Copyright 2023 Tecnativa - Stefan Ungureanu + * License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). */ + +import {CalendarCommonRenderer} from "@web/views/calendar/calendar_common/calendar_common_renderer"; +import {patch} from "@web/core/utils/patch"; + +patch(CalendarCommonRenderer.prototype, { + get options() { + const options = super.options; + if (this.env.searchModel.context.calendar_slot_duration) { + options.slotDuration = this.env.searchModel.context.calendar_slot_duration; + } + return options; + }, +}); diff --git a/web_calendar_slot_duration/static/src/js/calendar_model.esm.js b/web_calendar_slot_duration/static/src/js/calendar_model.esm.js new file mode 100644 index 000000000000..af828c1b8b2d --- /dev/null +++ b/web_calendar_slot_duration/static/src/js/calendar_model.esm.js @@ -0,0 +1,24 @@ +/* Copyright 2023 Tecnativa - Stefan Ungureanu + + * License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). */ + +import {CalendarModel} from "@web/views/calendar/calendar_model"; +import {patch} from "@web/core/utils/patch"; + +patch(CalendarModel.prototype, { + buildRawRecord(partialRecord, options = {}) { + if ( + !partialRecord.end && + this.env.searchModel.context.calendar_slot_duration && + !partialRecord.isAllDay + ) { + const slot_duration = this.env.searchModel.context.calendar_slot_duration; + const [hours, minutes, seconds] = slot_duration + .match(/(\d+):(\d+):(\d+)/) + .slice(1, 4); + const durationFloat = hours + minutes / 60 + seconds / 3600; + partialRecord.end = partialRecord.start.plus({hours: durationFloat}); + } + return super.buildRawRecord(partialRecord, options); + }, +}); From 3a4c65ee672bb493b1cb9464f5f248d1f6c428a5 Mon Sep 17 00:00:00 2001 From: Milan Topuzov Date: Tue, 7 Oct 2025 23:40:47 +0200 Subject: [PATCH 2/2] [pre-commit] autofixes --- web_calendar_slot_duration/README.rst | 20 +++++++++---------- web_calendar_slot_duration/__manifest__.py | 2 +- .../static/description/index.html | 12 +++++------ 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/web_calendar_slot_duration/README.rst b/web_calendar_slot_duration/README.rst index 7fcf17a10c47..a71a20d24986 100644 --- a/web_calendar_slot_duration/README.rst +++ b/web_calendar_slot_duration/README.rst @@ -20,14 +20,14 @@ Calendar slot duration .. |badge2| image:: https://img.shields.io/badge/license-LGPL--3-blue.png :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html :alt: License: LGPL-3 -.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fcalendar-lightgray.png?logo=github - :target: https://github.com/OCA/calendar/tree/19.0/web_calendar_slot_duration - :alt: OCA/calendar +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/19.0/web_calendar_slot_duration + :alt: OCA/web .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/calendar-19-0/calendar-19-0-web_calendar_slot_duration + :target: https://translation.odoo-community.org/projects/web-19-0/web-19-0-web_calendar_slot_duration :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/calendar&target_branch=19.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=19.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -61,8 +61,8 @@ It can be added in actions defined on python or as |result| -.. |edit action settings| image:: https://raw.githubusercontent.com/OCA/calendar/19.0/web_calendar_slot_duration/static/description/edit_action.png -.. |result| image:: https://raw.githubusercontent.com/OCA/calendar/19.0/web_calendar_slot_duration/static/description/calendar_result.png +.. |edit action settings| image:: https://raw.githubusercontent.com/OCA/web/19.0/web_calendar_slot_duration/static/description/edit_action.png +.. |result| image:: https://raw.githubusercontent.com/OCA/web/19.0/web_calendar_slot_duration/static/description/calendar_result.png Usage ===== @@ -81,10 +81,10 @@ Known issues / Roadmap Bug Tracker =========== -Bugs are tracked on `GitHub Issues `_. +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. @@ -125,6 +125,6 @@ Current `maintainer `__: |maintainer-Yajo| -This module is part of the `OCA/calendar `_ 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_calendar_slot_duration/__manifest__.py b/web_calendar_slot_duration/__manifest__.py index bb5dd4532212..bec6f8885e02 100644 --- a/web_calendar_slot_duration/__manifest__.py +++ b/web_calendar_slot_duration/__manifest__.py @@ -6,7 +6,7 @@ "version": "19.0.1.0.0", "development_status": "Production/Stable", "category": "Extra Tools", - "website": "https://github.com/OCA/calendar", + "website": "https://github.com/OCA/web", "author": "Tecnativa, Odoo Community Association (OCA)", "maintainers": ["Yajo"], "license": "LGPL-3", diff --git a/web_calendar_slot_duration/static/description/index.html b/web_calendar_slot_duration/static/description/index.html index 9de3c5b54127..5783a01f2a85 100644 --- a/web_calendar_slot_duration/static/description/index.html +++ b/web_calendar_slot_duration/static/description/index.html @@ -374,7 +374,7 @@

Calendar slot duration

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:f4d4e1daaaaf9380d55af539273f0e6303157a519d96242ee8f56e510f178f88 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Production/Stable License: LGPL-3 OCA/calendar Translate me on Weblate Try me on Runboat

+

Production/Stable License: LGPL-3 OCA/web Translate me on Weblate Try me on Runboat

This module extends the functionality of backend calendars to support custom slot durations and to allow you to provide more specific UX regarding event duration and snapping.

@@ -404,8 +404,8 @@

Configuration

It can be added in actions defined on python or as ir.actions.act_window records.

-

edit action settings

-

result

+

edit action settings

+

result

Usage

@@ -422,10 +422,10 @@

Known issues / Roadmap

Bug Tracker

-

Bugs are tracked on GitHub Issues. +

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.

@@ -457,7 +457,7 @@

Maintainers

promote its widespread use.

Current maintainer:

Yajo

-

This module is part of the OCA/calendar 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.