From 21d4ded34210f6260d9b39ada5722013db204d1a Mon Sep 17 00:00:00 2001 From: Kevin Luna Date: Tue, 20 Sep 2022 11:56:18 +0200 Subject: [PATCH 01/19] [ADD] queue_management_display: add new module --- queue_management_display/README.rst | 9 ++ queue_management_display/__init__.py | 1 + queue_management_display/__manifest__.py | 20 +++ queue_management_display/models/__init__.py | 4 + .../models/queue_display.py | 97 +++++++++++++ .../models/queue_location.py | 11 ++ .../models/queue_location_group.py | 9 ++ .../models/queue_token_location.py | 65 +++++++++ .../security/ir.model.access.csv | 2 + .../static/description/8mmo6OUh_400x400.jpg | Bin 0 -> 9785 bytes .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/src/js/clock.js | 66 +++++++++ .../src/js/queue_management_controller.js | 57 ++++++++ .../static/src/js/queue_management_model.js | 0 .../src/js/queue_management_renderer.js | 63 +++++++++ .../static/src/js/queue_management_view.js | 38 +++++ .../static/src/scss/queue_management.scss | 131 ++++++++++++++++++ .../static/src/xml/queue_management.xml | 36 +++++ queue_management_display/templates/assets.xml | 37 +++++ queue_management_display/tests/__init__.py | 1 + .../tests/test_queue_display.py | 101 ++++++++++++++ .../views/queue_display.xml | 91 ++++++++++++ .../views/queue_location.xml | 24 ++++ .../views/queue_token_location.xml | 43 ++++++ 24 files changed, 906 insertions(+) create mode 100644 queue_management_display/README.rst create mode 100644 queue_management_display/__init__.py create mode 100644 queue_management_display/__manifest__.py create mode 100644 queue_management_display/models/__init__.py create mode 100644 queue_management_display/models/queue_display.py create mode 100644 queue_management_display/models/queue_location.py create mode 100644 queue_management_display/models/queue_location_group.py create mode 100644 queue_management_display/models/queue_token_location.py create mode 100644 queue_management_display/security/ir.model.access.csv create mode 100644 queue_management_display/static/description/8mmo6OUh_400x400.jpg create mode 100644 queue_management_display/static/description/icon.png create mode 100644 queue_management_display/static/src/js/clock.js create mode 100644 queue_management_display/static/src/js/queue_management_controller.js create mode 100644 queue_management_display/static/src/js/queue_management_model.js create mode 100644 queue_management_display/static/src/js/queue_management_renderer.js create mode 100644 queue_management_display/static/src/js/queue_management_view.js create mode 100644 queue_management_display/static/src/scss/queue_management.scss create mode 100644 queue_management_display/static/src/xml/queue_management.xml create mode 100644 queue_management_display/templates/assets.xml create mode 100644 queue_management_display/tests/__init__.py create mode 100644 queue_management_display/tests/test_queue_display.py create mode 100644 queue_management_display/views/queue_display.xml create mode 100644 queue_management_display/views/queue_location.xml create mode 100644 queue_management_display/views/queue_token_location.xml diff --git a/queue_management_display/README.rst b/queue_management_display/README.rst new file mode 100644 index 0000000..94bb92a --- /dev/null +++ b/queue_management_display/README.rst @@ -0,0 +1,9 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: https://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +======================== +Queue Management Display +======================== + +Management of queue displays diff --git a/queue_management_display/__init__.py b/queue_management_display/__init__.py new file mode 100644 index 0000000..0650744 --- /dev/null +++ b/queue_management_display/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/queue_management_display/__manifest__.py b/queue_management_display/__manifest__.py new file mode 100644 index 0000000..b1ab5f6 --- /dev/null +++ b/queue_management_display/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright 2022 CreuBlanca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Queue Management Display", + "version": "13.0.1.0.0", + "license": "AGPL-3", + "website": "https://github.com/tegin/kiwi", + "author": "CreuBlanca", + "depends": ["queue_management", "bus", "base_sparse_field"], + "data": [ + "views/queue_token_location.xml", + "views/queue_location.xml", + "security/ir.model.access.csv", + "views/queue_display.xml", + "templates/assets.xml", + ], + "qweb": ["static/src/xml/queue_management.xml"], + "demo": [], +} diff --git a/queue_management_display/models/__init__.py b/queue_management_display/models/__init__.py new file mode 100644 index 0000000..9ae15df --- /dev/null +++ b/queue_management_display/models/__init__.py @@ -0,0 +1,4 @@ +from . import queue_display +from . import queue_location +from . import queue_token_location +from . import queue_location_group diff --git a/queue_management_display/models/queue_display.py b/queue_management_display/models/queue_display.py new file mode 100644 index 0000000..0727ff1 --- /dev/null +++ b/queue_management_display/models/queue_display.py @@ -0,0 +1,97 @@ +# Copyright 2022 CreuBlanca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from datetime import timedelta + +from odoo import api, fields, models + + +class QueueDisplay(models.Model): + + _name = "queue.display" + _description = "Queue Display" # TODO + + name = fields.Char() + description = fields.Text() + location_ids = fields.Many2many("queue.location") + show_items = fields.Integer(default=10) + max_time = fields.Float(default=24) # Time maximum + shiny_time = fields.Float(default=0.05) # By default, 3 minutes + items = fields.Serialized(compute="_compute_items") + qweb = fields.Text(default=lambda r: r._default_qweb()) + css = fields.Text() + + def _default_qweb(self): + return """ +
+ +
+

+

+
+
+
+
+
+
+
+ + Token + Location + + +
+
+
+
+ +
+
+ """ + + def open_display(self): + self.ensure_one() + action = self.get_formview_action() + action["name"] = self.display_name + action["views"] = [ + ( + self.env.ref( + "queue_management_display.queue_display_form_queue_display_view" + ).id, + "form", + ) + ] + return action + + @api.depends() + def _compute_items(self): + for record in self: + record.items = { + "tokens": [ + { + "id": token.id, + "token": token.token_id.name, + "location": token.expected_location_id.name, + "last_call": fields.Datetime.to_string(token.last_call), + } + for token in record._get_display_tokens() + ] + } + + def _get_display_tokens(self): + return self.env["queue.token.location"].search( + [ + ("expected_location_id", "in", self.location_ids.ids), + ( + "last_call", + ">", + fields.Datetime.now() + timedelta(hours=-self.max_time), + ), + ], + limit=self.show_items, + order="last_call desc", + ) diff --git a/queue_management_display/models/queue_location.py b/queue_management_display/models/queue_location.py new file mode 100644 index 0000000..a185d1d --- /dev/null +++ b/queue_management_display/models/queue_location.py @@ -0,0 +1,11 @@ +# Copyright 2022 CreuBlanca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class QueueLocation(models.Model): + + _inherit = "queue.location" + + display_ids = fields.Many2many("queue.display") diff --git a/queue_management_display/models/queue_location_group.py b/queue_management_display/models/queue_location_group.py new file mode 100644 index 0000000..19e8219 --- /dev/null +++ b/queue_management_display/models/queue_location_group.py @@ -0,0 +1,9 @@ +# Copyright 2022 CreuBlanca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import models + + +class QueueLocationGroup(models.Model): + + _inherit = "queue.location.group" diff --git a/queue_management_display/models/queue_token_location.py b/queue_management_display/models/queue_token_location.py new file mode 100644 index 0000000..233b214 --- /dev/null +++ b/queue_management_display/models/queue_token_location.py @@ -0,0 +1,65 @@ +# Copyright 2022 CreuBlanca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import _, fields, models +from odoo.exceptions import ValidationError + + +class QueueTokenLocation(models.Model): + + _inherit = "queue.token.location" + last_call = fields.Datetime(readonly=True) + expected_location_id = fields.Many2one("queue.location") + + def action_call(self): + self.ensure_one() + location = self.env["queue.location"].browse( + self.env.context.get("location_id") + ) + self._action_call(location) + + def _action_call(self, location): + if not location: + raise ValidationError(_("Location is required")) + if self.state != "draft": + raise ValidationError(_("You cannot call a non draft item")) + if self.group_id and location not in self.group_id.location_ids: + raise ValidationError(_("Location is not in the assigned group")) + if self.location_id and self.location_id != location: + raise ValidationError( + _( + "You cannot call a token from a different location \ + than the assigned location" + ) + ) + + previous_call_token = self.search( + [("expected_location_id", "=", location.id), ("state", "=", "draft")] + ) + if previous_call_token: + previous_call_token.write({"expected_location_id": False}) + + self.write(self._call_action_vals(location)) + self.env["bus.bus"].sendmany(self._get_channel_notifications(location)) + + def _get_channel_notifications(self, location): + notifications = [] + for display in location.display_ids: + notifications.append( + ( + ("%s_%s" % (display._name, display.id)), + { + "id": self.id, + "token": self.token_id.name, + "last_call": fields.Datetime.to_string(self.last_call), + "location": location.name, + }, + ) + ) + return notifications + + def _call_action_vals(self, location): + return { + "expected_location_id": location.id, + "last_call": fields.Datetime.now(), + } diff --git a/queue_management_display/security/ir.model.access.csv b/queue_management_display/security/ir.model.access.csv new file mode 100644 index 0000000..e81a5ec --- /dev/null +++ b/queue_management_display/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +queue_display_admin,queue.display Admin,model_queue_display,queue_management.group_queue_planner,1,1,1,1 diff --git a/queue_management_display/static/description/8mmo6OUh_400x400.jpg b/queue_management_display/static/description/8mmo6OUh_400x400.jpg new file mode 100644 index 0000000000000000000000000000000000000000..172c01715a7c059ac005140b2b867128ccb6e383 GIT binary patch literal 9785 zcmcgyby!rhpbPEh6A@88q zcklha_x^a_``+8<%sIbVd#|vXXbkP`Wrx~qM)n*Kp+4B0T1AM2_;8aPVT9e zj;4aLn*8qylz2O{=T2xm0Px)2*-=MPmR{fB5k1B?01Kc6&;b&F!o zWa>sb0E~0q$og-a{nr&Z<`zz7pn{lSwXhk&(HX?jAl7hmM%>_d5R;l&o0x;R0K^=Q zpn@R&d_y<=gI8{_)gOFzgB^8sfawHKnG9+WC41>6mS7-06V}L-~{jXpwIqmKEB_48o&#X#|*q8 z01vH;_c7U10yq+5W89oPaaH@?5Q1HeCh>SW1(BM&qgR|No|%h%UP zHUPlL1c0ls>+6fW>+7q006?7vfVP+ayzfBX%~zL5{)e*pkpF91**0)X@k z0AK<8BQU(41LOcGDjFIZDipjxp-^-TTucnG5a8fo;Sv!L6B7{-5s{En-y$KUBqJh% zF~BHkXz1wZNNzFSW~9AMO-o06BLo7nVxVK-V`Addk`j^9{*TLb2S9`giHF3aLKp!Q zA_yuG0tY%OfC{;>;2#Boj)8&(MZKv6CmIUs&20P60)B;}qhVan0=OU(3Lz>X z_!wuT|Fi!89H3#zM9|0g{d+$sk`z(&U-wb3ZnlP9$I@v zxBSU|8J>x*w(%W-IkKx(O{y8*dYiyzY&q4+wFdQtI0jCCki(b)^v!Qpbc-ja-ju>F zk&U*4@0?~b8zrf`^2=vKMJMJ~MJ2Iu)$aG6Q~nb8FgK?3>IlF{ioAMCC3*NguldOK z&UU$YX)xzihKK}PZ-foW+#|Hp*s!oya+-w-*0EKpmO<(ltBxtHi(S4yTWzdTOLi}q zB%5Zd{BrL1^j0l1EswMErSF_*EO>UlP({AGfX%ziKDT`TPMs%hyIJCe_~+fN0!@1$ zXrRAYlk$~xuuGyR*3Sd0bE`>R15fL-^Ax|bk!L3n%T{u+$3*MjEQy0Py>>I3>T*ZB z+||fN%2!l|>XJP>{hTIxPfFEXoZXWRKcd68$+b5gj~g8{Vg%4QW7>|BTYMp~WgVRh zY@^jISL;m-BO!IT>$%NQcl+yXs1E=v4@AMjk(XB^VWZi_S(^E+E?x?Jnrz!D#Zj0) zxl=`-_y6j5KeSrN)N`GE;(bgh*~)grsPE76+@N(}Ld2(htHWp?u%eWFjHej_HOxaQ zj;>Z!<1~B&Aib&NyhQ6iFE){D!!sg>dsQ;g$bl{~S~Rvbo#UvXpfD*#1dcXSi9vnk z+EBx65-s(}R3o{^)lXGpEPnv^wf-lQ!b5q(uFaX)*Am_Sk0<;AeDV6qho>h6}3OiL5pi6@f9xUePJtlY(zAS93#VSKDs%8yCnyvrM%uLU-#`4@_ zxD%{yKx?3EeHHVp;xx<6q_Hf4^Zg$gxEC^IitSll-QspL&!p5AYQ;xXel5uwxAFaT z*U`@_irF>R(XZi>!nK7dlS63mtlIhe&#H10tfc=4K`ozQiuA5{*)N<1J3QHQCilsB zC;rM}Z~Sr#@+5CH$&laW8i>17RoG>=iA3&W1(7cfF?0LOmFV)$Y!e+|nN3WUe4%Ri zL_F*NM<5377xm>hT4qX#M-^7>KEHVP+dsu}eaX%Ae(E(UPeBnz@*-FJ+HU_P{6F0Nz$J|fT(6)g zPzWZtkp1Zrf`W<$1qjiJ$mn_ah)GBp-~!TGO#Hku@yy^VhY7BJ5GcwuKu4=0_(F9^ zM1p3!>Wg;`(OjMm2?3Tm3l+OGJ;O0hX$DqbKihIZ(D5uqQbBg%(ZHK~NeS+5QHUBu zzD3$crUJFIkKNw2BpOgO6*pjj_&$9ELNS1 zYrRXE7u$V#I(iK}=Gkfv`>GfolNFOgq;AzhgT23@jjaR4w4}X(dbjNpEvjuA34XY6-wUbWllS;NqSrlj5TRwkd=A55^sn?-(-(q&#?ASyHzth9iHg zj-j3YCyTlJRcG$EPLDGj4JB++rnDc*4|K?#RN}P^1jcJwRN;c(e>^X4iL<9vt={%d z`cQ3G8umZ~#^>fx4L_DK_)2Ql2{+6`A>AZ=(h$sNYuC9rr|H8o?Yc;j@-s}5d97zB zn+q-2RUr3czHAe=4)4KTa;{`;z5tSZ=N;wzLe=8td_LDlB5K+*VUs`1cEb&RnZVa$7VsZpeC#Lyb<(_x=ke1U3t2iSdz6ZXA6)P)IeEf+ui#2+)-TQm||Ie`&j zdVlTY?1>Z?iSvTg^esC2Y{!QL+$gDTbTysM583u@C|?GrZ!p%QZA4gD!Ju#|T-59U18BD5!Hkt8@A*6Rwm({$o_pd=6Gm9eyd8o&olVqgg zc=z1=PlidH4@mFj)9^TA;i7Z*q~jL+2vhv!hSgxNH8_j4EhAygrt>~F61&Jb&RcND zSNzO^)tkq!{kI*0>H=&#d+i#VKYF@WJ`L?}EzB+c)|!gi9CN-|=F;0xDfM}BpBdr7 zUidCPs`Grd$)%A^yS9aMr-0PE$W1Ms_7#=7yA66 z2BIjJrPOo=wB7jDS!w;=D?V^7NF&oES>P zlO5Jl@6e#1gpASY#h+J)O%_O&GaQqXZHyYH7UU#i+qIYZy`JWD#WBD*%LL~+9}xgS zMFE2@4Cvo^4u&#lP(mVNUIrO$5;A%|SyCQ;X&n;>MkY8SA>j912V)&6$gkqk^4K)r z@`+RBmFbn}cVaL5OY#pt>MUxE`<28IP-Y&wBr|46s3_Ag)rev4CKC&3Vdtf&I3@Lv z&n}}LHTL^z90-1_cJ5?W+^0BuIKt0cJ2X2U{nI)BQLwLx(tqw?=(*|BQcw$+$M8(iSmBFmv<*-fwMin zZK%c+&#%&56?4nlJ>H^*w!Vz93KzQ)#OMGfgYyWkZ6q%hs)E3W6D^Txd5VPZK^eux z=D1^DAv2^4pJ&L!a3d?i<;601YOeu``iHaOSADHr3Xhke@T9CXGBOgI%+q}%nq*1+ zM~}0W_Olbz7u;%u9xyKfQkrD&BCFI_w!#Zc)irW-RxnF`9eJTFCd*=p`<(Eh)eJMr z_9Vs7(|yHt9PVDJIIJ0(OTpQG_j>Xb&x?W2!+`JEBbsEz;GIaSimjrJn7p*Z2i2j; z=N=~3S)cHe1{UV?zo_lpUEL`l*ht$y2@`5_l^1g6Y3{>~v0e>{`*ICP%=t4hmTnFb zlbdKh=9G%BxX8@WXwnt4$6k2KUW^yNo*~B6g7;Ck+M+~sRmVqpm`fy!lLwYFh&)Yp zjxMp+SkSb8#buB;CS<@O!*p4$>-wot`V=vMy=|B=kiT@Ra^#3?$LR{{g(q`FI`>4i znJr})=AzpBb%i|PiU}ORjNkx9L%9jf|AyZ;;WjvW=^1!Pq!FmvzXvSJ&49hk%8*|* z(9`m}IL0bz%VVQ_w%K&rd9JD+SFl_3Bd7-V3-NKf0a?1bOS=n4|B!bS9IvxB@F&A? z!BfN#!lAw}LjPrZN3!%5EteBk&o`WJ#yHXsqe5WzIaU7T{uKlh{Js>>w0pBO`(^sj z@Rch$p|vpyx;K`Wyf}nev!S$23vVz!?T^UbX>-8gtGZk9BhApk)^LBqnrK>M9Ff!PCSBoQ%a6(J)pAHR&YLn0ap6F4s&0}@E# zTBd=ym9p`9qxV0w|6?~smqNLEeP^twIU+XVuAOIE&nmuWPx3GmtSPtsSV2TJsOer- zrpk{`BpBbBd&%S(?+6LbUSvk!S8lfERj+D#Mu)-0@rj8;Z8{($GiTfK>mUZvnxHq; z%x4Fp)TYVxEC*$@X*8Sc3)y*_RpJD3+nj95x4N3&qTKY!Uqsm!d$gVU|6!FPuhXG9Av#*2osv>NLteu!7y24VU0J3#eu~B-$@%6j1vV)K^QIn0`>J^-!@AYa zf}ytuDYMy2lxHXgzDJk+J&y^B;NM;lMfFojI`CNOvR6mL=g}jGKk%n^g6(2msv;3& zS^jE0j%Q{f-aNqqBDaUFaG2JzhXwhD?}hgoCe2WAsU6m20sl;sp-G#{K-uOp4= zxpSDHE|Hsp8pD>TLB6;{@z=xwFC7y0z$)9A2rA?HrII__4bNKUx$0d?_nbC{5fRa0 zD6@LAKAe*2^d!VyBq$-q(Bnq2&1|@|5v)N`;mKE5UcdHGyt0 z%r(9AZAP8o0&}GlRJ|lSPC2{$1;Z#0{#Oaiw+l`qOEB2*s3oVS53T_hYsLtTPKp>$ z8N1I)BIaz!0UAnzl6n_2jsmu@pR$(u8A+up6R0f!%v#hx7ur-JSd`zn2D5;!-J6l> z*)}s1(V~)0l;}rRkaO<}4eA%SCdojjxk< zEO{j|<=LUuJ(Y%=eL=e-byXK`IiYWeE{%t=4j2W}CL9RjOKyt!UY26ODmV$U$k&BeigTLTZht6M|Gp+G1O8H7QIZZEru9c=DW`F*sLAPdA-1 zYgr}Xvg@^7!LEAV%~<<^8N;Br(yP!v+0xgoYIErS9bj{0f|L?2%Y1s4mA~MZ<@IJc zT47Fe@ovM1LR}j%+>uoMlWH8Pr>Cyltoj8!3GWwabt-L1yL*iJ*C(P z!EIJ9;<=Kvi1%B%f^2Y`r5H;0e1%tcMvEi)NxI3AW?Ru#nM7lfHTEAw1%pqrn*HFO z3f4!_K_}|qO2keGM)nXiEVRFg001EZ=oxsm33+5p90GFp52O<+N446&$NxJ($G29(7F^Jy z`<@K2&5SrL{kRlvSvDZ&V1M5X+w(o|{uBXHVys`#x- zecEPQiY5Q8_gghvmY3X*OehvbwSD^fU%LvGsnuZ!E#Q!@Tup2rd{mJLO4p9FmFOq7 zOc316a22ZbtC2xl6g~93IeO}gm5&4T2ld3!EwTc*Qt#))@Y7?j;;#~3AYa2vvE*Y%jGLqe)uN%U1mP?4haXM zZ89uf|LW2@Q%Px~D}7&^0dvXV$IQmA$D6hf-^}J|Qf778`y`EA&6Qs}m1Br|v_d_u zfkHDbQfn*>=TUM;vVd&kA`DI%=I50nbr4NVpUGcOee5OU1s@oeC0VK8;Wa@Uu%IH~ zz6=WS2wPA%>}ZMN(4W_InG9T{ZeDHpRMCRHoY@j=E2@hA7>)EUm{%s>{rIxuPLbpL z;VxEn2A+hjf@OEP=GiyOT)$Y(aV-1=h{zWXk;dU8$~hB9DPpcJ{$o>{7)xDLlo~0R zIZWXb@mS67j{Pq&OmEGit+Zi1%I5H!?+^Ev7La(QYKlzllW=*$9J`Qh4F8}|p{4E0 zHHU9Wyoe9vZXyo3C{g}Ldmct10aO#)rJDlQu==y-cJ2X+#XG0ubRQ2V zoinNm+;77d-nTl5;z}n7p8N7}%PHR{*Q_WjsBDVYY97fzjx@L$ou}G!l)jF!<4{UN zxhUCOr`Stjnd_bR69BaiLn@G?qPQ-&4qzK~xeLKPpS}Nh6?f9c?oEt*Fs8pdGlhdC ze(Ti~HOt|9ANV~Z0+zKd`*fknPv~39RRW@-s`wNGNR_qZ@=Vxr)UHVcGvR4IMp1Xp z=b%sr4ideuTx=9IKN#d;(H()U$pWDcN&0Iq0xRlPS#pyZtnv#!T$;evW9*;QKeRqC z3O%;a;W%_fR62|~KAZ5gtdxC1lWsf4wzPChl)K7BwLWK?f!Ben!r2qCWUV)A+jF_l z>w2XJOPW>)4Y5^r)fm?`gK#qIG(9nlq{qZXorn)T%&>BsS6%&(YP`txvcMsy*f-h$ z!A5xve43i0ZY%1rJf1A*dPc_nDm0GiBG!U!nymAO=App%8t|yLxU4xukKN3hUGxaM-!GsEkt5>&Pv@}YHSpx$I~#_>mVd7Q zn+C!Q1Zn)Qz5i9G;)tiHO0*zlnTw})n5Pp@{P5QuXSIpb5%E~2LEl$s7kk-ON-y5Y z(iy)Hf6uS@c=a+nO|iP}o%H8ED05QYN={O z>h#nQIdc0z6Qqz;_S$HF1;NevUH;~Jvbw<2_YVqk70YQ5fn0oF^MmbA8|1Lo(H3=5 z2nX*M;o{$1$Po^g#jB}OURAC`w7;T|0~|-4;*}$~4*zKLSK$BAS8%6dBLYKz2m~Dp z{hJFw03u!nLK$svpQ7hU$Q_lgZ2!K0fcU*p-Q=)@*Ff0(M?dwq zv33iP9S=H`E-^c@H9}A?7uBSPs%r?)Q+|njVS>KoxQ;|0kc_YqrQF-8!`h91Cv&Ny z9y|C}qABz6fwz)|0pcrx5}?h4X;Bo0?+~G}Ex8Dt2zGGe_;TcoHLSt4MI67FYQ-5@ zM&U-C-*Ke5A#3jHYt{BN%@P@u9cAX*QpLjLl(2C%*dCBvnPS#&^G$(WVtdEtoAD)= z_X(?shm1NY{uQYaMAs!NYCQQxt z!YR#3aDt-rc+4d|{Q(}`!#JV#49h`6;7uEcWvskWf{sy(4M5^e2cG*~@s^GWNkT$H397bHT(;6FAYWor7u{wTHwr>tVGRq~0} zr*}oYV(wlqPU1ph2WCL6XiV=+&)8D^_$5o8ij;ix7FWZ#mrr-RT39rm@3q$&kZVRsZ*%~94I+PG;m@QDX_+tj~17N^o?CiburU7n9 zNk1rVaqXalACi`BG*@D*@;AR6Cx=^;7nh!yvCXWB6;q_polA^=Lxc^ZDu3L zG41^r{t?@u0N{^Upy_|oXK=YZ%LymD;|T>x$>*rl-;sjYCd& zqdce^gE{c5D}_@0v`D@_+o!A;)x_a})|)$u_2*9pWod6+CTty`&Faa$r}It|^;30t zlHGtY(9iWT%MgEes?niBBE6u+kgr|HsvNI{`5M4y2paOqRtYyU?hkZS*W_aOz zNjKF~Z?AK~*A-tokEn_s%0=+US~r!&nw@lDoC~yfe5qSGQS@=wBmee7>T_u4B12)7 zRBODFc9=SoSXbgTpjGS<;~I9vVK3BIR`W9sz*yDKss18t;``3#;pSPg z+#EJdEY!aQhr|-&{1@v^tIea+;2BlC#D~3Tf}1Kc(iYeiy2EdZZMys78SIHB-S{oxa%g(@B2Km_tbu|V%s%Z|dfXNtPaoPz4 zPEK7rq^CV3k$g0!AqRs-?_Avon+Ko{Iw3Oftx+xu&|=p9;;VpK>A*>Symu0m*lebD zPdKLm8pdG=6R<6Mk?dslSTUsA+`hu;7M)@fw^E3yM9#PxLa`)im**Y>22Z*>&(aAi zt2W$&pBuyVftg+Rj>KAOFHDc*c<$`wz=r2j-lUOBI*)kmt&iT2@ZSCO4_~L$PVjutlZuGMRx#qhy!z%p$Rb?6Z8bm&nmy*IX)bh(cb??)$B ztd6+kZxWP`@i;9ak8FG@9;w$25+kufwkxC8M7?|~usB8=RM;ID*bwa}U6Xu53C9VWn^LjOgpi8++}YQI3pxAlGPXTNL z7oqAd-MiuOG~(y-1!q!+1WHy{5aJqeGW-#EUwf32Wb7L7O~?IULM z#YGLTf&6q_4Vts&sN#e^UQ7Cd+>VV;>jmvpIS}5kinou%;nlv9OkIQ0tMrvCC+9{t zHvAee-;d=YL=|`$y!p7!ZnfBYz4Nhi^3VPCr~WFPqn2)WTUOIQuenC!Inr^_s%>!- zbTitzgxGQ6EuUe+u4H_-y@}t47l?&K1LrCNT9O7WmueR(?NJMFynVQt4y43&5!JEP zUuPjWqP<70OlTPfK^Uow}HQk3qU)sh|peJDZW_evDTVhX8Ln2F;G zR=Mzl&FWyOIg-0Ks){tb6JHFnP_O&4^7Wz014bVl5@QryhCDu`T?1qps-||!lrF&u zxh-I7wd%`sdJflfpeigN&|xwUY@Rh=f31&}b{xQ=xh$ecl5?7p+6nJ%+(~aqO+I`5 z3Z0|Z^SNtnPLQG>sx(EcU!v~4zTCZs>DhwT66)altJGQ|T%rf@=7(Iv`-orsHSxdb zY>FX0&|&pvDbYWE{5*AOlRD;_N|{`O4(HrZ?ciMQ4lQHl|E4efiw`2tE!M)Mf$mtl z#rXXUM{GbcF5xWm_~zlV=5_}@Nue%B*a;s}#CgPc(9!j%J}IkPBanx{s_~+oRBlz4 z5v{)2;#slS|LB0W@qP6dtE9KG16nrxsO4=(wL`Vy)U<%@gn`hKIdTO)H+;5Xb#aWD^7n zlU(=rN5zwh(N@5nLrv@E2$#8HY#yg<7CJ|>pvxJuYL>MK)14K`n2QytqTbTGb%gSg zNt*nfQm=7m1NXUj?tuh~KOakLpN8qn2sc>LOG7EOLU$TsuacB@-xMMim}q-b=B9YS zyDlyLJJuHy`bB~-p6UCVWoia>vK?(VkQFoGQ!*@z!ADul_`BkZ`_m-5D1(p^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/queue_management_display/static/src/js/clock.js b/queue_management_display/static/src/js/clock.js new file mode 100644 index 0000000..155ce38 --- /dev/null +++ b/queue_management_display/static/src/js/clock.js @@ -0,0 +1,66 @@ +odoo.define("queue_management.Clock", function(require) { + "use strict"; + + var config = require("web.config"); + // Var core = require("web.core"); + var Widget = require("web.Widget"); + // Var _t = core._t; + var clockTemp = null; + + var Clock = Widget.extend({ + template: "queue_management.Clock", + /** + * @override + */ + init: function() { + this._super.apply(this, arguments); + this.isMobile = config.device.isMobile; + }, + /** + * @override + */ + willStart: function() { + clockTemp = this; + return this._super(); + }, + /** + * @override + */ + start: function() { + this.renderTime(); + setInterval(this.renderTime, 1000); + return this._super(); + }, + + renderTime: function() { + this.$(".main_clock").text(clockTemp.getTime()); + this.$(".main_clock_date").text(clockTemp.getDate()); + }, + getDate: function() { + var today = new Date(); + var dd = String(today.getDate()).padStart(2, "0"); + var mm = String(today.getMonth() + 1).padStart(2, "0"); + var yyyy = today.getFullYear(); + var date = dd + "/" + mm + "/" + yyyy; + return date; + }, + getTime: function() { + var today = new Date(); + var h = today.getHours(); + var m = today.getMinutes(); + // Var s = today.getSeconds(); + h = this.checkTime(h); + m = this.checkTime(m); + // S = this.checkTime(s); + var time = h + ":" + m; + return time; + }, + checkTime: function(i) { + if (i < 10) { + i = "0" + i; + } + return i; + }, + }); + return Clock; +}); diff --git a/queue_management_display/static/src/js/queue_management_controller.js b/queue_management_display/static/src/js/queue_management_controller.js new file mode 100644 index 0000000..6a66caa --- /dev/null +++ b/queue_management_display/static/src/js/queue_management_controller.js @@ -0,0 +1,57 @@ +odoo.define("queue_management.QueueDisplayController", function(require) { + "use strict"; + + var BasicController = require("web.BasicController"); + var core = require("web.core"); + var field_utils = require("web.field_utils"); + var qweb = core.qweb; + + // Var clockTemp = null; + + var QueueDisplayController = BasicController.extend({ + custom_events: _.extend({}, BasicController.prototype.custom_events, { + notification_received: "_onNotificationReceived", + render_token: "_onRenderToken", + }), + init: function() { + this._super.apply(this, arguments); + this.queue_data = {}; + }, + _onNotificationReceived: function(ev) { + var token = ev.data.notification; + token.last_call = field_utils.parse + .datetime(token.last_call, null, { + timezone: false, + }) + .unix(); + this.queue_data[ev.data.notification.id] = token; + }, + _onRenderToken: function() { + this.$(".o_queue_management_display_body_content_body").empty(); + var self = this; + // Sort the list by last call date + var list = Object.entries(this.queue_data).sort(function(a, b) { + return a[1].last_call > b[1].last_call ? -1 : 1; + }); + var shiny_max_time = + Date.now() / 1000 - this.initialState.data.shiny_time * 3600; + _.each(list.slice(0, 10), function(token) { + console.log( + token[1].last_call > shiny_max_time, + token[1].last_call, + shiny_max_time, + Date.now() + ); + var $row = $( + qweb.render("queue_management_display.queue_display_token_shiny", { + token: token[1].token, + location: token[1].location, + shiny: token[1].last_call > shiny_max_time, + }) + ); + self.$(".o_queue_management_display_body_content_body").append($row); + }); + }, + }); + return QueueDisplayController; +}); diff --git a/queue_management_display/static/src/js/queue_management_model.js b/queue_management_display/static/src/js/queue_management_model.js new file mode 100644 index 0000000..e69de29 diff --git a/queue_management_display/static/src/js/queue_management_renderer.js b/queue_management_display/static/src/js/queue_management_renderer.js new file mode 100644 index 0000000..2d7ee4f --- /dev/null +++ b/queue_management_display/static/src/js/queue_management_renderer.js @@ -0,0 +1,63 @@ +odoo.define("queue_management.QueueDisplayRenderer", function(require) { + "use strict"; + + var BasicRenderer = require("web.BasicRenderer"); + var session = require("web.session"); + var core = require("web.core"); + var qweb = core.qweb; + var Clock = require("queue_management.Clock"); + + var QueueDisplayRenderer = BasicRenderer.extend({ + className: "o_queue_management_display_view", + _renderView: function() { + this.channel = "queue.display_" + this.state.res_id; + this.template_name = "queue_management_display_" + this.state.res_id; + var template = ""; + template += + ""; + template += this.state.data.qweb; + template += ""; + qweb.add_template(template); + + console.log(this.template_name); + this.$el.html( + $( + qweb.render(this.template_name, { + data: this.state.data, + company_id: session.user_companies.current_company[0], + company: session.user_companies.current_company[1], + }) + ) + ); + new Clock(this).appendTo( + this.$(".o_queue_management_display_header_clock") + ); + + var self = this; + _.each(this.state.data.items.tokens, function(token) { + self.trigger_up("notification_received", { + notification: token, + }); + }); + this.trigger_up("render_token"); + this.call("bus_service", "addChannel", this.channel); + this.call("bus_service", "startPolling"); + this.call("bus_service", "onNotification", this, this._onNotification); + + return $.when(); + }, + _onNotification: function(notifications) { + var self = this; + _.each(notifications, function(notification) { + self.trigger_up("notification_received", { + notification: notification[1], + }); + }); + this.trigger_up("render_token"); + }, + }); + + return QueueDisplayRenderer; +}); diff --git a/queue_management_display/static/src/js/queue_management_view.js b/queue_management_display/static/src/js/queue_management_view.js new file mode 100644 index 0000000..097e0e8 --- /dev/null +++ b/queue_management_display/static/src/js/queue_management_view.js @@ -0,0 +1,38 @@ +odoo.define("queue_management.QueueDisplayView", function(require) { + "use strict"; + + var BasicView = require("web.BasicView"); + var QueueDisplayController = require("queue_management.QueueDisplayController"); + // Var DashboardModel = require("kpi_dashboard.DashboardModel"); + var QueueDisplayRenderer = require("queue_management.QueueDisplayRenderer"); + var view_registry = require("web.view_registry"); + var core = require("web.core"); + + var _lt = core._lt; + + var QueueDisplayView = BasicView.extend({ + accesskey: "p", + display_name: _lt("Display"), + icon: "fa-tachometer", + viewType: "queue_display", + config: _.extend({}, BasicView.prototype.config, { + Controller: QueueDisplayController, + Renderer: QueueDisplayRenderer, + // Model: DashboardModel, + }), + multi_record: false, + searchable: false, + init: function() { + this._super.apply(this, arguments); + this.controllerParams.mode = "readonly"; + this.loadParams.type = "record"; + if (!this.loadParams.res_id && this.loadParams.context.res_id) { + this.loadParams.res_id = this.loadParams.context.res_id; + } + }, + }); + + view_registry.add("queue_display", QueueDisplayView); + + return QueueDisplayView; +}); diff --git a/queue_management_display/static/src/scss/queue_management.scss b/queue_management_display/static/src/scss/queue_management.scss new file mode 100644 index 0000000..c3ec165 --- /dev/null +++ b/queue_management_display/static/src/scss/queue_management.scss @@ -0,0 +1,131 @@ +.o_queue_management_display_view { + display: flex; + flex-flow: column; + height: 100%; + //text-align: center; + color: white; + .o_queue_management_display_footer { + flex: 0 1 auto; + background-color: $o-brand-primary; + margin: 0px; + height: 4%; + min-height: 3%; + } + .o_queue_management_display_header { + background-color: $o-brand-primary; + flex: 0 1 auto; + margin: 0px; + height: 6%; + min-height: 4%; + //justify-content: center; + //align-items: center; + + .queue_logo { + //background: linear-gradient(90deg, rgba(255,255,255,1) 0%, rgba(0,175,102,1) 100%); + text-align: center; + + /*h1 { + //font-size: 72px; + background: linear-gradient(to right, rgba(0,175,102,1), rgba(255,255,255,1)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + position: absolute; + top: 50%; + transform: translateY(-50%); + right: 0px; + left: 0px; + text-align: center; + } + + #circle { + background: #f00; + width: 5%; + height: 35%; + border-radius: 50%; + }*/ + } + .o_queue_management_display_header_title { + h1 { + position: absolute; + top: 50%; + transform: translateY(-50%); + right: 0px; + left: 0px; + text-align: center; + } + } + .o_queue_management_display_header_datetime { + .o_queue_management_display_header_clock { + position: absolute; + top: 50%; + transform: translateY(-50%); + right: 0px; + left: 0px; + text-align: center; + width: 100%; + } + .o_clock_date { + margin-bottom: 0px; + //color:#00af66; + } + .o_clock { + //color:#00af66; + margin-bottom: 0px; + } + } + } + .o_queue_management_display_body { + flex: 1 1 auto; + background-color: $o-brand-secondary; + margin: 0px; + + .o_queue_management_display_advertising { + //text-align: center; + //padding-top: 10%; + background-color: black; + iframe { + display: block; /* iframes are inline by default */ + height: 100%; /* Viewport-relative units */ + width: 100%; + } + } + + .o_queue_management_display_body_content { + flex: 1 1 auto; + padding: 16px; + + .o_queue_management_display_body_content_header { + h1 { + background-color: $o-brand-primary; + text-align: center; + font-size: 250%; + } + } + + .o_queue_management_display_body_content_body { + h1 { + font-size: 250%; + } + + .item { + text-align: center; + background-color: rgb(199, 193, 193); + &.shiny { + animation: myfirst 3s 20; + } + @keyframes myfirst { + 0% { + background: grey; + } + 50% { + background: #f39c12; + } + 100% { + background: grey; + } + } + } + } + } + } +} diff --git a/queue_management_display/static/src/xml/queue_management.xml b/queue_management_display/static/src/xml/queue_management.xml new file mode 100644 index 0000000..9ba9c15 --- /dev/null +++ b/queue_management_display/static/src/xml/queue_management.xml @@ -0,0 +1,36 @@ + + diff --git a/queue_management_display/templates/assets.xml b/queue_management_display/templates/assets.xml new file mode 100644 index 0000000..cb61c0e --- /dev/null +++ b/queue_management_display/templates/assets.xml @@ -0,0 +1,37 @@ + + +