Commit 50e19232 by aa.gusti
2 parents a4a7b322 f16146ea
Showing 170 changed files with 8498 additions and 5 deletions
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<!-- Top menu item --> <!-- Top menu item -->
<menuitem id="id_gov_menu_root" <menuitem id="id_gov_menu_root"
name="Referensi" name="Referensi"
web_icon="id_gov_icon,static/description/icon.png" web_icon="id_gov,static/description/icon.png"
active="True" active="True"
sequence="400"/> sequence="400"/>
<menuitem id="wilayah_id_gov_menu" <menuitem id="wilayah_id_gov_menu"
......
from odoo import models, api
from datetime import datetime
class PadDashboard(models.Model):
_inherit = ''
\ No newline at end of file \ No newline at end of file

8.9 KB | W: | H:

8.95 KB | W: | H:

idg_board/static/description/icon.png
idg_board/static/description/icon.png
idg_board/static/description/icon.png
idg_board/static/description/icon.png
  • 2-up
  • Swipe
  • Onion skin
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="70" height="70" viewBox="0 0 70 70">
<defs>
<path id="icon-a" d="M4,5.35309892e-14 C36.4160122,9.87060235e-15 58.0836068,-3.97961823e-14 65,5.07020818e-14 C69,6.733808e-14 70,1 70,5 C70,43.0488877 70,62.4235458 70,65 C70,69 69,70 65,70 C61,70 9,70 4,70 C1,70 7.10542736e-15,69 7.10542736e-15,65 C7.25721566e-15,62.4676575 3.83358709e-14,41.8005206 3.60818146e-14,5 C-1.13686838e-13,1 1,5.75716207e-14 4,5.35309892e-14 Z"/>
<linearGradient id="icon-c" x1="100%" x2="0%" y1="0%" y2="100%">
<stop offset="0%" stop-color="#CD7690"/>
<stop offset="100%" stop-color="#CA5377"/>
</linearGradient>
<path id="icon-d" d="M18.0450069,57.225 C16.6239398,57.2249541 15.319401,56.4292666 14.6550625,55.1573449 C12.9601701,51.9125391 12,48.2137078 12,44.2875 C12,31.4261695 22.2974514,21 35,21 C47.7025486,21 58,31.4261695 58,44.2875 C58,48.2137078 57.0398299,51.9125391 55.3449375,55.1573449 C54.6806259,56.4292924 53.3760701,57.2249902 51.9549931,57.225 L18.0450069,57.225 Z M52.8888889,41.7 C51.4775035,41.7 50.3333333,42.8584723 50.3333333,44.2875 C50.3333333,45.7165277 51.4775035,46.875 52.8888889,46.875 C54.3002743,46.875 55.4444444,45.7165277 55.4444444,44.2875 C55.4444444,42.8584723 54.3002743,41.7 52.8888889,41.7 Z M35,28.7625 C36.4113854,28.7625 37.5555556,27.6040277 37.5555556,26.175 C37.5555556,24.7459723 36.4113854,23.5875 35,23.5875 C33.5886146,23.5875 32.4444444,24.7459723 32.4444444,26.175 C32.4444444,27.6040277 33.5886146,28.7625 35,28.7625 Z M17.1111111,41.7 C15.6997257,41.7 14.5555556,42.8584723 14.5555556,44.2875 C14.5555556,45.7165277 15.6997257,46.875 17.1111111,46.875 C18.5224965,46.875 19.6666667,45.7165277 19.6666667,44.2875 C19.6666667,42.8584723 18.5224965,41.7 17.1111111,41.7 Z M22.3506389,28.8925219 C20.9392535,28.8925219 19.7950833,30.0509941 19.7950833,31.4800219 C19.7950833,32.9090496 20.9392535,34.0675219 22.3506389,34.0675219 C23.7620243,34.0675219 24.9061944,32.9090496 24.9061944,31.4800219 C24.9061944,30.0509941 23.7620243,28.8925219 22.3506389,28.8925219 Z M47.6493611,28.8925219 C46.2379757,28.8925219 45.0938056,30.0509941 45.0938056,31.4800219 C45.0938056,32.9090496 46.2379757,34.0675219 47.6493611,34.0675219 C49.0607465,34.0675219 50.2049167,32.9090496 50.2049167,31.4800219 C50.2049167,30.0509941 49.0607465,28.8925219 47.6493611,28.8925219 Z M40.6952153,31.4423414 C39.686809,31.1156695 38.6082049,31.6784508 38.285566,32.6992195 L34.6181042,44.3034293 C31.9739028,44.501373 29.8888889,46.7346281 29.8888889,49.4625 C29.8888889,52.3205555 32.1772292,54.6375 35,54.6375 C37.8227708,54.6375 40.1111111,52.3205555 40.1111111,49.4625 C40.1111111,47.8636676 39.3946771,46.434559 38.269434,45.4852699 L41.9365764,33.8821113 C42.2591354,32.8612617 41.7033819,31.7690133 40.6952153,31.4423414 Z"/>
</defs>
<g fill="none" fill-rule="evenodd">
<mask id="icon-b" fill="#fff">
<use xlink:href="#icon-a"/>
</mask>
<g mask="url(#icon-b)">
<rect width="70" height="70" fill="url(#icon-c)"/>
<path fill="#FFF" fill-opacity=".383" d="M4,1.8 L65,1.8 C67.6666667,1.8 69.3333333,1.13333333 70,-0.2 C70,2.46666667 70,3.46666667 70,2.8 L1.10547097e-14,2.8 C-1.65952376e-14,3.46666667 -2.9161925e-14,2.46666667 -2.66453526e-14,-0.2 C0.666666667,1.13333333 2,1.8 4,1.8 Z" transform="matrix(1 0 0 -1 0 2.8)"/>
<path fill="#393939" d="M4,50 C2,50 -7.10542736e-15,49.851312 0,45.8367347 L0,26.3942795 L16.3536575,8.86200565 C29.4512192,-0.488174988 39.6666667,-2.3877551 47,3.16326531 C54.3333333,8.71428571 58,14.9591837 58,21.8979592 C55.8677728,29.7827578 54.7719047,33.7755585 54.7123959,33.8763613 C54.6528871,33.9771642 49.9857922,39.3517104 40.7111111,50 L4,50 Z" opacity=".324" transform="translate(0 20)"/>
<path fill="#000" fill-opacity=".383" d="M4,4 L65,4 C67.6666667,4 69.3333333,3 70,1 C70,3.66666667 70,5 70,5 L1.77635684e-15,5 C1.77635684e-15,5 1.77635684e-15,3.66666667 1.77635684e-15,1 C0.666666667,3 2,4 4,4 Z" transform="translate(0 65)"/>
<use fill="#000" fill-rule="nonzero" opacity=".3" xlink:href="#icon-d"/>
<path fill="#FFF" fill-rule="nonzero" d="M18.0450069,55.225 C16.6239398,55.2249541 15.319401,54.4292666 14.6550625,53.1573449 C12.9601701,49.9125391 12,46.2137078 12,42.2875 C12,29.4261695 22.2974514,19 35,19 C47.7025486,19 58,29.4261695 58,42.2875 C58,46.2137078 57.0398299,49.9125391 55.3449375,53.1573449 C54.6806259,54.4292924 53.3760701,55.2249902 51.9549931,55.225 L18.0450069,55.225 Z M52.8888889,39.7 C51.4775035,39.7 50.3333333,40.8584723 50.3333333,42.2875 C50.3333333,43.7165277 51.4775035,44.875 52.8888889,44.875 C54.3002743,44.875 55.4444444,43.7165277 55.4444444,42.2875 C55.4444444,40.8584723 54.3002743,39.7 52.8888889,39.7 Z M35,26.7625 C36.4113854,26.7625 37.5555556,25.6040277 37.5555556,24.175 C37.5555556,22.7459723 36.4113854,21.5875 35,21.5875 C33.5886146,21.5875 32.4444444,22.7459723 32.4444444,24.175 C32.4444444,25.6040277 33.5886146,26.7625 35,26.7625 Z M17.1111111,39.7 C15.6997257,39.7 14.5555556,40.8584723 14.5555556,42.2875 C14.5555556,43.7165277 15.6997257,44.875 17.1111111,44.875 C18.5224965,44.875 19.6666667,43.7165277 19.6666667,42.2875 C19.6666667,40.8584723 18.5224965,39.7 17.1111111,39.7 Z M22.3506389,26.8925219 C20.9392535,26.8925219 19.7950833,28.0509941 19.7950833,29.4800219 C19.7950833,30.9090496 20.9392535,32.0675219 22.3506389,32.0675219 C23.7620243,32.0675219 24.9061944,30.9090496 24.9061944,29.4800219 C24.9061944,28.0509941 23.7620243,26.8925219 22.3506389,26.8925219 Z M47.6493611,26.8925219 C46.2379757,26.8925219 45.0938056,28.0509941 45.0938056,29.4800219 C45.0938056,30.9090496 46.2379757,32.0675219 47.6493611,32.0675219 C49.0607465,32.0675219 50.2049167,30.9090496 50.2049167,29.4800219 C50.2049167,28.0509941 49.0607465,26.8925219 47.6493611,26.8925219 Z M40.6952153,29.4423414 C39.686809,29.1156695 38.6082049,29.6784508 38.285566,30.6992195 L34.6181042,42.3034293 C31.9739028,42.501373 29.8888889,44.7346281 29.8888889,47.4625 C29.8888889,50.3205555 32.1772292,52.6375 35,52.6375 C37.8227708,52.6375 40.1111111,50.3205555 40.1111111,47.4625 C40.1111111,45.8636676 39.3946771,44.434559 38.269434,43.4852699 L41.9365764,31.8821113 C42.2591354,30.8612617 41.7033819,29.7690133 40.6952153,29.4423414 Z"/>
</g>
</g>
</svg>
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
@import url(https://fonts.googleapis.com/css2?family=Work+Sans:wght@300;400;500;600&display=swap);#page-topbar{position:fixed;top:0;right:0;left:0;z-index:1002;background-color:#fff;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.08);box-shadow:0 1px 1px rgba(0,0,0,.08)}.navbar-header{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;-webkit-box-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0 auto;height:70px;padding:0 calc(24px / 2) 0 0}.navbar-header .dropdown .show.header-item{background-color:#fafafa}.navbar-brand-box{padding:0 1.5rem;width:250px}.logo{line-height:70px}.logo .logo-sm{display:none}.logo-dark{display:block}.logo-light{display:none}.app-search{padding:calc(32px / 2) 0}.app-search .form-control{border:none;height:38px;padding-left:40px;padding-right:20px;background-color:#f1f5f7;-webkit-box-shadow:none;box-shadow:none}.app-search span{position:absolute;z-index:10;font-size:16px;line-height:38px;left:13px;top:0;color:#74788d}.megamenu-list li{position:relative;padding:5px 0}.megamenu-list li a{color:#505d69}@media (max-width:991px){.navbar-brand-box{width:auto}.logo span.logo-lg{display:none}.logo span.logo-sm{display:inline-block}}.page-content{padding:calc(70px + 24px) calc(24px / 2) 60px calc(24px / 2)}.header-item{height:70px;-webkit-box-shadow:none!important;box-shadow:none!important;color:#636e75;border:0;border-radius:0}.header-item:hover{color:#636e75}.header-profile-user{height:36px;width:36px;background-color:#f1f5f7;padding:3px}.user-dropdown .dropdown-item i{display:inline-block}.noti-icon i{font-size:22px;color:#636e75}.noti-icon .noti-dot{position:absolute;display:inline-block;height:6px;width:6px;background-color:#ff3d60;border-radius:50%;top:20px;right:14px}.notification-item .d-flex{padding:.75rem 1rem}.notification-item .d-flex:hover{background-color:#f1f5f7}.dropdown-icon-item{display:block;border-radius:3px;line-height:34px;text-align:center;padding:15px 0 9px;display:block;border:1px solid transparent;color:#74788d}.dropdown-icon-item img{height:24px}.dropdown-icon-item span{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown-icon-item:hover{border-color:#eff2f7}.fullscreen-enable [data-toggle=fullscreen] .ri-fullscreen-line:before{content:"\ed73"}body[data-topbar=dark] #page-topbar{background-color:#252b3b}body[data-topbar=dark] .logo-dark{display:none}body[data-topbar=dark] .logo-light{display:block}body[data-topbar=dark] .navbar-header .dropdown .show.header-item{background-color:rgba(255,255,255,.05)}body[data-topbar=dark] .navbar-header .waves-effect .waves-ripple{background:rgba(255,255,255,.4)}body[data-topbar=dark] .header-item{color:#e9ecef}body[data-topbar=dark] .header-item:hover{color:#e9ecef}body[data-topbar=dark] .header-profile-user{background-color:rgba(255,255,255,.25)}body[data-topbar=dark] .noti-icon i{color:#e9ecef}body[data-topbar=dark] .app-search .form-control{background-color:rgba(241,245,247,.07);color:#fff}body[data-topbar=dark] .app-search input.form-control::-webkit-input-placeholder,body[data-topbar=dark] .app-search span{color:rgba(255,255,255,.5)}body[data-sidebar=dark] .navbar-brand-box{background:#1b2c3f}body[data-sidebar=dark] .logo-light{display:block}body[data-sidebar=dark] .logo-dark{display:none}@media (max-width:600px){.navbar-header .dropdown{position:static}.navbar-header .dropdown .dropdown-menu{left:10px!important;right:10px!important}}@media (max-width:380px){.navbar-brand-box{display:none}}body[data-layout=horizontal] #page-topbar{-webkit-box-shadow:none;box-shadow:none}body[data-layout=horizontal] .navbar-brand-box{width:auto}body[data-layout=horizontal] .page-content{margin-top:70px;padding:calc(55px + 24px) calc(24px / 2) 60px calc(24px / 2)}@media (max-width:992px){body[data-layout=horizontal] .page-content{margin-top:15px}}.page-title-box{padding-bottom:24px}.page-title-box .breadcrumb{background-color:transparent;padding:0}.page-title-box h4{font-size:18px;font-weight:600}.footer{bottom:0;padding:20px calc(24px / 2);position:absolute;right:0;color:#74788d;left:250px;height:60px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.08);box-shadow:0 1px 1px rgba(0,0,0,.08);background-color:#fff}@media (max-width:992px){.footer{left:0}}.vertical-collpsed .footer{left:70px}body[data-layout=horizontal] .footer{left:0!important}.right-bar{background-color:#fff;-webkit-box-shadow:0 0 24px 0 rgba(0,0,0,.06),0 1px 0 0 rgba(0,0,0,.02);box-shadow:0 0 24px 0 rgba(0,0,0,.06),0 1px 0 0 rgba(0,0,0,.02);display:block;position:fixed;-webkit-transition:all .2s ease-out;transition:all .2s ease-out;width:280px;z-index:9999;float:right!important;right:-290px;top:0;bottom:0}.right-bar .right-bar-toggle{background-color:#444c54;height:24px;width:24px;line-height:24px;color:#eff2f7;text-align:center;border-radius:50%}.right-bar .right-bar-toggle:hover{background-color:#4b545c}.rightbar-overlay{background-color:rgba(52,58,64,.55);position:absolute;left:0;right:0;top:0;bottom:0;display:none;z-index:9998;-webkit-transition:all .2s ease-out;transition:all .2s ease-out}.right-bar-enabled .right-bar{right:0}.right-bar-enabled .rightbar-overlay{display:block}@media (max-width:767.98px){.right-bar{overflow:auto}.right-bar .slimscroll-menu{height:auto!important}}.metismenu{margin:0}.metismenu li{display:block;width:100%}.metismenu .mm-collapse{display:none}.metismenu .mm-collapse:not(.mm-show){display:none}.metismenu .mm-collapse.mm-show{display:block}.metismenu .mm-collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;transition-property:height,visibility}.vertical-menu{width:250px;z-index:1001;background:#fff;bottom:0;margin-top:0;position:fixed;top:70px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.08);box-shadow:0 1px 1px rgba(0,0,0,.08)}.main-content{margin-left:250px;overflow:hidden}.main-content .content{padding:0 15px 10px 15px;margin-top:70px}#sidebar-menu{padding:10px 0 30px 0}#sidebar-menu .mm-active>.has-arrow:after{-webkit-transform:rotate(-180deg);transform:rotate(-180deg)}#sidebar-menu .has-arrow:after{content:"\F0140";font-family:"Material Design Icons";display:block;float:right;-webkit-transition:-webkit-transform .2s;transition:-webkit-transform .2s;transition:transform .2s;transition:transform .2s,-webkit-transform .2s;font-size:1rem}#sidebar-menu ul li a{display:block;padding:.625rem 1.5rem;color:#74788d;position:relative;font-size:.92rem;-webkit-transition:all .4s;transition:all .4s;font-family:"Work Sans",sans-serif}#sidebar-menu ul li a i{display:inline-block;min-width:1.5rem;font-size:1.1rem;line-height:1.40625rem;vertical-align:middle;color:#505d69;-webkit-transition:all .4s;transition:all .4s;opacity:.75}#sidebar-menu ul li a:hover{color:#383c40}#sidebar-menu ul li a:hover i{color:#383c40}#sidebar-menu ul li .badge{margin-top:4px}#sidebar-menu ul li ul.sub-menu{padding:0}#sidebar-menu ul li ul.sub-menu li a{padding:.4rem 1.5rem .4rem 3.2rem;font-size:14px;color:#7c8a96}#sidebar-menu ul li ul.sub-menu li ul.sub-menu{padding:0}#sidebar-menu ul li ul.sub-menu li ul.sub-menu li a{padding:.4rem 1.5rem .4rem 4.2rem;font-size:14px}.menu-title{padding:12px 20px!important;letter-spacing:.05em;pointer-events:none;cursor:default;font-size:11px;text-transform:uppercase;color:#505d69;font-weight:600;font-family:"Work Sans",sans-serif;opacity:.5}.mm-active{color:#0bb197!important}.mm-active>a{color:#0bb197!important}.mm-active>a i{color:#0bb197!important}.mm-active>i{color:#0bb197!important}.mm-active .active{color:#0bb197!important}.mm-active .active i{color:#0bb197!important}@media (max-width:992px){.vertical-menu{display:none}.main-content{margin-left:0!important}body.sidebar-enable .vertical-menu{display:block}}.vertical-collpsed .main-content{margin-left:70px}.vertical-collpsed .navbar-brand-box{width:70px!important;padding:0}.vertical-collpsed .logo span.logo-lg{display:none}.vertical-collpsed .logo span.logo-sm{display:block}.vertical-collpsed .vertical-menu{position:absolute;width:70px!important;z-index:5}.vertical-collpsed .vertical-menu .simplebar-content-wrapper,.vertical-collpsed .vertical-menu .simplebar-mask{overflow:visible!important}.vertical-collpsed .vertical-menu .simplebar-scrollbar{display:none!important}.vertical-collpsed .vertical-menu .simplebar-offset{bottom:0!important}.vertical-collpsed .vertical-menu #sidebar-menu .badge,.vertical-collpsed .vertical-menu #sidebar-menu .collapse.in,.vertical-collpsed .vertical-menu #sidebar-menu .menu-title{display:none!important}.vertical-collpsed .vertical-menu #sidebar-menu .nav.collapse{height:inherit!important}.vertical-collpsed .vertical-menu #sidebar-menu .has-arrow:after{display:none}.vertical-collpsed .vertical-menu #sidebar-menu>ul>li{position:relative;white-space:nowrap}.vertical-collpsed .vertical-menu #sidebar-menu>ul>li>a{padding:15px 20px;min-height:55px;-webkit-transition:none;transition:none}.vertical-collpsed .vertical-menu #sidebar-menu>ul>li>a:active,.vertical-collpsed .vertical-menu #sidebar-menu>ul>li>a:focus,.vertical-collpsed .vertical-menu #sidebar-menu>ul>li>a:hover{color:#383c40}.vertical-collpsed .vertical-menu #sidebar-menu>ul>li>a i{font-size:20px;margin-left:4px}.vertical-collpsed .vertical-menu #sidebar-menu>ul>li>a span{display:none;padding-left:25px}.vertical-collpsed .vertical-menu #sidebar-menu>ul>li:hover>a{position:relative;width:calc(190px + 70px);color:#0bb197;background-color:#f5f5f5;-webkit-transition:none;transition:none}.vertical-collpsed .vertical-menu #sidebar-menu>ul>li:hover>a i{color:#0bb197}.vertical-collpsed .vertical-menu #sidebar-menu>ul>li:hover>a span{display:inline}.vertical-collpsed .vertical-menu #sidebar-menu>ul>li:hover>ul{display:block;left:70px;position:absolute;width:190px;height:auto!important;-webkit-box-shadow:3px 5px 12px -4px rgba(18,19,21,.1);box-shadow:3px 5px 12px -4px rgba(18,19,21,.1)}.vertical-collpsed .vertical-menu #sidebar-menu>ul>li:hover>ul ul{-webkit-box-shadow:3px 5px 12px -4px rgba(18,19,21,.1);box-shadow:3px 5px 12px -4px rgba(18,19,21,.1)}.vertical-collpsed .vertical-menu #sidebar-menu>ul>li:hover>ul a{-webkit-box-shadow:none;box-shadow:none;padding:8px 20px;position:relative;width:190px;z-index:6;color:#7c8a96}.vertical-collpsed .vertical-menu #sidebar-menu>ul>li:hover>ul a:hover{color:#383c40}.vertical-collpsed .vertical-menu #sidebar-menu>ul ul{padding:5px 0;z-index:9999;display:none;background-color:#fff}.vertical-collpsed .vertical-menu #sidebar-menu>ul ul li:hover>ul{display:block;left:190px;height:auto!important;margin-top:-36px;position:absolute;width:190px}.vertical-collpsed .vertical-menu #sidebar-menu>ul ul li>a span.pull-right{position:absolute;right:20px;top:12px;-webkit-transform:rotate(270deg);transform:rotate(270deg)}.vertical-collpsed .vertical-menu #sidebar-menu>ul ul li.active a{color:#f8f9fa}body[data-sidebar=dark] .vertical-menu{background:#1b2c3f}body[data-sidebar=dark] #sidebar-menu ul li a{color:#8590a5}body[data-sidebar=dark] #sidebar-menu ul li a i{color:#8590a5}body[data-sidebar=dark] #sidebar-menu ul li a:hover{color:#d7e4ec}body[data-sidebar=dark] #sidebar-menu ul li a:hover i{color:#d7e4ec}body[data-sidebar=dark] #sidebar-menu ul li ul.sub-menu li a{color:#8590a5}body[data-sidebar=dark] #sidebar-menu ul li ul.sub-menu li a:hover{color:#d7e4ec}body[data-sidebar=dark].vertical-collpsed{min-height:1400px}body[data-sidebar=dark].vertical-collpsed .vertical-menu #sidebar-menu>ul>li:hover>a{background:#1e3146;color:#d7e4ec}body[data-sidebar=dark].vertical-collpsed .vertical-menu #sidebar-menu>ul>li:hover>a i{color:#d7e4ec}body[data-sidebar=dark].vertical-collpsed .vertical-menu #sidebar-menu>ul>li:hover>ul a{color:#8590a5}body[data-sidebar=dark].vertical-collpsed .vertical-menu #sidebar-menu>ul>li:hover>ul a:hover{color:#383c40}body[data-sidebar=dark].vertical-collpsed .vertical-menu #sidebar-menu>ul ul{background-color:#fff}body[data-sidebar=dark].vertical-collpsed .vertical-menu #sidebar-menu ul>li>a.mm-active{color:#d7e4ec!important}body[data-sidebar=dark].vertical-collpsed .vertical-menu #sidebar-menu ul li li.active>a,body[data-sidebar=dark].vertical-collpsed .vertical-menu #sidebar-menu ul li li.mm-active>a{color:#0bb197!important}body[data-sidebar=dark].vertical-collpsed .vertical-menu #sidebar-menu ul li li a.active,body[data-sidebar=dark].vertical-collpsed .vertical-menu #sidebar-menu ul li li a.mm-active{color:#0bb197!important}body[data-sidebar=dark] .mm-active{color:#d7e4ec!important}body[data-sidebar=dark] .mm-active>a{color:#d7e4ec!important}body[data-sidebar=dark] .mm-active>a i{color:#d7e4ec!important}body[data-sidebar=dark] .mm-active>i{color:#d7e4ec!important}body[data-sidebar=dark] .mm-active .active{color:#d7e4ec!important}body[data-sidebar=dark] .mm-active .active i{color:#d7e4ec!important}body[data-sidebar=dark] .menu-title{color:#8590a5}body[data-layout=horizontal] .main-content{margin-left:0!important}body[data-sidebar-size=small] .navbar-brand-box{width:160px}@media (max-width:992px){body[data-sidebar-size=small] .navbar-brand-box{width:auto}}body[data-sidebar-size=small] .vertical-menu{width:160px;text-align:center}body[data-sidebar-size=small] .vertical-menu .badge,body[data-sidebar-size=small] .vertical-menu .has-arrow:after{display:none!important}body[data-sidebar-size=small] .main-content{margin-left:160px}body[data-sidebar-size=small] .footer{left:160px}@media (max-width:991px){body[data-sidebar-size=small] .footer{left:0}}body[data-sidebar-size=small] #sidebar-menu ul li.menu-title{background-color:#1e3146}body[data-sidebar-size=small] #sidebar-menu ul li a i{display:block}body[data-sidebar-size=small] #sidebar-menu ul li ul.sub-menu li a{padding-left:1.5rem}body[data-sidebar-size=small] #sidebar-menu ul li ul.sub-menu li ul.sub-menu li a{padding-left:1.5rem}body[data-sidebar-size=small].vertical-collpsed .main-content{margin-left:70px}body[data-sidebar-size=small].vertical-collpsed .vertical-menu #sidebar-menu{text-align:left}body[data-sidebar-size=small].vertical-collpsed .vertical-menu #sidebar-menu>ul>li>a i{display:inline-block}body[data-sidebar-size=small].vertical-collpsed .footer{left:70px}.topnav{background:#fff;padding:0 calc(24px / 2);-webkit-box-shadow:0 1px 1px rgba(0,0,0,.08);box-shadow:0 1px 1px rgba(0,0,0,.08);margin-top:70px;position:fixed;left:0;right:0;z-index:100}.topnav .topnav-menu{margin:0;padding:0}.topnav .navbar-nav .nav-link{font-size:15px;position:relative;padding:1rem 1.3rem;color:#74788d;font-family:"Work Sans",sans-serif}.topnav .navbar-nav .nav-link i{font-size:15px;vertical-align:middle;display:inline-block}.topnav .navbar-nav .nav-link:focus,.topnav .navbar-nav .nav-link:hover{color:#0bb197;background-color:transparent}.topnav .navbar-nav .dropdown-item{color:#74788d}.topnav .navbar-nav .dropdown-item.active,.topnav .navbar-nav .dropdown-item:hover{color:#0bb197}.topnav .navbar-nav .nav-item .nav-link.active{color:#0bb197}.topnav .navbar-nav .dropdown.active>a{color:#0bb197;background-color:transparent}@media (min-width:1200px){body[data-layout=horizontal] .container-fluid,body[data-layout=horizontal] .navbar-header{max-width:85%}}@media (min-width:992px){.topnav .navbar-nav .nav-item:first-of-type .nav-link{padding-left:0}.topnav .dropdown-item{padding:.5rem 1.5rem;min-width:180px}.topnav .dropdown.mega-dropdown .mega-dropdown-menu{left:0;right:auto}.topnav .dropdown .dropdown-menu{margin-top:0;border-radius:0 0 .25rem .25rem}.topnav .dropdown .dropdown-menu .arrow-down::after{right:15px;-webkit-transform:rotate(-135deg) translateY(-50%);transform:rotate(-135deg) translateY(-50%);position:absolute}.topnav .dropdown .dropdown-menu .dropdown .dropdown-menu{position:absolute;top:0!important;left:100%;display:none}.topnav .dropdown:hover>.dropdown-menu{display:block}.topnav .dropdown:hover>.dropdown-menu>.dropdown:hover>.dropdown-menu{display:block}.navbar-toggle{display:none}}.arrow-down{display:inline-block}.arrow-down:after{border-color:initial;border-style:solid;border-width:0 0 1px 1px;content:"";height:.4em;display:inline-block;right:5px;top:50%;margin-left:10px;-webkit-transform:rotate(-45deg) translateY(-50%);transform:rotate(-45deg) translateY(-50%);-webkit-transform-origin:top;transform-origin:top;-webkit-transition:all .3s ease-out;transition:all .3s ease-out;width:.4em}@media (max-width:1199.98px){.topnav-menu .navbar-nav li:last-of-type .dropdown .dropdown-menu{right:100%;left:auto}}@media (max-width:991.98px){.navbar-brand-box .logo-dark{display:block}.navbar-brand-box .logo-dark span.logo-sm{display:block}.navbar-brand-box .logo-light{display:none}.topnav{max-height:360px;overflow-y:auto;padding:0}.topnav .navbar-nav .nav-link{padding:.75rem 1.1rem}.topnav .dropdown .dropdown-menu{background-color:transparent;border:none;-webkit-box-shadow:none;box-shadow:none;padding-left:15px}.topnav .dropdown .dropdown-menu.dropdown-mega-menu-xl{width:auto}.topnav .dropdown .dropdown-menu.dropdown-mega-menu-xl .row{margin:0}.topnav .dropdown .dropdown-item{position:relative;background-color:transparent}.topnav .dropdown .dropdown-item.active,.topnav .dropdown .dropdown-item:active{color:#0bb197}.topnav .arrow-down::after{right:15px;position:absolute}}@media (min-width:992px){body[data-layout=horizontal][data-topbar=light] .navbar-brand-box .logo-dark{display:block}body[data-layout=horizontal][data-topbar=light] .navbar-brand-box .logo-light{display:none}body[data-layout=horizontal][data-topbar=light] .topnav{background-color:#252b3b}body[data-layout=horizontal][data-topbar=light] .topnav .navbar-nav .nav-link{color:rgba(255,255,255,.7)}body[data-layout=horizontal][data-topbar=light] .topnav .navbar-nav .nav-link:focus,body[data-layout=horizontal][data-topbar=light] .topnav .navbar-nav .nav-link:hover{color:rgba(255,255,255,.9)}body[data-layout=horizontal][data-topbar=light] .topnav .navbar-nav>.dropdown.active>a{color:rgba(255,255,255,.9)!important}}body[data-layout-size=boxed]{background-color:#dee7ec}body[data-layout-size=boxed] #layout-wrapper{background-color:#f3f3f4;max-width:1300px;margin:0 auto;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.08);box-shadow:0 1px 1px rgba(0,0,0,.08)}body[data-layout-size=boxed] #page-topbar{max-width:1300px;margin:0 auto}body[data-layout-size=boxed] .footer{margin:0 auto;max-width:calc(1300px - 250px)}body[data-layout-size=boxed].vertical-collpsed .footer{max-width:calc(1300px - 70px)}body[data-layout=horizontal][data-layout-size=boxed] #layout-wrapper,body[data-layout=horizontal][data-layout-size=boxed] #page-topbar,body[data-layout=horizontal][data-layout-size=boxed] .footer{max-width:100%}body[data-layout=horizontal][data-layout-size=boxed] .container-fluid,body[data-layout=horizontal][data-layout-size=boxed] .navbar-header{max-width:1300px}/*!
* Waves v0.7.6
* http://fian.my.id/Waves
*
* Copyright 2014-2018 Alfiana E. Sibuea and other contributors
* Released under the MIT license
* https://github.com/fians/Waves/blob/master/LICENSE */.waves-effect{position:relative;cursor:pointer;display:inline-block;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.waves-effect .waves-ripple{position:absolute;border-radius:50%;width:100px;height:100px;margin-top:-50px;margin-left:-50px;opacity:0;background:rgba(0,0,0,.2);background:radial-gradient(rgba(0,0,0,.2) 0,rgba(0,0,0,.3) 40%,rgba(0,0,0,.4) 50%,rgba(0,0,0,.5) 60%,rgba(255,255,255,0) 70%);-webkit-transition:all .5s ease-out;transition:all .5s ease-out;-webkit-transition-property:-webkit-transform,opacity;-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,-webkit-transform;transition-property:transform,opacity;transition-property:transform,opacity,-webkit-transform;-webkit-transform:scale(0) translate(0,0);transform:scale(0) translate(0,0);pointer-events:none}.waves-effect.waves-light .waves-ripple{background:rgba(255,255,255,.4);background:radial-gradient(rgba(255,255,255,.2) 0,rgba(255,255,255,.3) 40%,rgba(255,255,255,.4) 50%,rgba(255,255,255,.5) 60%,rgba(255,255,255,0) 70%)}.waves-effect.waves-classic .waves-ripple{background:rgba(0,0,0,.2)}.waves-effect.waves-classic.waves-light .waves-ripple{background:rgba(255,255,255,.4)}.waves-notransition{-webkit-transition:none!important;transition:none!important}.waves-button,.waves-circle{-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 100%)}.waves-button,.waves-button-input,.waves-button:hover,.waves-button:visited{white-space:nowrap;vertical-align:middle;cursor:pointer;border:none;outline:0;color:inherit;background-color:rgba(0,0,0,0);font-size:1em;line-height:1em;text-align:center;text-decoration:none;z-index:1}.waves-button{padding:.85em 1.1em;border-radius:.2em}.waves-button-input{margin:0;padding:.85em 1.1em}.waves-input-wrapper{border-radius:.2em;vertical-align:bottom}.waves-input-wrapper.waves-button{padding:0}.waves-input-wrapper .waves-button-input{position:relative;top:0;left:0;z-index:1}.waves-circle{text-align:center;width:2.5em;height:2.5em;line-height:2.5em;border-radius:50%}.waves-float{-webkit-mask-image:none;-webkit-box-shadow:0 1px 1.5px 1px rgba(0,0,0,.12);box-shadow:0 1px 1.5px 1px rgba(0,0,0,.12);-webkit-transition:all .3s;transition:all .3s}.waves-float:active{-webkit-box-shadow:0 8px 20px 1px rgba(0,0,0,.3);box-shadow:0 8px 20px 1px rgba(0,0,0,.3)}.waves-block{display:block}.waves-effect.waves-light .waves-ripple{background-color:rgba(255,255,255,.4)}.waves-effect.waves-primary .waves-ripple{background-color:rgba(11,177,151,.4)}.waves-effect.waves-success .waves-ripple{background-color:rgba(10,192,116,.4)}.waves-effect.waves-info .waves-ripple{background-color:rgba(74,163,255,.4)}.waves-effect.waves-warning .waves-ripple{background-color:rgba(252,185,44,.4)}.waves-effect.waves-danger .waves-ripple{background-color:rgba(255,61,96,.4)}.avatar-xs{height:2rem;width:2rem}.avatar-sm{height:3rem;width:3rem}.avatar-md{height:4.5rem;width:4.5rem}.avatar-lg{height:6rem;width:6rem}.avatar-xl{height:7.5rem;width:7.5rem}.avatar-title{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#0bb197;color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;font-weight:500;height:100%;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:100%}.avatar-group{padding-left:12px;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.avatar-group .avatar-group-item{margin-left:-12px;border:2px solid #fff;border-radius:50%;-webkit-transition:all .2s;transition:all .2s}.avatar-group .avatar-group-item:hover{position:relative;-webkit-transform:translateY(-2px);transform:translateY(-2px)}.custom-accordion .card+.card{margin-top:.5rem}.custom-accordion a.collapsed i.accor-plus-icon:before{content:"\F0415"}.custom-accordion .card-header{border-radius:7px}.custom-accordion-arrow .card{border:1px solid #eff2f7;-webkit-box-shadow:none;box-shadow:none}.custom-accordion-arrow .card-header{padding-left:45px;position:relative}.custom-accordion-arrow .card-header .accor-arrow-icon{position:absolute;display:inline-block;width:24px;height:24px;line-height:24px;font-size:16px;background-color:#0bb197;color:#fff;border-radius:50%;text-align:center;left:10px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.custom-accordion-arrow a.collapsed i.accor-arrow-icon:before{content:"\F0142"}.font-family-secondary{font-family:"Work Sans",sans-serif}.font-size-10{font-size:10px!important}.font-size-11{font-size:11px!important}.font-size-12{font-size:12px!important}.font-size-13{font-size:13px!important}.font-size-14{font-size:14px!important}.font-size-15{font-size:15px!important}.font-size-16{font-size:16px!important}.font-size-17{font-size:17px!important}.font-size-18{font-size:18px!important}.font-size-20{font-size:20px!important}.font-size-22{font-size:22px!important}.font-size-24{font-size:24px!important}.social-list-item{height:2rem;width:2rem;line-height:calc(2rem - 2px);display:block;border:1px solid #adb5bd;border-radius:50%;color:#adb5bd;text-align:center;-webkit-transition:all .4s;transition:all .4s}.social-list-item:hover{color:#74788d;background-color:#eff2f7}.w-xs{min-width:80px}.w-sm{min-width:95px}.w-md{min-width:110px}.w-lg{min-width:140px}.w-xl{min-width:160px}.bg-overlay{position:absolute;height:100%;width:100%;right:0;bottom:0;left:0;top:0;opacity:.7;background-color:#000}.alert-dismissible .btn-close{font-size:10px;padding:1.05rem 1.25rem;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat}.form-check-right{padding-left:0;display:inline-block;padding-right:1.5em}.form-check-right .form-check-input{float:right;margin-left:0;margin-right:-1.5em}.form-check-right .form-check-label{display:block}.form-check{position:relative;text-align:left}.form-check-input,.form-check-label{cursor:pointer;margin-bottom:0}.button-items{margin-left:-8px;margin-bottom:-12px}.button-items .btn{margin-bottom:12px;margin-left:8px}.mfp-popup-form{max-width:1140px}.bs-example-modal{position:relative;top:auto;right:auto;bottom:auto;left:auto;z-index:1;display:block}.icon-demo-content{color:#adb5bd}.icon-demo-content i{display:inline-block;width:40px;height:40px;line-height:36px;font-size:22px;color:#74788d;border:2px solid #f1f5f7;border-radius:4px;-webkit-transition:all .4s;transition:all .4s;text-align:center;margin-right:16px;vertical-align:middle}.icon-demo-content .col-lg-4{margin-top:24px}.icon-demo-content .col-lg-4:hover i{color:#fff;background-color:#0bb197;border-color:#0bb197}.icon-demo-content-dripicons{color:#adb5bd}.icon-demo-content-dripicons i{display:inline-block;width:40px;height:40px;line-height:43px;font-size:22px;color:#74788d;border:2px solid #f1f5f7;border-radius:4px;-webkit-transition:all .4s;transition:all .4s;text-align:center;margin-right:16px;vertical-align:middle}.icon-demo-content-dripicons .col-lg-4{margin-top:24px}.icon-demo-content-dripicons .col-lg-4:hover i{color:#fff;background-color:#0bb197;border-color:#0bb197}.grid-structure .grid-container{background-color:#f8f9fa;margin-top:10px;font-size:.8rem;font-weight:500;padding:10px 20px}.card-radio{background-color:#fff;border:2px solid #f1f5f7;border-radius:.25rem;padding:1rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.card-radio:hover{cursor:pointer}.card-radio-label{display:block}.card-radio-input{display:none}.card-radio-input:checked+.card-radio{border-color:#0bb197!important}.navs-carousel .owl-nav{margin-top:16px}.navs-carousel .owl-nav button{width:30px;height:30px;line-height:28px!important;font-size:20px!important;border-radius:50%!important;background-color:rgba(11,177,151,.25)!important;color:#0bb197!important;margin:4px 8px!important}@media print{.footer,.navbar-header,.page-title-box,.right-bar,.vertical-menu{display:none!important}.card-body,.main-content,.page-content,.right-bar,body{padding:0;margin:0}.card{border:0}}.apex-charts{min-height:10px!important}.apex-charts text{font-family:var(--bs-font-sans-serif)!important;fill:#adb5bd}.apex-charts .apexcharts-canvas{margin:0 auto}.apexcharts-tooltip-text,.apexcharts-tooltip-title{font-family:var(--bs-font-sans-serif)!important}.apexcharts-legend-series{font-weight:500}.apexcharts-gridline{pointer-events:none;stroke:#f8f9fa}.apexcharts-legend-text{color:#74788d!important;font-family:var(--bs-font-sans-serif)!important;font-size:13px!important}.apexcharts-pie-label{fill:#fff!important}.apexcharts-xaxis text,.apexcharts-yaxis text{font-family:var(--bs-font-sans-serif)!important;fill:#adb5bd}.bootstrap-touchspin.input-group>.input-group-prepend>.btn,.bootstrap-touchspin.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.bootstrap-touchspin.input-group>.input-group-append>.btn,.bootstrap-touchspin.input-group>.input-group-append>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.fc-toolbar h2{font-size:16px;line-height:30px;text-transform:uppercase}.fc th.fc-widget-header{background:#eff2f7;font-size:13px;line-height:20px;padding:10px 0;text-transform:uppercase;font-weight:600}.fc-unthemed .fc-content,.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-list-view,.fc-unthemed .fc-popover,.fc-unthemed .fc-row,.fc-unthemed tbody,.fc-unthemed td,.fc-unthemed th,.fc-unthemed thead{border-color:#eff2f7}.fc-unthemed td.fc-today{background:#fdfdfe}.fc-button{background:#fff;border-color:#eff2f7;color:#505d69;text-transform:capitalize;-webkit-box-shadow:none;box-shadow:none;padding:6px 12px!important;height:auto!important}.fc-state-active,.fc-state-disabled,.fc-state-down{background-color:#0bb197;color:#fff;text-shadow:none}.fc-event{border-radius:2px;border:none;cursor:move;font-size:.8125rem;margin:5px 7px;padding:5px 5px;text-align:center}#external-events .external-event{text-align:left!important;padding:8px 16px}.fc-event,.fc-event-dot{background-color:#0bb197}.fc-event .fc-content{color:#fff}.fc .table-bordered td,.fc .table-bordered th{border-color:#eff2f7}@media (max-width:575.98px){.fc .fc-toolbar{display:block}}.fc .fc-toolbar h2{font-size:16px;line-height:30px;text-transform:uppercase}@media (max-width:767.98px){.fc .fc-toolbar .fc-center,.fc .fc-toolbar .fc-left,.fc .fc-toolbar .fc-right{float:none;display:block;text-align:center;clear:both;margin:10px 0}.fc .fc-toolbar>*>*{float:none}.fc .fc-toolbar .fc-today-button{display:none}}.fc .fc-toolbar .btn{text-transform:capitalize}.fc-bootstrap .fc-today.alert-info{background-color:#f1f5f7}.fc-day-grid-event.fc-h-event.fc-event.fc-start.fc-end.bg-dark{background-color:#000!important}[dir=rtl] .fc-header-toolbar{direction:ltr!important}[dir=rtl] .fc-toolbar>*>:not(:first-child){margin-left:.75em}.sp-container{background-color:#fff}.sp-container button{padding:.25rem .5rem;font-size:.71094rem;border-radius:.2rem;font-weight:400;color:#343a40}.sp-container button.sp-palette-toggle{background-color:#eff2f7}.sp-container button.sp-choose{background-color:#0ac074;margin-left:5px;margin-right:0}.sp-palette-container{border-right:1px solid #eff2f7}.sp-input{background-color:#fff;border-color:#ced4da!important;color:#505d69}.sp-input:focus{outline:0}[dir=rtl] .sp-alpha{direction:rtl}[dir=rtl] .sp-original-input-container .sp-add-on{border-top-right-radius:0!important;border-bottom-right-radius:0!important;border-top-left-radius:4px!important;border-bottom-left-radius:4px!important}[dir=rtl] input.spectrum.with-add-on{border:1px solid #ced4da;border-left:0;border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}[data-simplebar]{position:relative;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-ms-flex-line-pack:start;align-content:flex-start;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.simplebar-wrapper{overflow:hidden;width:inherit;height:inherit;max-width:inherit;max-height:inherit}.simplebar-mask{direction:inherit;position:absolute;overflow:hidden;padding:0;margin:0;left:0;top:0;bottom:0;right:0;width:auto!important;height:auto!important;z-index:0}.simplebar-offset{direction:inherit!important;-webkit-box-sizing:inherit!important;box-sizing:inherit!important;resize:none!important;position:absolute;top:0;left:0!important;bottom:0;right:0!important;padding:0;margin:0;-webkit-overflow-scrolling:touch}.simplebar-content-wrapper{direction:inherit;-webkit-box-sizing:border-box!important;box-sizing:border-box!important;position:relative;display:block;height:100%;width:auto;visibility:visible;overflow:auto;max-width:100%;max-height:100%;scrollbar-width:none;padding:0!important}.simplebar-content-wrapper::-webkit-scrollbar,.simplebar-hide-scrollbar::-webkit-scrollbar{display:none}.simplebar-content:after,.simplebar-content:before{content:' ';display:table}.simplebar-placeholder{max-height:100%;max-width:100%;width:100%;pointer-events:none}.simplebar-height-auto-observer-wrapper{-webkit-box-sizing:inherit!important;box-sizing:inherit!important;height:100%;width:100%;max-width:1px;position:relative;float:left;max-height:1px;overflow:hidden;z-index:-1;padding:0;margin:0;pointer-events:none;-webkit-box-flex:inherit;-ms-flex-positive:inherit;flex-grow:inherit;-ms-flex-negative:0;flex-shrink:0;-ms-flex-preferred-size:0;flex-basis:0}.simplebar-height-auto-observer{-webkit-box-sizing:inherit;box-sizing:inherit;display:block;opacity:0;position:absolute;top:0;left:0;height:1000%;width:1000%;min-height:1px;min-width:1px;overflow:hidden;pointer-events:none;z-index:-1}.simplebar-track{z-index:1;position:absolute;right:0;bottom:0;pointer-events:none;overflow:hidden}[data-simplebar].simplebar-dragging .simplebar-content{pointer-events:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}[data-simplebar].simplebar-dragging .simplebar-track{pointer-events:all}.simplebar-scrollbar{position:absolute;right:2px;width:6px;min-height:10px}.simplebar-scrollbar:before{position:absolute;content:'';background:#a2adb7;border-radius:7px;left:0;right:0;opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.simplebar-scrollbar.simplebar-visible:before{opacity:.5;-webkit-transition:opacity 0s linear;transition:opacity 0s linear}.simplebar-track.simplebar-vertical{top:0;width:11px}.simplebar-track.simplebar-vertical .simplebar-scrollbar:before{top:2px;bottom:2px}.simplebar-track.simplebar-horizontal{left:0;height:11px}.simplebar-track.simplebar-horizontal .simplebar-scrollbar:before{height:100%;left:2px;right:2px}.simplebar-track.simplebar-horizontal .simplebar-scrollbar{right:auto;left:0;top:2px;height:7px;min-height:0;min-width:10px;width:auto}[data-simplebar-direction=rtl] .simplebar-track.simplebar-vertical{right:auto;left:0}.hs-dummy-scrollbar-size{direction:rtl;position:fixed;opacity:0;visibility:hidden;height:500px;width:500px;overflow-y:hidden;overflow-x:scroll}.simplebar-hide-scrollbar{position:fixed;left:0;visibility:hidden;overflow-y:scroll;scrollbar-width:none}.custom-scroll{height:100%}.dataTables_wrapper.container-fluid{padding:0}div.dataTables_wrapper div.dataTables_filter{text-align:right}@media (max-width:767px){div.dataTables_wrapper div.dataTables_filter{text-align:center}}div.dataTables_wrapper div.dataTables_filter input{margin-left:.5em;margin-right:0}.datatable td:focus{outline:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:last-child{padding-right:0}table.dataTable{border-collapse:collapse!important;margin-bottom:15px!important}table.dataTable thead .sorting:before,table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_desc:before,table.dataTable thead .sorting_desc_disabled:before{left:auto;right:.5rem;content:"\F0360";font-family:"Material Design Icons";font-size:1rem;top:9px}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_desc_disabled:after{left:auto;right:.5em;content:"\F035D";font-family:"Material Design Icons";top:15px;font-size:1rem}table.dataTable thead tr td.sorting,table.dataTable thead tr td.sorting_asc,table.dataTable thead tr td.sorting_desc,table.dataTable thead tr th.sorting,table.dataTable thead tr th.sorting_asc,table.dataTable thead tr th.sorting_desc{padding-left:12px;padding-right:30px}table.dataTable tbody>tr.selected,table.dataTable tbody>tr>.selected{background-color:rgba(11,177,151,.2)}table.dataTable tbody>tr.selected td,table.dataTable tbody>tr>.selected td{border-color:rgba(11,177,151,.2);color:#0bb197}table.dataTable tbody td:focus{outline:0!important}table.dataTable tbody td.focus,table.dataTable tbody th.focus{outline:2px solid #0bb197!important;outline-offset:-1px;background-color:rgba(11,177,151,.15)}.dataTables_info{font-weight:600}table.dataTable.dtr-inline.collapsed>tbody>tr[role=row]>td:first-child:before,table.dataTable.dtr-inline.collapsed>tbody>tr[role=row]>th:first-child:before{-webkit-box-shadow:0 5px 12px rgba(0,0,0,.1);box-shadow:0 5px 12px rgba(0,0,0,.1);background-color:#0ac074;bottom:auto}table.dataTable.dtr-inline.collapsed>tbody>tr.parent>td:first-child:before,table.dataTable.dtr-inline.collapsed>tbody>tr.parent>th:first-child:before{background-color:#ff3d60}div.dt-button-info{background-color:#0bb197;border:none;color:#fff;-webkit-box-shadow:none;box-shadow:none;border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{border-bottom:none;background-color:rgba(255,255,255,.2);color:#fff}@media (max-width:767.98px){li.paginate_button.next,li.paginate_button.previous{display:inline-block;font-size:1.5rem}li.paginate_button{display:none}.dataTables_paginate ul{text-align:center;display:block;margin:1rem 0 0!important}div.dt-buttons{display:inline-table;margin-bottom:1rem}}.activate-select .sorting_1{background-color:#f8f9fa}.table-bordered{border:1px solid #eff2f7}.table.dataTable.dtr-inline.collapsed>tbody>tr>td,table.dataTable.dtr-inline.collapsed>tbody>tr>td{position:relative}.table.dataTable.dtr-inline.collapsed>tbody>tr>td.dtr-control,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dtr-control{padding-left:30px}.table.dataTable.dtr-inline.collapsed>tbody>tr>td.dtr-control:before,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dtr-control:before{top:64%;left:5px;height:14px;width:14px;margin-top:-14px;display:block;position:absolute;color:#fff;border:2px solid #fff;border-radius:14px;-webkit-box-sizing:content-box;box-sizing:content-box;text-align:center;text-indent:0!important;line-height:12px;content:'+';background-color:#0bb197}.datepicker{border:1px solid #f8f9fa;padding:8px;z-index:999!important}.datepicker table tr th{font-weight:500}.datepicker table tr td .active.disabled,.datepicker table tr td.active,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active:hover,.datepicker table tr td.selected,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected:hover,.datepicker table tr td.today,.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today:hover{background-color:#0bb197!important;background-image:none;-webkit-box-shadow:none;box-shadow:none;color:#fff!important}.datepicker table tr td span.focused,.datepicker table tr td span:hover,.datepicker table tr td.day.focused,.datepicker table tr td.day:hover{background:#eff2f7}.datepicker table tr td span.new,.datepicker table tr td span.old,.datepicker table tr td.new,.datepicker table tr td.old{color:#adb5bd;opacity:.6}.datepicker table tr td.range,.datepicker table tr td.range.disabled,.datepicker table tr td.range.disabled:hover,.datepicker table tr td.range:hover{background-color:#f1f5f7}.table-condensed>tbody>tr>td,.table-condensed>thead>tr>th{padding:7px}.flot-charts-height{height:320px}.flotTip{padding:8px 12px;background-color:rgba(52,58,64,.9);z-index:100;color:#f8f9fa;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.08);box-shadow:0 1px 1px rgba(0,0,0,.08);border-radius:4px}.legendLabel{color:#adb5bd}.tox-tinymce{border:2px solid #f1f5f7!important}.tox .tox-statusbar{border-top:1px solid #f1f5f7!important}.tox .tox-edit-area__iframe,.tox .tox-menubar,.tox .tox-statusbar{background-color:#fff!important;background:0 0!important}.tox .tox-mbtn{color:#505d69!important}.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active){background-color:#f1f5f7!important}.tox .tox-tbtn:hover{background-color:#f1f5f7!important}.tox .tox-toolbar__primary{border-color:#f1f5f7!important}.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{background:#f1f5f7!important}.tox .tox-tbtn{color:#505d69!important}.tox .tox-tbtn svg{fill:#505d69!important}.tox .tox-edit-area__iframe{background-color:#fff!important}.tox .tox-statusbar a,.tox .tox-statusbar__path-item,.tox .tox-statusbar__wordcount{color:#505d69!important}.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-right:1px solid #e1e9ee!important}.tox-tinymce-aux{z-index:1000!important}.dropzone{min-height:230px;border:2px dashed #ced4da;background:#fff;border-radius:6px}.dropzone .dz-message{font-size:24px;width:100%}.twitter-bs-wizard .twitter-bs-wizard-nav{position:relative}.twitter-bs-wizard .twitter-bs-wizard-nav:before{content:"";width:100%;height:2px;background-color:#f1f5f7;position:absolute;left:0;top:26px}.twitter-bs-wizard .twitter-bs-wizard-nav .step-number{display:inline-block;width:38px;height:38px;line-height:34px;border:2px solid #0bb197;color:#0bb197;text-align:center;border-radius:50%;position:relative;background-color:#fff}@media (max-width:991.98px){.twitter-bs-wizard .twitter-bs-wizard-nav .step-number{display:block;margin:0 auto 8px!important}}.twitter-bs-wizard .twitter-bs-wizard-nav .nav-link .step-title{display:block;margin-top:8px;font-weight:600}@media (max-width:575.98px){.twitter-bs-wizard .twitter-bs-wizard-nav .nav-link .step-title{display:none}}.twitter-bs-wizard .twitter-bs-wizard-nav .nav-link.active{background-color:transparent;color:#505d69}.twitter-bs-wizard .twitter-bs-wizard-nav .nav-link.active .step-number{background-color:#0bb197;color:#fff}.twitter-bs-wizard .twitter-bs-wizard-pager-link{padding-top:24px;padding-left:0;list-style:none;margin-bottom:0}.twitter-bs-wizard .twitter-bs-wizard-pager-link li{display:inline-block}.twitter-bs-wizard .twitter-bs-wizard-pager-link li a{display:inline-block;padding:.47rem .75rem;background-color:#0bb197;color:#fff;border-radius:.25rem}.twitter-bs-wizard .twitter-bs-wizard-pager-link li.disabled a{cursor:not-allowed;background-color:#0dd7b8}.twitter-bs-wizard .twitter-bs-wizard-pager-link li.next{float:right}.twitter-bs-wizard-tab-content{padding-top:24px;min-height:262px}.gmaps,.gmaps-panaroma{height:300px;background:#f8f9fa;border-radius:3px}.gmaps-overlay{display:block;text-align:center;color:#fff;font-size:16px;line-height:40px;background:#0bb197;border-radius:4px;padding:10px 20px}.gmaps-overlay_arrow{left:50%;margin-left:-16px;width:0;height:0;position:absolute}.gmaps-overlay_arrow.above{bottom:-15px;border-left:16px solid transparent;border-right:16px solid transparent;border-top:16px solid #0bb197}.gmaps-overlay_arrow.below{top:-15px;border-left:16px solid transparent;border-right:16px solid transparent;border-bottom:16px solid #0bb197}.error{color:#ff3d60}.parsley-error{border-color:#ff3d60}.parsley-errors-list{display:none;margin:0;padding:0}.parsley-errors-list.filled{display:block}.parsley-errors-list>li{font-size:12px;list-style:none;color:#ff3d60;margin-top:5px}.irs--round .irs-bar,.irs--round .irs-from,.irs--round .irs-single,.irs--round .irs-to{background:#0bb197!important;font-size:11px}.irs--round .irs-from,.irs--round .irs-single,.irs--round .irs-to{top:5px}.irs--round .irs-from:before,.irs--round .irs-single:before,.irs--round .irs-to:before{display:none}.irs--round .irs-line{background:#f1f5f7;border-color:#f1f5f7}.irs--round .irs-grid-text{font-size:11px;color:#ced4da}.irs--round .irs-max,.irs--round .irs-min{color:#adb5bd;background:#f1f5f7;font-size:11px}.irs--round .irs-handle{border:2px solid #0bb197;width:12px;height:12px;top:31px;background-color:#fff!important}.symbol{border-color:#fff}.rating-symbol-background,.rating-symbol-foreground{font-size:24px}.rating-symbol-foreground{top:0}.rating-star>span{display:inline-block;vertical-align:middle}.rating-star>span.badge{margin-left:4px}.table-rep-plugin .btn-toolbar{display:block}.table-rep-plugin .table-responsive{border:none!important}.table-rep-plugin .btn-group .btn-default{background-color:#eff2f7;color:#343a40;border:1px solid #e8ecf4}.table-rep-plugin .btn-group .btn-default.btn-primary{background-color:#0bb197;border-color:#0bb197;color:#fff}.table-rep-plugin .btn-group.pull-right{float:right}.table-rep-plugin .btn-group.pull-right .dropdown-menu{right:0;-webkit-transform:none!important;transform:none!important;top:100%!important}.table-rep-plugin tbody th{font-size:14px;font-weight:400}.table-rep-plugin .checkbox-row{padding-left:40px;color:#505d69!important}.table-rep-plugin .checkbox-row:hover{background-color:#f6f8fa!important}.table-rep-plugin .checkbox-row label{display:inline-block;padding-left:5px;position:relative}.table-rep-plugin .checkbox-row label::before{-o-transition:.3s ease-in-out;-webkit-transition:.3s ease-in-out;background-color:#fff;border-radius:3px;border:1px solid #f1f5f7;content:"";display:inline-block;height:17px;left:0;margin-left:-20px;position:absolute;transition:.3s ease-in-out;width:17px;outline:0!important}.table-rep-plugin .checkbox-row label::after{color:#eff2f7;display:inline-block;font-size:11px;height:16px;left:0;margin-left:-20px;padding-left:3px;padding-top:1px;position:absolute;top:-1px;width:16px}.table-rep-plugin .checkbox-row input[type=checkbox]{cursor:pointer;opacity:0;z-index:1;outline:0!important}.table-rep-plugin .checkbox-row input[type=checkbox]:disabled+label{opacity:.65}.table-rep-plugin .checkbox-row input[type=checkbox]:focus+label::before{outline-offset:-2px;outline:0}.table-rep-plugin .checkbox-row input[type=checkbox]:checked+label::after{content:"\f00c";font-family:'Font Awesome 5 Free';font-weight:900}.table-rep-plugin .checkbox-row input[type=checkbox]:disabled+label::before{background-color:#f8f9fa;cursor:not-allowed}.table-rep-plugin .checkbox-row input[type=checkbox]:checked+label::before{background-color:#0bb197;border-color:#0bb197}.table-rep-plugin .checkbox-row input[type=checkbox]:checked+label::after{color:#fff}.table-rep-plugin .fixed-solution .sticky-table-header{top:70px!important;background-color:#0bb197}.table-rep-plugin .fixed-solution .sticky-table-header table{color:#fff}@media (min-width:992px){body[data-layout=horizontal] .fixed-solution .sticky-table-header{top:120px!important}}.select2-container{display:block}.select2-container .select2-selection--single{background-color:#fff;border:1px solid #ced4da;height:38px}.select2-container .select2-selection--single:focus{outline:0}.select2-container .select2-selection--single .select2-selection__rendered{line-height:36px;padding-left:12px;color:#505d69}.select2-container .select2-selection--single .select2-selection__arrow{height:34px;width:34px;right:3px}.select2-container .select2-selection--single .select2-selection__arrow b{border-color:#adb5bd transparent transparent transparent;border-width:6px 6px 0 6px}.select2-container .select2-selection--single .select2-selection__placeholder{color:#505d69}.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #adb5bd transparent!important;border-width:0 6px 6px 6px!important}.select2-container--default .select2-search--dropdown{padding:10px;background-color:#fff}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #ced4da;background-color:#fff;color:#74788d;outline:0}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#0bb197}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#f8f9fa;color:#16181b}.select2-container--default .select2-results__option[aria-selected=true]:hover{background-color:#0bb197;color:#fff}.select2-results__option{padding:6px 12px}.select2-dropdown{border:1px solid rgba(0,0,0,.15);background-color:#fff;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.08);box-shadow:0 1px 1px rgba(0,0,0,.08)}.select2-search input{border:1px solid #f1f5f7}.select2-container .select2-selection--multiple{min-height:38px;background-color:#fff;border:1px solid #ced4da!important}.select2-container .select2-selection--multiple .select2-selection__rendered{padding:2px 10px}.select2-container .select2-selection--multiple .select2-search__field{border:0;color:#505d69}.select2-container .select2-selection--multiple .select2-search__field::-webkit-input-placeholder{color:#505d69}.select2-container .select2-selection--multiple .select2-search__field::-moz-placeholder{color:#505d69}.select2-container .select2-selection--multiple .select2-search__field:-ms-input-placeholder{color:#505d69}.select2-container .select2-selection--multiple .select2-search__field::-ms-input-placeholder{color:#505d69}.select2-container .select2-selection--multiple .select2-search__field::placeholder{color:#505d69}.select2-container .select2-selection--multiple .select2-selection__choice{background-color:#eff2f7;border:1px solid #f1f5f7;border-radius:1px;padding:0 7px}.select2-container--default.select2-container--focus .select2-selection--multiple{border-color:#ced4da}.select2-container--default .select2-results__group{font-weight:600}.select2-result-repository__avatar{float:left;width:60px;margin-right:10px}.select2-result-repository__avatar img{width:100%;height:auto;border-radius:2px}.select2-result-repository__statistics{margin-top:7px}.select2-result-repository__forks,.select2-result-repository__stargazers,.select2-result-repository__watchers{display:inline-block;font-size:11px;margin-right:1em;color:#adb5bd}.select2-result-repository__forks .fa,.select2-result-repository__stargazers .fa,.select2-result-repository__watchers .fa{margin-right:4px}.select2-result-repository__forks .fa.fa-flash::before,.select2-result-repository__stargazers .fa.fa-flash::before,.select2-result-repository__watchers .fa.fa-flash::before{content:"\f0e7";font-family:'Font Awesome 5 Free'}.select2-results__option--highlighted .select2-result-repository__forks,.select2-results__option--highlighted .select2-result-repository__stargazers,.select2-results__option--highlighted .select2-result-repository__watchers{color:rgba(255,255,255,.8)}.select2-result-repository__meta{overflow:hidden}.img-flag{margin-right:7px;height:15px;width:18px}#session-timeout-dialog .close{display:none}#session-timeout-dialog .countdown-holder{color:#ff3d60;font-weight:500}#session-timeout-dialog .btn-default{background-color:#fff;color:#ff3d60;-webkit-box-shadow:none;box-shadow:none}.jqstooltip{-webkit-box-sizing:content-box;box-sizing:content-box;width:auto!important;height:auto!important;background-color:#343a40!important;-webkit-box-shadow:0 5px 12px rgba(0,0,0,.1);box-shadow:0 5px 12px rgba(0,0,0,.1);padding:5px 10px!important;border-radius:3px;border-color:#212529!important}.jqsfield{color:#eff2f7!important;font-size:12px!important;line-height:18px!important;font-family:var(--bs-font-sans-serif)!important;font-weight:500!important}.swal2-container .swal2-title{font-size:24px;font-weight:500}.swal2-content{font-size:16px}.swal2-icon.swal2-question{border-color:#4aa3ff;color:#4aa3ff}.swal2-icon.swal2-success [class^=swal2-success-line]{background-color:#0ac074}.swal2-icon.swal2-success .swal2-success-ring{border-color:rgba(10,192,116,.3)}.swal2-icon.swal2-warning{border-color:#fcb92c;color:#fcb92c}.swal2-styled:focus{-webkit-box-shadow:none;box-shadow:none}.swal2-progress-steps .swal2-progress-step{background:#0bb197}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step{background:#0bb197}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step,.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step-line{background:rgba(11,177,151,.3)}.swal2-progress-steps .swal2-progress-step-line{background:#0bb197}.swal2-loader{border-color:#0bb197 transparent #0bb197 transparent}input[switch]{display:none}input[switch]+label{font-size:1em;line-height:1;width:56px;height:24px;background-color:#ced4da;background-image:none;border-radius:2rem;padding:.16667rem;cursor:pointer;display:inline-block;text-align:center;position:relative;font-weight:500;-webkit-transition:all .1s ease-in-out;transition:all .1s ease-in-out}input[switch]+label:before{color:#343a40;content:attr(data-off-label);display:block;font-family:inherit;font-weight:500;font-size:12px;line-height:21px;position:absolute;right:1px;margin:3px;top:-2px;text-align:center;min-width:1.66667rem;overflow:hidden;-webkit-transition:all .1s ease-in-out;transition:all .1s ease-in-out}input[switch]+label:after{content:'';position:absolute;left:3px;background-color:#eff2f7;-webkit-box-shadow:none;box-shadow:none;border-radius:2rem;height:20px;width:20px;top:2px;-webkit-transition:all .1s ease-in-out;transition:all .1s ease-in-out}input[switch]:checked+label{background-color:#0bb197}input[switch]:checked+label{background-color:#0bb197}input[switch]:checked+label:before{color:#fff;content:attr(data-on-label);right:auto;left:3px}input[switch]:checked+label:after{left:33px;background-color:#eff2f7}input[switch=bool]+label{background-color:#ff3d60}input[switch=bool]+label:before,input[switch=bool]:checked+label:before,input[switch=default]:checked+label:before{color:#fff}input[switch=bool]:checked+label{background-color:#0ac074}input[switch=default]:checked+label{background-color:#a2a2a2}input[switch=primary]:checked+label{background-color:#0bb197}input[switch=success]:checked+label{background-color:#0ac074}input[switch=info]:checked+label{background-color:#4aa3ff}input[switch=warning]:checked+label{background-color:#fcb92c}input[switch=danger]:checked+label{background-color:#ff3d60}input[switch=dark]:checked+label{background-color:#343a40}.square-switch{margin-right:7px}.square-switch input[switch]+label,.square-switch input[switch]+label:after{border-radius:4px}.table-edits input,.table-edits select{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;border:1px solid #ced4da;background-color:#fff;color:#505d69;border-radius:.25rem}.table-edits input:focus,.table-edits select:focus{outline:0;border-color:#b1bbc4}.jqvmap-label{background-color:#343a40;color:#eff2f7;font-size:.875rem;padding:.3rem .6rem}.jqvmap-zoomin,.jqvmap-zoomout{width:24px;height:24px;line-height:18px}.jqvmap-zoomout{top:40px}.editable-input .form-control{display:inline-block}.editable-buttons{margin-left:7px}.editable-buttons .editable-cancel{margin-left:7px}.bg-pattern{background-image:url(../images/bg.jpg);background-size:cover;background-position:center}.auth-logo.logo-light{display:none}.auth-logo.logo-dark{display:block}.mail-list a{display:block;color:#74788d;line-height:24px;padding:6px 5px}.mail-list a.active{color:#ff3d60;font-weight:500}.mail-list a i{font-size:18px}.chat-user-box p.user-title{color:#343a40;font-weight:500}.chat-user-box p{font-size:13px}.message-list{display:block;padding-left:0}.message-list li{position:relative;display:block;height:50px;line-height:50px;cursor:default;-webkit-transition-duration:.3s;transition-duration:.3s}.message-list li a{color:#74788d}.message-list li:hover{background:#f1f5f7;-webkit-transition-duration:.05s;transition-duration:.05s}.message-list li .col-mail{float:left;position:relative}.message-list li .col-mail-1{width:320px}.message-list li .col-mail-1 .checkbox-wrapper-mail,.message-list li .col-mail-1 .dot,.message-list li .col-mail-1 .star-toggle{display:block;float:left}.message-list li .col-mail-1 .dot{border:4px solid transparent;border-radius:100px;margin:22px 26px 0;height:0;width:0;line-height:0;font-size:0}.message-list li .col-mail-1 .checkbox-wrapper-mail{margin:15px 10px 0 20px}.message-list li .col-mail-1 .star-toggle{margin-top:18px;margin-left:5px}.message-list li .col-mail-1 .title{position:absolute;top:0;left:110px;right:0;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;margin-bottom:0}.message-list li .col-mail-2{position:absolute;top:0;left:320px;right:0;bottom:0}.message-list li .col-mail-2 .date,.message-list li .col-mail-2 .subject{position:absolute;top:0}.message-list li .col-mail-2 .subject{left:0;right:200px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.message-list li .col-mail-2 .date{right:0;width:170px;padding-left:80px}.message-list li.active,.message-list li.active:hover{-webkit-box-shadow:inset 3px 0 0 #0bb197;box-shadow:inset 3px 0 0 #0bb197}.message-list li.unread{background-color:#f1f5f7;font-weight:500;color:#292d32}.message-list li.unread a{color:#292d32;font-weight:500}.message-list .checkbox-wrapper-mail{cursor:pointer;height:20px;width:20px;position:relative;display:inline-block;-webkit-box-shadow:inset 0 0 0 1px #ced4da;box-shadow:inset 0 0 0 1px #ced4da;border-radius:1px}.message-list .checkbox-wrapper-mail input{opacity:0;cursor:pointer}.message-list .checkbox-wrapper-mail input:checked~label{opacity:1}.message-list .checkbox-wrapper-mail label{position:absolute;height:20px;width:20px;left:0;cursor:pointer;opacity:0;margin-bottom:0;-webkit-transition-duration:.05s;transition-duration:.05s;top:0}.message-list .checkbox-wrapper-mail label:before{content:"\F012C";font-family:"Material Design Icons";top:0;height:20px;color:#292d32;width:20px;position:absolute;margin-top:-16px;left:4px;font-size:13px}@media (max-width:575.98px){.message-list li .col-mail-1{width:200px}}.counter-number{font-size:32px;font-weight:500;text-align:center}.counter-number span{font-size:16px;font-weight:400;display:block;padding-top:7px}.coming-box{float:left;width:21%;padding:14px 7px;margin:0 12px 24px 12px;background-color:#fff;border-radius:.4rem;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.08);box-shadow:0 1px 1px rgba(0,0,0,.08)}@media (max-width:991.98px){.coming-box{width:40%}}.slick-slide{margin:10px 12px;-webkit-transition:all ease-in-out .3s;transition:all ease-in-out .3s;opacity:.2;padding:7px;border-radius:4px}.slick-slide:focus{outline:0}.slick-next:before,.slick-prev:before{color:#343a40}.slick-active{opacity:1}.slick-slider.hori-timeline-desc{padding:12px 24px 0;text-align:center;border-radius:7px}.slick-slider.hori-timeline-nav .slick-active{opacity:.5}.slick-slider.hori-timeline-nav .slick-current{opacity:1;background-color:rgba(11,177,151,.2)}.slick-slider.hori-timeline-nav .slick-current .nav-title{color:#0bb197}.slick-slider.hori-timeline-nav .slider-nav-item{text-align:center}.slick-slider.fade:not(slow){opacity:1}.verti-timeline{border-left:2px solid #f1f5f7;margin:0 5px}.verti-timeline .event-list{position:relative;padding:0 0 25px 30px}.verti-timeline .event-list:before{content:"";position:absolute;width:20px;height:20px;left:-2px;top:8px;border-top:6px double #f1f5f7;border-left:2px solid #f1f5f7;border-top-left-radius:15px}.verti-timeline .event-list .event-content{position:relative;border:2px solid #eff2f7;border-radius:7px}.verti-timeline .event-list.active .event-timeline-dot{color:#0bb197}.verti-timeline .event-list:last-child{padding-bottom:0}.gallery-box a .gallery-content{border-radius:4px;overflow:hidden}.gallery-box a .gallery-overlay{position:absolute;left:0;right:0;top:0;bottom:0;background:#0bb197;opacity:0;-webkit-transition:all .5s;transition:all .5s}.gallery-box a .overlay-content{position:absolute;left:0;right:0;bottom:-60px;background-color:#fff;-webkit-transition:all .5s;transition:all .5s;padding:16px 12px 12px 12px;margin:0 12px;border-radius:4px}.gallery-box a .gallery-overlay-icon{position:absolute;top:50%;left:0;right:0;-webkit-transform:translateY(-85%);transform:translateY(-85%);-webkit-transition:all .5s;transition:all .5s}.gallery-box a .gallery-overlay-icon i{font-size:28px}.gallery-box a:hover .gallery-overlay{opacity:.7}.gallery-box a:hover .overlay-content{position:absolute;bottom:12px}.error-text{text-shadow:4px 4px rgba(11,177,151,.4)}
/*# sourceMappingURL=app.min.css.map */
This diff could not be displayed because it is too large.
var radialoptions = {
series: [72],
chart: {
type: 'radialBar',
width: 72,
height: 72,
sparkline: {
enabled: true
}
},
dataLabels: {
enabled: false
},
colors: ['#0ab39c'],
stroke: {
lineCap: 'round'
},
plotOptions: {
radialBar: {
hollow: {
margin: 0,
size: '70%'
},
track: {
margin: 0,
},
dataLabels: {
name: {
show: false
},
value: {
offsetY: 5,
show: true
}
}
}
}
};
var radialchart = new ApexCharts(document.querySelector("#radialchart-1"), radialoptions);
radialchart.render();
// Radialchart 2
var radialoptions = {
series: [45],
chart: {
type: 'radialBar',
width: 72,
height: 72,
sparkline: {
enabled: true
}
},
dataLabels: {
enabled: false
},
colors: ['#0ab39c'],
stroke: {
lineCap: 'round'
},
plotOptions: {
radialBar: {
hollow: {
margin: 0,
size: '70%'
},
track: {
margin: 0,
},
dataLabels: {
name: {
show: false
},
value: {
offsetY: 5,
show: true
}
}
}
}
};
var radialchart = new ApexCharts(document.querySelector("#radialchart-2"), radialoptions);
radialchart.render();
// Radialchart 3
var radialoptions = {
series: [54],
chart: {
type: 'radialBar',
width: 72,
height: 72,
sparkline: {
enabled: true
}
},
dataLabels: {
enabled: false
},
colors: ['#0ab39c'],
stroke: {
lineCap: 'round'
},
plotOptions: {
radialBar: {
hollow: {
margin: 0,
size: '70%'
},
track: {
margin: 0,
},
dataLabels: {
name: {
show: false
},
value: {
offsetY: 5,
show: true
}
}
}
}
};
var radialchart = new ApexCharts(document.querySelector("#radialchart-3"), radialoptions);
radialchart.render();
\ No newline at end of file \ No newline at end of file
odoo.define('idg_dashboard.pad_dashboard', function (require) {
"use strict";
var AbstractAction = require('web.AbstractAction');
var core = require('web.core');
var QWeb = core.qweb;
var PadDashboard = AbstractAction.extend({
template: 'Dashboard',
init: function(parent, context) {
this._super(parent, context);
this.dashboard_templates = [
'DashboardTop',
];
this.pad_total_nasional = [];
},
start: function() {
var self = this;
this.set("title", "Dashboard");
return this._super().then(function() {
self.render_dashboards();
});
},
render_dashboards: function() {
var self = this;
_.each(this.dashboard_templates, function(template) {
self.$('.o_pad_dashboard').append(QWeb.render(template, {widget: self}));
});
},
fetch_data: function() {
// to do : fetching the data
},
});
core.action_registry.add('pad_dashboard_tag', PadDashboard);
return PadDashboard;
});
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<templates id="template" xml:space="preserve">
<t t-name="Dashboard">
<div class="oh_dashboards">
<div class="container-fluid o_pad_dashboard">
</div>
</div>
</t>
<t t-name="DashboardTop">
<div class="row">
<div class="col-xl-3 col-sm-6">
<div class="card">
<div class="card-body">
<div class="d-flex text-muted">
<div class="flex-shrink-0 me-3 align-self-center">
<div id="radialchart-1" class="apex-charts" dir="ltr"></div>
</div>
<div class="flex-grow-1 overflow-hidden">
<p class="mb-1">Users</p>
<h5 class="mb-3">2.2k</h5>
<p class="text-truncate mb-0"><span class="text-success me-2"> 0.02% <i class="ri-arrow-right-up-line align-bottom ms-1"></i></span> From previous</p>
</div>
</div>
</div>
<!-- end card-body -->
</div>
<!-- end card -->
</div>
<!-- end col -->
<div class="col-xl-3 col-sm-6">
<div class="card">
<div class="card-body">
<div class="d-flex">
<div class="flex-shrink-0 me-3 align-self-center">
<div id="radialchart-2" class="apex-charts" dir="ltr"></div>
</div>
<div class="flex-grow-1 overflow-hidden">
<p class="mb-1">Views per minute</p>
<h5 class="mb-3">50</h5>
<p class="text-truncate mb-0"><span class="text-success me-2"> 1.7% <i class="ri-arrow-right-up-line align-bottom ms-1"></i></span> From previous</p>
</div>
</div>
</div>
<!-- end card-body -->
</div>
<!-- end card -->
</div>
<!-- end col -->
<div class="col-xl-3 col-sm-6">
<div class="card">
<div class="card-body">
<div class="d-flex text-muted">
<div class="flex-shrink-0 me-3 align-self-center">
<div id="radialchart-3" class="apex-charts" dir="ltr"></div>
</div>
<div class="flex-grow-1 overflow-hidden">
<p class="mb-1">Bounce Rate</p>
<h5 class="mb-3">24.03 %</h5>
<p class="text-truncate mb-0"><span class="text-danger me-2"> 0.01% <i class="ri-arrow-right-down-line align-bottom ms-1"></i></span> From previous</p>
</div>
</div>
</div>
<!-- end card-body -->
</div>
<!-- end card -->
</div>
<!-- end col -->
<div class="col-xl-3 col-sm-6">
<div class="card">
<div class="card-body">
<div class="d-flex text-muted">
<div class="flex-shrink-0 me-3 align-self-center">
<div class="avatar-sm">
<div class="avatar-title bg-light rounded-circle text-primary font-size-20">
<i class="ri-group-line"></i>
</div>
</div>
</div>
<div class="flex-grow-1 overflow-hidden">
<p class="mb-1">New Visitors</p>
<h5 class="mb-3">435</h5>
<p class="text-truncate mb-0"><span class="text-success me-2"> 0.01% <i class="ri-arrow-right-up-line align-bottom ms-1"></i></span> From previous</p>
</div>
</div>
</div>
<!-- end card-body -->
</div>
<!-- end card -->
</div>
<!-- end col -->
</div>
</t>
</templates>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="idg_region_tax_actual_graph" model="ir.actions.act_window">
<field name="name">idg.region.tax.actual.tree</field>
<field name="res_model">idg.region.tax.actual</field>
<field name="view_mode">graph</field>
<!-- <field name="view_id" ref="idg_board.idg_board_tax_actual_graph_view"/> -->
</record>
<record id="idg_region_tax_actual_tree" model="ir.actions.act_window">
<field name="name">idg.region.tax.actual.tree</field>
<field name="res_model">idg.region.tax.actual</field>
<field name="view_mode">tree</field>
<!-- <field name="view_id" ref="idg_board.idg_board_tax_actual_graph_view"/> -->
</record>
<record id="idg_region_tax_plan_tree" model="ir.actions.act_window">
<field name="name">idg.region.tax.plan.tree</field>
<field name="res_model">idg.region.tax.plan</field>
<field name="view_mode">graph</field>
<!-- <field name="view_id" ref="idg_board.idg_board_tax_plan_graph_view"/> -->
</record>
<record id="idg_region_tax_potency_tree" model="ir.actions.act_window">
<field name="name">idg.region.tax.potency.tree</field>
<field name="res_model">idg.region.tax.potency</field>
<field name="view_mode">graph</field>
<!-- <field name="view_id" ref="idg_board.idg_board_tax_potency_graph_view"/> -->
</record>
<record model="ir.ui.view" id="tax_main_board">
<field name="name">Dashboard Pajak Daerah</field>
<field name="model">board.board</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Dashboard Pajak Daerah">
<board style="1-1-1">
<column>
<action
string="Potensi"
name="%(idg_region_tax_potency_tree)d"/>
</column>
<column>
<action
string="Rencana"
name="%(idg_region_tax_plan_tree)d"/>
</column>
<column>
<action
string="Realisasi"
name="%(idg_region_tax_actual_graph)d"/>
</column>
</board>
<board style="2-1">
<column>
<action
string="Potensi"
name="%(idg_region_tax_potency_tree)d"/>
<action
string="Rencana"
name="%(idg_region_tax_plan_tree)d"/>
</column>
<column>
<action
string="Realisasi"
name="%(idg_region_tax_actual_tree)d"/>
</column>
</board>
</form>
</field>
</record>
<record model="ir.actions.act_window" id="open_board_tax">
<field name="name">Dashboard Pajak Daerah</field>
<field name="res_model">board.board</field>
<field name="view_mode">form</field>
<field name="usage">menu</field>
<field name="view_id" ref="tax_main_board"/>
</record>
<menuitem
name="Dashboard Pajak Daerah"
parent="base.menu_reporting_dashboard"
action="open_board_tax"
sequence="1"
id="menu_board_tax"/>
</odoo>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="pad_dashboard_action" model="ir.actions.client">
<field name="name">Dashboard</field>
<field name="tag">pad_dashboard_tag</field>
</record>
<menuitem name="Dashboard" id="pad_dashboard_menu" action="pad_dashboard_action"/>
<!-- <template id="dashboard_assets" name="Dashboard Assets" inherit_id="web.assets_backend">-->
<!-- <xpath expr="." position="inside">-->
<!-- <link href="/idg_board/static/src/css/pad_dashboard.css" rel="stylesheet" type="text/css" />-->
<!-- </xpath>-->
<!-- </template>-->
<template id="dashboard_assets_2" name="Dashboard Assets 2" inherit_id="web.assets_backend">
<xpath expr="." position="after">
<script type="text/javascript" src="/idg_board/static/src/js/pad_dashboard.js"/>
<script type="text/javascript" src="/idg_board/static/src/js/apexcharts.min.js"/>
<script type="text/javascript" src="/idg_board/static/src/js/dashboard.js"/>
</xpath>
</template>
</odoo>
\ No newline at end of file \ No newline at end of file
...@@ -62,7 +62,7 @@ ...@@ -62,7 +62,7 @@
<record id="action_idg_region_tax_actual" model="ir.actions.act_window"> <record id="action_idg_region_tax_actual" model="ir.actions.act_window">
<field name="name">Region Tax Actual</field> <field name="name">Region Tax Actual</field>
<field name="res_model">idg.region.tax.actual</field> <field name="res_model">idg.region.tax.actual</field>
<field name="view_mode">tree,form</field> <field name="view_mode">tree,form,graph</field>
<field name="view_id" ref="idg_region_tax_actual_tree"/> <field name="view_id" ref="idg_region_tax_actual_tree"/>
<field name="search_view_id" ref="view_idg_region_tax_actual_search"/> <field name="search_view_id" ref="view_idg_region_tax_actual_search"/>
<field name="help" type="html"> <field name="help" type="html">
......
...@@ -64,7 +64,7 @@ ...@@ -64,7 +64,7 @@
<record id="action_idg_region_tax_plan" model="ir.actions.act_window"> <record id="action_idg_region_tax_plan" model="ir.actions.act_window">
<field name="name">Region Tax Planned</field> <field name="name">Region Tax Planned</field>
<field name="res_model">idg.region.tax.plan</field> <field name="res_model">idg.region.tax.plan</field>
<field name="view_mode">tree,form</field> <field name="view_mode">tree,form,graph</field>
<field name="view_id" ref="idg_region_tax_plan_tree"/> <field name="view_id" ref="idg_region_tax_plan_tree"/>
<field name="search_view_id" ref="view_idg_region_tax_plan_search"/> <field name="search_view_id" ref="view_idg_region_tax_plan_search"/>
<field name="help" type="html"> <field name="help" type="html">
......
...@@ -61,7 +61,7 @@ ...@@ -61,7 +61,7 @@
<record id="action_idg_region_tax_potency" model="ir.actions.act_window"> <record id="action_idg_region_tax_potency" model="ir.actions.act_window">
<field name="name">Region Tax Potency</field> <field name="name">Region Tax Potency</field>
<field name="res_model">idg.region.tax.potency</field> <field name="res_model">idg.region.tax.potency</field>
<field name="view_mode">tree,form,kanban,graph</field> <field name="view_mode">tree,form,graph</field>
<field name="view_id" ref="idg_region_tax_potency_tree"/> <field name="view_id" ref="idg_region_tax_potency_tree"/>
<field name="search_view_id" ref="view_idg_region_tax_potency_search"/> <field name="search_view_id" ref="view_idg_region_tax_potency_search"/>
<!-- <field name="context">{'search_default_group_province': 1}</field>--> <!-- <field name="context">{'search_default_group_province': 1}</field>-->
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<!-- Top menu item --> <!-- Top menu item -->
<menuitem id="idg_pdl_kab_menu_root" <menuitem id="idg_pdl_kab_menu_root"
name="PDL Kab/Kota" name="PDL Kab/Kota"
web_icon="idg_pdl_kab_icon,static/description/icon.png" web_icon="idg_pdl_kab,static/description/icon.png"
active="True" active="True"
sequence="400"/> sequence="400"/>
<!--Pendataan--> <!--Pendataan-->
......
# -*- coding: utf-8 -*-
from .hooks import test_pre_init_hook, test_post_init_hook
# from . import wizard
# -*- coding: utf-8 -*-
{
"name": "IDG Backend Theme V14",
"description": """Odoo V14 backend theme for Indonesia Government""",
"summary": "Odoo V14 backend theme for Indonesia Government",
"category": "Themes/Backend",
"version": "1.0",
'author': 'bregananta',
'company': 'bregananta',
'maintainer': 'bregananta',
'website': "https://www.bregananta.id",
"depends": ['base', 'web', 'mail', 'web_responsive'],
'images': [],
"data": [
# 'security/ir.model.access.csv',
'views/assets.xml',
'views/icons.xml',
'views/layout.xml',
# 'views/theme.xml',
# 'data/theme_data.xml',
],
"qweb": [
'static/src/xml/sidebar.xml',
'static/src/xml/styles.xml',
'static/src/xml/top_bar.xml',
# 'static/src/xml/systray.xml',
],
'installable': True,
'application': False,
'auto_install': False,
}
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="theme_data_stored" model="theme.data.stored">
<field name="name">default</field>
</record>
</data>
</odoo>
# -*- coding: utf-8 -*-
import base64
from odoo import api, SUPERUSER_ID
from odoo.modules import get_module_resource
def test_pre_init_hook(cr):
"""pre init hook"""
env = api.Environment(cr, SUPERUSER_ID, {})
menu_item = env['ir.ui.menu'].search([('parent_id', '=', False)])
for menu in menu_item:
if menu.name == 'PDL Kab/Kota':
img_path = get_module_resource(
'idg_theme', 'static', 'src', 'img', 'icons', 'idg_pdl.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'BPHTB':
img_path = get_module_resource(
'idg_theme', 'static', 'src', 'img', 'icons', 'idg_bphtb.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
def test_post_init_hook(cr, registry):
"""post init hook"""
env = api.Environment(cr, SUPERUSER_ID, {})
menu_item = env['ir.ui.menu'].search([('parent_id', '=', False)])
for menu in menu_item:
if menu.name == 'PDL Kab/Kota':
img_path = get_module_resource(
'idg_theme', 'static', 'src', 'img', 'icons',
'idg_pdl.png')
menu.write({'web_icon_data': base64.b64encode(
open(img_path, "rb").read())})
if menu.name == 'BPHTB':
img_path = get_module_resource(
'idg_theme', 'static', 'src', 'img', 'icons',
'idg_bphtb.png')
menu.write({'web_icon_data': base64.b64encode(
open(img_path, "rb").read())})
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_theme_data,access.theme.data,model_theme_data,,1,1,1,1
<!-- HERO SECTION -->
<div class="contianer">
<div class="row position-relative"
style="background-color: #2f3542 !important; height: 400px; margin-bottom: 6rem; border-radius: 1rem !important;">
<div class="col-lg-12 d-flex flex-column justify-content-start align-items-center">
<h1 class="display-1 text-white" style="padding-top: 5rem;">SDN Theme</h1>
<p class="text-light small font-weight-bold" style="letter-spacing: 2px; text-transform: uppercase;">Backend Theme for
Odoo 14</p>
</div>
</div>
</div>
<!-- END OF HERO SECTION -->
\ No newline at end of file \ No newline at end of file
odoo.define('idg_theme.SideBar', function (require) {
"use strict";
var Widget = require('web.Widget');
var SideBar = Widget.extend({
events: _.extend({}, Widget.prototype.events, {
'click .nav-link': '_onAppsMenuItemClicked',
}),
template: "idg_theme.Sidebar",
init: function (parent, menuData) {
this._super.apply(this, arguments);
this._apps = _.map(menuData.children, function (appMenuData) {
return {
actionID: parseInt(appMenuData.action.split(',')[1]),
menuID: appMenuData.id,
name: appMenuData.name,
xmlID: appMenuData.xmlid,
web_icon_data: appMenuData.web_icon_data,
};
});
},
getApps: function () {
return this._apps;
},
_openApp: function (app) {
this.trigger_up('app_clicked', {
action_id: app.actionID,
menu_id: app.menuID,
});
},
_onAppsMenuItemClicked: function (ev) {
var $target = $(ev.currentTarget);
var actionID = $target.data('action-id');
var menuID = $target.data('menu-id');
var app = _.findWhere(this._apps, { actionID: actionID, menuID: menuID });
this._openApp(app);
},
});
return SideBar;
});
\ No newline at end of file \ No newline at end of file
odoo.define('idg_theme.SidebarMenu', function (require) {
"use strict";
const config = require("web.config");
const Menu = require("web.Menu");
const SideBar = require("idg_theme.SideBar");
Menu.include({
start() {
var res = this._super.apply(this, arguments);
this.sidebar_apps = this.$('.sidebar_panel');
this._sideBar = new SideBar(this, this.menu_data);
var sideBar = this._sideBar.appendTo(this.sidebar_apps);
return res, sideBar
},
});
function showSidebar(){
$("#sidebar_panel").css({'display':'block'});
$(".o_action_manager").css({'margin-left': '90px','transition':'all .1s linear'});
$(".top_heading").css({'margin-left': '78px','transition':'all .1s linear'});
$("#dotsWhite").toggleClass("d-block d-none");
$("#dotsPrimary").toggleClass("d-block d-none");
//add class in navbar
var navbar = $(".o_main_navbar");
var navbar_id = navbar.data("id");
$("nav").addClass(navbar_id);
navbar.addClass("small_nav");
//add class in action-manager
var action_manager = $(".o_action_manager");
var action_manager_id = action_manager.data("id");
$("div").addClass(action_manager_id);
action_manager.addClass("sidebar_margin");
//add class in top_heading
var top_head = $(".top_heading");
var top_head_id = top_head.data("id");
$("div").addClass(top_head_id);
top_head.addClass("sidebar_margin");
}
function hideSidebar(){
$("#sidebar_panel").css({'display':'none'});
$(".o_action_manager").css({'margin-left': '0px'});
$(".top_heading").css({'margin-left': '0px'});
$("#dotsWhite").toggleClass("d-block d-none");
$("#dotsPrimary").toggleClass("d-block d-none");
//remove class in navbar
var navbar = $(".o_main_navbar");
var navbar_id = navbar.data("id");
$("nav").removeClass(navbar_id);
navbar.removeClass("small_nav");
//remove class in action-manager
var action_manager = $(".o_action_manager");
var action_manager_id = action_manager.data("id");
$("div").removeClass(action_manager_id);
action_manager.removeClass("sidebar_margin");
//remove class in top_heading
var top_head = $(".top_heading");
var top_head_id = top_head.data("id");
$("div").removeClass(top_head_id);
top_head.removeClass("sidebar_margin");
}
var showBar = false;
$(document).on("click", "#triggerSidebar", function(event){
if(showBar){
hideSidebar();
}else{
showSidebar();
}
$("#triggerSidebar").toggleClass('c_sidebar_active c_sidebar_passive');
$('#dotsMenuContainer').toggleClass('c_dots_menu c_dots_menu_toggled');
showBar = !showBar;
});
/* $(document).on("click", ".sidebar a", function(event){
var menu = $(".sidebar a");
var $this = $(this);
var id = $this.data("id");
$("header").removeClass().addClass(id);
menu.removeClass("active");
$this.addClass("active");
//sidebar close on menu-item click
$("#sidebar_panel").css({'display':'none'});
$(".o_action_manager").css({'margin-left': '0px'});
$(".top_heading").css({'margin-left': '0px'});
$("#closeSidebar").hide();
$("#openSidebar").show();
//remove class in navbar
var navbar = $(".o_main_navbar");
var navbar_id = navbar.data("id");
$("nav").removeClass(navbar_id);
navbar.removeClass("small_nav");
//remove class in action-manager
var action_manager = $(".o_action_manager");
var action_manager_id = action_manager.data("id");
$("div").removeClass(action_manager_id);
action_manager.removeClass("sidebar_margin");
//remove class in top_heading
var top_head = $(".top_heading");
var top_head_id = top_head.data("id");
$("div").removeClass(top_head_id);
top_head.removeClass("sidebar_margin");
});*/
});
\ No newline at end of file \ No newline at end of file
odoo.define('idg_theme.Load', function (require) {
"use strict";
var rpc = require('web.rpc');
var session = require('web.session');
$(document).ready(function () {
rpc.query({
model: 'theme.data',
method: 'action_apply',
args: [this]
});
});
});
\ No newline at end of file \ No newline at end of file
odoo.define('idg_theme.theme', function (require) {
"use strict";
var SystrayMenu = require('web.SystrayMenu');
var Widget = require('web.Widget');
var Session = require('web.session');
var ThemeWidget = Widget.extend({
template: 'theme_systray',
events: {
'click #theme_sdn': '_onClick',
},
is_admin: false,
willStart: function () {
this.is_admin = Session.is_admin;
return this._super.apply(this, arguments);
},
_onClick: function(){
var menu = $('.o_menu_sections');
this.do_action({
type: 'ir.actions.act_window',
name: 'theme data',
res_model: 'theme.data',
view_mode: 'form',
views: [[false, 'form']],
target: 'new'
});
},
});
SystrayMenu.Items.push(ThemeWidget);
return ThemeWidget;
});
.datepicker{
z-index: 9999 !important;
}
div.dropdown-menu.bootstrap-datetimepicker-widget {
width: 28rem !important;
}
.datepicker .table-sm > thead,
.datepicker > div > table > tbody > tr > td.active{
background-color: $one__primary;
}
.datepicker .table-sm > thead > tr:first-child th:hover {
background-color: $one__primary-dark;
}
.datepicker .table-sm > tbody > tr > td.today::before{
border-bottom-color: $one__primary;
}
.c_login_container{
background: $one__light !important;
width: 100% !important;
.card-body{
background-color: transparent !important;
}
}
.input-group-prepend{
.input-group-text{
border-radius: 0px !important;
border-right: 0px !important;
background: transparent !important;
}
}
.form-control{
border-radius: 0px !important;
border-color: $one__border-light;
background-color: none;
&:focus{
box-shadow: none !important;
}
}
//Buttons
.btn{
border-radius: 0px;
&:hover{
filter: brightness(90%) !important;
box-shadow: none;
transition: $transition-normal;
}
}
.btn-primary{
background-color: $one__primary !important;
border-color: $one__primary !important;
color: $one__light !important;
&:hover{
background-color: $one__primary-dark !important;
}
&:focus{
box-shadow: 0 0 0 0.2rem rgba(235,240,253, 0.8);
}
}
//Links
a, .btn-link {
color: $one__primary;
text-decoration: none;
background-color: transparent;
&:hover{
color: $one__primary-dark;
text-decoration: none !important;
transition: $transition-normal;
}
}
\ No newline at end of file \ No newline at end of file
#sidebar_panel {
height: 100%;
position: fixed;
top: 0px;
background-color: $one__sidebar-color;
border-right: 1px solid $one__sidebar-border;
display: none;
width: 80px;
overflow-y: scroll;
-ms-overflow-style: none; /* Hide scrollbar for IE and Edge */
scrollbar-width: none; /* Hide scrollbar for Firefox */
z-index: 999;
}
#sidebar_panel::-webkit-scrollbar {
display: none; /* Hide scrollbar for Chrome, Safari and Opera */
}
.sidebar_menu{
margin-top: 20px !important;
}
.sidebar_title{
color: $one__sidebar_text;
font-weight: bold;
text-transform: uppercase;
letter-spacing: 2px;
font-size: 0.9rem;
margin-left: auto;
margin-right: auto;
width: 38px;
display: block;
margin-top: 18px !important;
}
.sidebar_panel .sidebar {
padding: 0;
white-space: nowrap;
padding-bottom: 20px;
padding-top: 5px;
}
.sidebar_panel .sidebar_close {
text-align: end;
display: none;
position: sticky;
height: 35px;
padding-top: 5px;
top: 0;
background: #2a3042;
z-index: 1;
}
.sidebar_panel .sidebar_close a#closeSidebar {
font-size: 18px;
margin-right: 10px;
color: #ffffff;
opacity: .3;
}
.sidebar_panel .sidebar_close a#closeSidebar img {
width: 15px;
}
.sidebar_panel .sidebar .sidebar_logo {
padding-top: 20px;
text-align: center;
padding-bottom: 20px;
}
.sidebar_panel .sidebar .sidebar_logo img {
max-width: 150px;
}
.sidebar_panel .sidebar .sidebar_head {
padding-top: 20px;
padding-left: 15px;
color: #6a7187;
font-size: 14px;
}
.sidebar_panel .sidebar .sidebar_menu {
list-style: none;
margin: 0;
padding: 0;
}
.sidebar_panel .sidebar .sidebar_menu li {
margin: 0;
padding: 0;
border: 0px;
display: block;
}
.sidebar_panel .sidebar .sidebar_menu li a {
margin: 0;
border: 0px;
display: block;
cursor: pointer;
overflow: hidden;
padding: 8px 10px 8px 25px;
color: #ffffff;
font-size: 13px;
transition:.3s all;
}
.sidebar_panel .sidebar .sidebar_menu li:hover a {
background: $one__sidebar-color-hover;
color: $one__light;
}
.sidebar_panel .nav-link {
opacity: 1 !important;
transition:.3s all;
}
.sidebar_panel .sidebar a.nav-link.active {
color: $one__light !important;
border-left: 4px solid $one__light;
img{
margin-left: -0.5rem !important;
}
}
.sidebar_panel .sidebar .sidebar_menu li a .sidebar_img {
width: 32px;
height: 32px;
margin: 8px 8px 8px 0;
}
.sidebar_panel .sidebar .sidebar_menu li a {
transition: $transition-fast;
&:hover{
transform: scale(1.1);
transition: $transition-fast;
}
}
\ No newline at end of file \ No newline at end of file
body{
background-color: $one__light !important;
font-family: $one__font;
}
//NAVBAR
.o_main_navbar {
-webkit-box-shadow: 0 0.75rem 1.5rem rgba(18,38,63,.03) !important;
box-shadow: 0 0.75rem 1.5rem rgba(18,38,63,.03) !important;
background-color: $one__light;
border-bottom: none;
-moz-box-shadow: rgba(0, 0, 0, 0.19) 0px 10px 20px, rgba(0, 0, 0, 0.5) 0px 6px 6px;
-webkit-box-shadow: rgba(0, 0, 0, 0.19) 0px 10px 20px, rgba(0, 0, 0, 0.5) 0px 6px 6px;
box-shadow: rgba(0, 0, 0, 0.19) 0px 10px 20px, rgba(0, 0, 0, 0.5) 0px 6px 6px;
color: $one__light-font-primary;
height: 60px !important;
}
// .o-menu-toggle{
// display: none !important;
// }
.c_dots_menu{
background-image: url('/idg_theme/static/src/img/icons/dots-menu.png');
width: 24px;
height: 24px;
background-repeat: no-repeat;
background-size: contain;
}
.c_dots_menu_toggled{
background-image: $dots_menu_toggled;
width: 24px;
height: 24px;
background-repeat: no-repeat;
background-size: contain;
}
li.o_MessagingMenu.o-is-open {
background-color: $one__hover-bkg-light;
border-bottom: none !important;
}
.o_mail_systray_item .o_notification_counter{
background-color: $one__primary !important;
color: $one__light !important;
}
.o_MessagingMenu_counter {
margin-left: -12px !important;
}
.o_MessagingMenu_dropdownMenu.o-mobile,
.o_main_navbar .o_mail_systray_dropdown.show{
top: 60px !important;
max-height: calc(100vh - 60px);
background-color: $one__light !important;
}
.o_notification_counter{
margin-left: -18px !important;
}
.o_NotificationGroup_date{
color: $one__primary !important
}
.o_menu_sections > li > a, .o_main_navbar > li > label{
color: $one__light-font-primary;
font-size: 1.2rem !important;
display: block !important;
height: 60px !important;
line-height: 60px !important;
&:hover{
background-color: $one__hover-bkg-light;
//border-bottom: 1px solid $one__border-light;
}
}
.o_switch_company_menu > a{
color: $one__light-font-primary;
font-size: 1.8rem !important
}
.oe_topbar_name{
color: $one__light-font-primary;
font-size: 1.2rem !important;
}
.o_main_navbar > a:hover, .o_main_navbar > a:focus, .o_main_navbar > button:hover, .o_main_navbar > button:focus {
background-color: $one__hover-bkg-light;
//border-bottom: 1px solid $one__border-light;
}
.o_MessagingMenu, .o_mail_systray_item{
a{
color: $one__light-font-primary;
}
}
.o_MessagingMenu_counter, .o_notification_counter {
background-color: $one__primary;
color: $one__light;
}
.o_main_navbar .show .dropdowdropdown-toggle, .o_main_navbar .show .dropdown-toggle {
background-color: $one__light;
//border-bottom: 1px solid $one__border-light;
}
.o_main_navbar .o_user_menu .oe_topbar_avatar {
height: 32px !important;
width: 32px !important;
}
.oe_topbar_name{
color: $one__light-font-primary !important;
}
.o_dashboards .o_website_dashboard div.o_box h2, .o_dashboards .o_website_dashboard div.o_box h4 {
color: $one__primary !important;
}
.o_control_panel {
padding: 2.5rem 1rem !important;
margin-bottom: 1.5rem !important;
border-bottom: 1px solid $one__border-light;
width: 98%;
margin-left: auto;
margin-right: auto;
}
.o_form_view .oe_button_box .oe_stat_button .o_button_icon {
color: $one__primary;
}
.o_control_panel .breadcrumb > li, .breadcrumb-item > a{
font-size: 2rem !important;
color: $one__light-font-secondary;
}
.breadcrumb-item.active{
$color: $one__light-font-primary;
}
.o_control_panel .breadcrumb-item:nth-last-of-type(2)::before {
color: $one__primary !important;
}
.breadcrumb-item + .breadcrumb-item {
@media (max-width: 767.98px) {
padding: 0.3rem 0.5rem !important;
}
}
.o_form_view .o_form_statusbar > .o_statusbar_status > .o_arrow_button.btn-primary.disabled::after,
.o_form_view .o_form_statusbar > .o_statusbar_status > .o_arrow_button:not(:first-child)::before {
border-left-color: none !important;
}
.o_statusbar_status > .o_arrow_button.btn-secondary{
background-color: $one__light !important;
}
.o_form_view .o_form_statusbar > .o_statusbar_status > .o_arrow_button.disabled {
border-left: none !important;
}
// .o_form_view .o_form_statusbar > .o_statusbar_status > .o_arrow_button:not(:first-child)::before,
// .o_form_view .o_form_statusbar > .o_statusbar_status > .o_arrow_button:not(:first-child)::after {
// background-color: $one__light !important;
// }
.o_content{
width: 98%;
margin-left: auto;
margin-right: auto;
}
.top_heading{
display: flex;
align-items: center;
height: 60px;
ul.o_menu_apps{
list-style: none;
margin: 0 0.8rem 0 0;
padding: 0px;
}
a.o_menu_brand{
color: $one__light-font-primary;
font-size: 1.8rem !important;
}
}
.o_menu_sections, .o_menu_systray{
display: flex;
align-items: center;
list-style: none !important;
height: 60px !important;
li{
margin-right: 1rem;
&:last-child{
margin-right: 0 !important;
}
}
}
.o_menu_systray, .o_menu_sections{
li{
position: relative !important;
a.o_MessagingMenu_toggler, a.dropdown-toggle{
display: flex !important;
align-items: center !important;
height: 60px !important;
padding: 0px 7.5px;
img{
margin-right: 0.8rem;
transform: none !important;
}
}
}
}
.o_main_navbar .dropdown-menu.show {
min-width: auto !important;
}
.o_form_view .o_form_uri > span:first-child {
color: $one__primary;
}
.o_onboarding_container{
margin-top: -1.575rem !important;
}
.o_loading{
background-color: $one__primary !important;
}
.o_menu_systray > li > a > span.fa{
color: $one__light-font-primary;
font-size: 1.9rem !important;
margin: auto 11px !important;
}
@media (max-width: 767.98px) {
.o_menu_systray{
margin: 0 !important;
padding: 0 !important;
li{
margin-right: 0.5rem !important;
}
}
}
//`Custom`
.c_navbar_container{
display: flex;
justify-content: space-between;
width: 100%;
margin-left: auto;
margin-right: auto;
padding: 0 1rem 0 0 !important;
@media (max-width: 991.98px) {
padding: 0 !important;
}
}
.c_sidebar_active{
height: 60px;
width: 70px;
display: flex !important;
justify-content: center;
align-items: center;
background-color: $one__primary;
color: $one__light !important;
margin-right: 1.5rem !important;
clip-path: polygon(0 0, 100% 0%, 86% 100%, 0% 100%);
&:hover{
background-color: $one__primary-dark;
transition: $transition-normal;
}
}
.c_sidebar_passive{
height: 60px;
width: 70px;
display: flex !important;
justify-content: center;
align-items: center;
background-color: $one__light;
color: $one__primary !important;
clip-path: polygon(0 0, 100% 0%, 86% 100%, 0% 100%);
}
//END OF NAVBAR
.dropdown-menu{
border-radius: 10px !important;
a, .dropdown-item{
color: $one__light-font-primary;
&:hover{
color: $one__primary !important;
background-color: $one__primary-light;
transition: $transition-normal;
}
}
}
//Buttons
.btn{
border-radius: $one__border;
padding-left: $one__button-padding !important;
padding-right: $one__button-padding !important;
&:hover{
filter: brightness(90%) !important;
box-shadow: none;
transition: $transition-normal;
}
}
.btn-primary, .o_select_file_button{
background-color: $one__primary !important;
border-color: $one__primary !important;
color: $one__light !important;
&:hover{
background-color: $one__primary-dark !important;
}
&:focus{
box-shadow: 0 0 0 0.2rem rgba(235,240,253, 0.8);
}
}
.btn-secondary{
background-color: $one__hover-bkg-light;
border-color: $one__hover-bkg-light;
color: $one__light-font-primary;
&:focus{
box-shadow: 0 0 0 0.2rem rgba(245,245,245, 1);
}
}
.btn-fill-info, .btn-info {
background-color: $one__info;
border-color: $one__info;
color: $one__light;
}
.btn-group, .o_filter_menu{
button, div.btn-group{
margin-right: 3px;
&:last-child{
margin-right: 0px !important;
}
}
}
.btn-link{
color: $one__primary !important;
&:hover{
background-color: $one__hover-bkg-light !important;
}
}
.o_control_panel .o_cp_bottom_left > .o_cp_action_menus .o_dropdown_toggler_btn {
margin-right: 0px !important;
}
.o_activity_view .o_record_selector, .o_stat_value {
color: $one__primary !important;
}
.o_web_settings_invite{
height: 26px !important;
margin-top: 6px !important;
}
.o_NotificationList{
div:hover {
background-color: $one__primary-light;
}
}
.o_MessagingMenu_tabButton, .o_MessagingMenu_newMessageButton{
color: $one__primary;
opacity: 0.8;
.o-active{
opacity: 1;
font-weight: bold;
}
}
.o_ThreadPreview_date, .o_activity_filter_button, .o_mail_activity_action{
color: $one__primary !important;
&:before{
color: $one__light-font-primary;
}
&:hover{
color: $one__primary-dark !important;
}
}
//Controls
.custom-control.custom-checkbox .custom-control-input:not(:checked):not(:indeterminate) ~ .custom-control-label::before {
background: none;
outline: 1px solid $one__hover-bkg-light;
}
.custom-checkbox .custom-control-label::before {
border-radius: $one__border !important;
}
.custom-control-input:checked ~ .custom-control-label::before {
color: $one__light;
border-color: $one__primary;
background-color: $one__primary;
}
.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23FFFFFF' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e");
}
.o_input, .form-control{
border-radius: $one__border !important;
border-color: $one__border-light;
}
.o_required_modifier.o_input, .o_required_modifier .o_input, .o_searchview .o_searchview_autocomplete li.o_selection_focus {
background-color: $one__primary-light !important;
}
.ui-menu-item > a{
background-color: $one__light !important;
color: $one__primary !important;
&:hover, &:active, &:focus, &:focus-within, &:focus-visible, &:visited{
color: $one__primary !important;
background-color: $one__primary-light !important;
}
}
.nav-tabs .nav-link {
border-radius: 0px !important;
border-top: 3px solid transparent !important;
}
.nav-tabs .nav-link.active {
border-top: 3px solid $one__primary !important;
}
.nav-tabs .nav-link:hover{
border-top: 3px solid $one__primary !important;
color: $one__primary-dark;
transition: transition-normal !important;
}
.o_form_view .o_horizontal_separator {
color: $one__primary;
}
.panel-heading.note-toolbar {
background-color: $one__light !important;
}
div.o_boolean_toggle.custom-control.custom-checkbox > input.custom-control-input:checked + label.custom-control-label::before {
background-color: $one__primary !important;
}
//Misc.
.badge-primary{
background-color: $one__primary;
border-radius: $one__border;
padding: 5px;
}
//Links
a {
color: $one__primary;
text-decoration: none;
background-color: transparent;
&:hover{
color: $one__primary-dark;
text-decoration: none;
transition: $transition-normal;
}
}
a.o_menu_brand{
color: $one__light-font-primary;
font-weight: bold;
}
.o_form_uri{
color: $one__primary !important;
}
.o_Message_prettyBody > div > p > a {
background-color: $one__primary !important;
border-radius: $one__border !important;
&:hover{
color: $one__light !important;
}
}
.o_onboarding_step_title > a {
color: $one__light;
}
.oe_kanban_action_a{
color: $one__light-font-primary;
}
.o_kanban_view.o_kanban_grouped .o_kanban_mobile_tabs_container .o_kanban_mobile_tabs .o_kanban_mobile_tab.o_current {
border-bottom: 3px solid $one__primary !important;
}
//Tables
.o_list_view thead {
background-color: $one__hover-bkg-light;
}
.o_list_view .o_list_table thead {
color: $one__light-font-secondary;
border-bottom: 1px solid $one__border-light;
}
.o_list_view .o_list_table thead > tr > th:not(.o_list_record_selector) {
border-left: none;
}
table thead th {
vertical-align: bottom;
border-top: none !important;
border-bottom: none !important;
padding: 1rem !important;
}
table-sm th, .table-sm td {
padding: 1rem !important;
border-top: none !important;
}
tr:nth-child(even){
background-color: $one__hover-bkg-light;
}
.o_list_view .o_list_table tfoot {
background-color: $one__light;
filter: brightness(95.5%) !important;
}
//Search
.o_searchview .o_searchview_facet, .o_setting_search {
background: $one__light;
border-radius: $one__border !important;
border: 1px solid $one__border-light;
color: $one__light-font-secondary;
}
.o_searchview .o_searchview_facet .o_searchview_facet_label {
background-color: $one__light;
}
.o_searchview .o_searchview_input_container .o_searchview_facet .o_searchview_facet_label {
color: $one__light-font-secondary;
margin: 0px -3px 3px 3px;
}
.o_searchview .o_searchview_input_container .o_searchview_facet .o_facet_remove{
bottom: 3px !important;
}
.o_searchview .o_searchview_input_container .o_searchview_facet .o_facet_values {
padding: 2px 18px 0 5px !important;
}
.o_searchview{
padding: 0.5rem !important;
border-radius: $one__border !important;
@media (max-width: 767.98px) {
display: flex;
justify-content: center;
align-items: center;
}
}
.searchInput{
border: none !important;
}
.searchIcon{
margin: 5px 5px 0 0;
}
.o_setting_search {
padding: 5px;
}
//Kanban
.oe_kanban_card{
border-color: $one__border-light;
padding: 1rem !important;
}
//Calendar
@include c_fadeBackgroundOut('fadeCalendarRow', 1, 0.6, 212, 212, 212 );
.o_calendar_sidebar_container .ui-datepicker td.ui-datepicker-current-day.ui-datepicker-today a,
.o_calendar_sidebar_container .ui-datepicker td.ui-datepicker-current-day a,
.o_calendar_view .o_calendar_widget .fc-dayGridMonth-view .fc-content-skeleton .fc-today .fc-day-number
{
color: $one__light !important;
background-color: $one__primary !important;
border-radius: $one__border;
}
.o_calendar_sidebar_container .ui-datepicker td a{
color: $one__light-font-secondary;
}
.o_calendar_sidebar_container .ui-datepicker td.ui-datepicker-today a{
background-color: $one__border-light;
}
.o_calendar_sidebar_container .ui-datepicker .o_selected_range.o_color:not(.ui-datepicker-unselectable) {
animation: fadeCalendarRow 2s forwards;
}
.fc-now-indicator {
border-color: $one__primary !important;
}
.fc-ltr .fc-time-grid .fc-now-indicator-arrow {
left: 0;
border-width: 5px 0 5px 6px;
border-top-color: transparent !important;
border-bottom-color: transparent !important;
}
.o_calendar_view .fc-view .fc-event.o_calendar_color_1.o_cw_custom_highlight {
box-shadow: 0 12px 12px -5px rgba(156, 181, 245, 0.8);
color: $one__primary;
font-weight: bold;
}
.o_calendar_view .fc-view .fc-event.o_calendar_color_1 .fc-bg {
background-color: $one__primary-light;
}
.o_calendar_view .fc-view .fc-event.o_calendar_color_1 {
border-color: $one__primary;
color: #274aa5;
opacity: 0.8;
&:hover{
background: $one__primary-light;
box-shadow: 0 12px 12px -5px rgba(156, 181, 245, 0.8);
}
}
//Dashboard Sidebar
.o_Discuss, .o_setting_container{
width: 98%;
margin-right: auto;
margin-left: auto;
margin-top: -1.5rem !important;
border-top: none;
}
.o_widget_Discuss .o_Discuss_content {
border-top: none !important;
}
.o_DiscussSidebar, .settings_tab{
color: $one__light-font-primary;
background-color: transparent !important;
border-right: 2px solid $one__border-light;
height: 95%;
margin-top: auto;
margin-bottom: auto;
@media (max-width: 767.98px) {
height: auto !important;
}
}
.o_DiscussSidebarItem{
padding: 0.4rem 0 !important;
}
.o_DiscussSidebarItem_activeIndicator.o-item-active{
width: 0;
height: 0;
background: transparent;
margin-top: 0.375rem;
margin-right: 8px !important;
border-top: 5px solid transparent;
border-bottom: 5px solid transparent;
border-left: 5px solid $one__primary;
}
.o_DiscussSidebarItem:hover{
background-color: transparent !important;
color: $one__primary;
}
.o_DiscussSidebar_separator{
width: 95% !important;
margin-left: auto;
margin-right: auto;
background-color: transparent !important;
}
.o_MessageList{
padding: 10px !important;
}
.o_Message.o-not-discussion{
background-color: $one__hover-bkg-light;
border-color: $one__border-light;
}
.o_setting_container .settings_tab {
.app_name{
color: $one__light-font-primary !important;
}
}
.o_setting_container .settings_tab .tab{
height: 30px !important;
}
.o_setting_container .settings{
padding: 10px !important;
}
.o_setting_container .settings_tab .app_name {
color: $one__light-font-primary;
&:hover{
color :$one__primary !important;
}
}
.o_setting_container .settings_tab .selected{
background: transparent !important;
box-shadow: none !important;
position: relative;
&:before{
content: "";
position: absolute;
width: 0;
height: 0;
top: 24%;
left: 0;
background: transparent;
margin-top: 0.375rem;
border-top: 5px solid transparent;
border-bottom: 5px solid transparent;
border-left: 5px solid $one__primary;
}
.app_name{
color: $one__light-font-primary;
&:hover{
color :$one__primary !important;
}
}
}
.o_base_settings .o_setting_container .settings_tab .tab{
line-height: 32px;
}
.o_search_panel .o_search_panel_category .o_search_panel_section_icon {
color: $one__primary;
}
.o_search_panel .list-group-item header.active {
background-color: $one__primary-light;
color: $one__primary;
}
//Chat
.o_ChatWindowHeader{
background-color: $one__primary !important;
color: $one__light !important;
border-radius: $one__border !important;
}
//Tables
.o_purchase_dashboard .table > thead > tr > td.o_main, .o_purchase_dashboard .table tbody > tr > td.o_main {
background-color: $one__primary !important;
&:hover{
background-color: $one__primary-dark;
}
a{
color: $one__light;
}
}
//Tags
.o_field_widget.o_field_many2manytags .o_tag_color_5,
.o_kanban_view .o_kanban_record .o_field_many2manytags .o_tag.o_tag_color_5 span,
.o_kanban_view .o_kanban_record .o_kanban_tags .o_tag.o_tag_color_5 span {
background-color: $one__primary;
}
.badge-pill{
a{
color: $one__light;
}
}
.oe_kanban_card .o_kanban_tags .o_tag, .o_kanban_view .o_kanban_record .o_field_many2manytags .o_tag, .o_kanban_view .o_kanban_record .o_kanban_tags .o_tag {
background-color: transparent !important;
}
//Responsive Menu
@media (max-width: 767.98px) {
.o-menu-toggle{
border: none !important;
background: transparent !important;
height: 60px !important;
display: flex !important;
justify-content: center !important;
align-items: center !important;
}
.dropdown-toggle{
width: 100% !important;
}
.o_main_navbar .o_menu_sections.show{
background: $one__light !important;
padding: 0px !important;
align-items: flex-start !important;
height: 100vh !important;
top: 60px !important;
margin-top: 20px !important;
li {
height: 40px !important;
font-weight: bolder;
a{
padding-left: 7px !important;
}
}
}
.o_main_navbar .show .dropdown-toggle {
background-color: $one__light !important;
width: 100% !important;
}
.o_main_navbar .o_menu_sections.show > li{
width: 100% !important;
}
.o_main_navbar .o_menu_sections.show .show {
width: 100% !important;
}
.o_main_navbar .o_menu_sections.show .show .dropdown-menu {
width: 100% !important;
border-radius: 0px !important;
border: none !important;
margin-left: 0rem !important;
box-shadow: none !important;
}
.o_mail_systray_dropdown{
margin-top: 20px !important;
}
}
//Override Search Pannel width
.o_search_panel.account_root {
flex: 0 0 150px !important;
padding: 6px;
scrollbar-width: thin;
.o_search_panel_section_header {
display: none;
}
.list-group-item span.o_search_panel_label_title {
display: contents;
}
.o_search_panel_category_value {
header {
margin-left: 0;
padding-left: 0;
}
.o_search_panel_category_value .o_toggle_fold {
width: 0.3rem;
}
}
&::-webkit-scrollbar {
width: 4px;
}
&::-webkit-scrollbar-thumb {
background: lightgray;
}
}
\ No newline at end of file \ No newline at end of file
//Variables
//Fonts
$one__font: "Odoo Unicode Support Noto", "Lucida Grande", Helvetica, Verdana, Arial, sans-serif;
//Colors
$one__light: #FFF !default;
$one__primary: #386aeb !default;
$one__sidebar-color-hover: #274aa5 !important;
$one__sidebar-border: #386aeb !important;
$one__sidebar-color: #386aeb !important;
$one__sidebar_text: #fff !default;
$one__primary-light: #ebf0fd !default;
$one__primary-dark: #274aa5 !important;
$one__light-font-primary: #1f2631 !important;
$one__light-font-secondary: #575757 !important;
$one__hover-bkg-light: #f5f5f5 !important;
$one__border-light: #d4d4d4 !important;
$one__info: #454555 !important;
//Border Style
$one__border: 0px;
$one__button-padding: auto;
//Misc
$transition-normal: all 0.4s linear !default;
$transition-fast: all 0.2s linear !default;
//Paths
$dots_menu_toggled: url('/idg_theme/static/src/img/icons/dots-menu-primary.png');
//Animations
@mixin c_fadeBackgroundOut($name, $s_opacity, $e_opacity, $r, $g, $b){
@keyframes #{$name}{
0%{
background-color: rgba($r, $g, $b, $s_opacity);
}
100%{
background-color: rgba($r, $g, $b, $e_opacity);
}
}
}
\ No newline at end of file \ No newline at end of file
//Variables
//Fonts
$one__font: 'Nunito', Helvetica, Verdana, Arial, sans-serif !important;
//Colors
$one__light: #fff !default;
$one__primary: #1F2631 !default;
$one__sidebar-color: #1F2631 !important;
$one__sidebar-color-hover: #1c222c !default;
$one__sidebar-border: #1F2631 !important;
$one__sidebar_text: #fff !default;
$one__primary-light: #e9e9ea !default;
$one__primary-dark: #1c222c !important;
$one__light-font-primary: #030405 !important;
$one__light-font-secondary: #575757 !important;
$one__hover-bkg-light: #f5f5f5 !important;
$one__border-light: #d4d4d4 !important;
$one__info: #454555 !important;
//Border Style
$one__border: 100px;
$one__button-padding: 20px;
//Misc
$transition-normal: all 0.4s linear !default;
$transition-fast: all 0.2s linear !default;
//Paths
$dots_menu_toggled: url('/idg_theme/static/src/img/icons/dots-menu-navy.png');
//Animations
@mixin c_fadeBackgroundOut($name, $s_opacity, $e_opacity, $r, $g, $b){
@keyframes #{$name}{
0%{
background-color: rgba($r, $g, $b, $s_opacity);
}
100%{
background-color: rgba($r, $g, $b, $e_opacity);
}
}
}
//Variables
//Fonts
$one__font: 'Poppins', Helvetica, Verdana, Arial, sans-serif !important;
//Colors
$one__light: #fff !default;
$one__primary: #00A97F !default;
$one__sidebar-color: #fff !important;
$one__sidebar-color-hover: #e6f6f2 !default;
$one__sidebar-border: #E9E9E9 !important;
$one__sidebar_text: #00A97F !default;
$one__primary-light: #e6f6f2 !default;
$one__primary-dark: #009872 !important;
$one__light-font-primary: #575757 !important;
$one__light-font-secondary: #575757 !important;
$one__hover-bkg-light: #f5f5f5 !important;
$one__border-light: #d4d4d4 !important;
$one__info: #454555 !important;
//Border Style
$one__border: 3px;
$one__button-padding: auto;
//Misc
$transition-normal: all 0.4s linear !default;
$transition-fast: all 0.2s linear !default;
//Paths
$dots_menu_toggled: url('/idg_theme/static/src/img/icons/dots-menu-green.png');
//Animations
@mixin c_fadeBackgroundOut($name, $s_opacity, $e_opacity, $r, $g, $b){
@keyframes #{$name}{
0%{
background-color: rgba($r, $g, $b, $s_opacity);
}
100%{
background-color: rgba($r, $g, $b, $e_opacity);
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<templates id="template" xml:space="preserve">
<t t-extend="Menu">
<t t-jquery=".o_main_navbar" t-operation="after">
<div class="sidebar_panel" id="sidebar_panel"/>
</t>
</t>
<t t-name="idg_theme.Sidebar">
<div class="sidebar">
<div class="sidebar_close">
<a id="closeSidebar" style="cursor: pointer;">
<img src="/idg_theme/static/src/img/icons/close.png"/>
</a>
</div>
<!-- <div class="sidebar_logo">-->
<!-- <img src="/web/binary/company_logo" class="logo_img"/>-->
<!-- </div>-->
<span class="sidebar_title">
Menu
</span>
<ul class="sidebar_menu">
<t t-foreach="widget.getApps()" t-as="app">
<li data-toggle="tooltip" data-placement="right" t-att-title="app.name">
<a role="menuitem" t-attf-href="#menu_id=#{app.menuID}"
class="nav-link" t-att-data-menu-id="app.menuID"
t-att-data-menu-xmlid="app.xmlID"
t-att-data-action-id="app.actionID">
<img class="sidebar_img"
t-attf-src="data:image/svg;base64,#{app.web_icon_data}"/>
</a>
</li>
</t>
</ul>
</div>
</t>
</templates>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<templates id="template" xml:space="preserve">
<!--Align Invite Button in Settings-->
<t t-inherit="base_setup.res_config_invite_users" t-inherit-mode="extension" owl="1">
<xpath expr="//div[hasclass('d-flex')]" position="attributes">
<attribute name="class">d-flex align-items-center</attribute>
</xpath>
</t>
<!--Remove App Icon in Settings-->
<t t-inherit="web.BaseSetting.Tabs" t-inherit-mode="extension" owl="1">
<xpath expr="//div[hasclass('tab')]" position="replace">
<div class="tab" t-attf-data-key="#{tab.key}" role="tab">
<span class="app_name"><t t-esc="tab.string"/></span>
</div>
</xpath>
</t>
<!--Active Color for App Counter-->
<t t-inherit="web.SearchPanel.Category" t-inherit-mode="extension" owl="1">
<xpath expr="//span[hasclass('o_search_panel_counter')]" position="attributes">
<attribute name="class">o_search_panel_counter ml-2 small</attribute>
</xpath>
</t>
</templates>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<templates>
<t t-name="theme_systray">
<li class="new_icon">
<label class="theme_sdn" style="margin-bottom:0px;" title="Change backend theme">
<t t-if="widget.is_admin">
<div class="icon_div sdn_systray_icon" groups="base.group_system">
<div class="toggle-icon"
style="font-size: 1.9rem !important; margin: auto 11px !important;">
<i id='theme_sdn' class="fa fa-paint-brush" role="img" aria-label="Theme"/>
</div>
</div>
</t>
</label>
</li>
</t>
</templates>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<templates id="template" xml:space="preserve">
<t t-inherit="web.Menu" t-inherit-mode="extension" owl="1">
<xpath expr="//nav[hasclass('o_main_navbar')]" position="replace">
<nav class="o_main_navbar">
<div class="c_navbar_container">
<div class="top_heading d-flex align-items-center">
<ul class="o_menu_apps"/>
<a class="o_menu_brand" role="button"/>
<!-- Current App Sections -->
<div class="d-none d-md-block">
<ul class="o_menu_sections mb-0 pl-4" role="menu"/>
</div>
</div>
<div class="d-flex justify-content-between c_responsive_tray">
<ul class="o_menu_systray topbar_icon" role="menu"/>
</div>
</div>
</nav>
</xpath>
</t>
<t t-inherit="web.AppsMenu" t-inherit-mode="extension" owl="1">
<xpath expr="//li[hasclass('dropdown')]" position="replace">
<li class="dropdown">
<a id="triggerSidebar" class="c_sidebar_active" style="display: block; cursor: pointer;">
<!-- <i class="fa fa-th-large fa-lg"/> -->
<div id="dotsMenuContainer" class="c_dots_menu"/>
</a>
</li>
</xpath>
</t>
<t t-inherit="web.UserMenu" t-inherit-mode="extension" owl="1">
<xpath expr="//span[hasclass('oe_topbar_name')]" position="replace">
<div class="oe_topbar_name"/>
</xpath>
</t>
<t t-inherit="mail.MessagingMenu" t-inherit-mode="extension" owl="1">
<xpath expr="//i[hasclass('o_MessagingMenu_icon')]" position="replace">
<img src="/idg_theme/static/src/img/icons/speech-bubble.png" width="22" height="22" aria-label="Messages"/>
</xpath>
</t>
<t t-inherit="mail.systray.ActivityMenu" t-inherit-mode="extension" owl="1">
<xpath expr="//i[hasclass('fa-clock-o')]" position="replace">
<img src="/idg_theme/static/src/img/icons/bell.png" width="22" height="22" aria-label="Activities"/>
</xpath>
</t>
</templates>
\ No newline at end of file \ No newline at end of file
<odoo>
<data>
<template id="idg_theme_assets" name="SDN Theme Assets" inherit_id="web.assets_backend">
<xpath expr=".">
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;600&amp;display=swap" rel="stylesheet"/>
<link href="https://fonts.googleapis.com/css2?family=Nunito:wght@300;400;600&amp;display=swap" rel="stylesheet"/>
<link rel="stylesheet" href="/idg_theme/static/src/scss/theme_accent.scss"/>
<link rel="stylesheet" href="/idg_theme/static/src/scss/datetimepicker.scss"/>
<link rel="stylesheet" href="/idg_theme/static/src/scss/theme.scss"/>
<link rel="stylesheet" href="/idg_theme/static/src/scss/sidebar.scss"/>
<script type="application/javascript" src="/idg_theme/static/src/js/chrome/sidebar.js"/>
<script type="application/javascript" src="/idg_theme/static/src/js/chrome/sidebar_menu.js"/>
<!-- <script type="application/javascript" src="/idg_theme/static/src/js/systray.js"/> -->
<!-- <script type="application/javascript" src="/idg_theme/static/src/js/load.js"/> -->
</xpath>
</template>
<template id="idg_theme_assets_frontend" inherit_id="web.assets_frontend">
<xpath expr="//link[last()]" position="after">
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;600&amp;display=swap" rel="stylesheet"/>
<link href="https://fonts.googleapis.com/css2?family=Nunito:wght@300;400;600&amp;display=swap" rel="stylesheet"/>
<link rel="stylesheet" href="/idg_theme/static/src/scss/theme_accent.scss"/>
<link rel="stylesheet" href="/idg_theme/static/src/scss/login.scss"/>
</xpath>
</template>
</data>
</odoo>
<odoo>
<data>
<template>
<t t-name="DashBoard.action">
<div t-att-data-id="action.attrs.id" class="oe_action">
<h2 t-attf-class="oe_header #{action.attrs.string ? '' : 'oe_header_empty'}">
<span class="oe_header_txt"> <t t-esc="action.attrs.string"/> </span>
<input class = "oe_header_text" type="text"/>
<t t-if="!action.attrs.string">&amp;nbsp;</t>
<span class='oe_icon oe_minimize oe_fold' t-if="!action.attrs.fold"></span>
<span class='oe_icon oe_maximize oe_fold' t-if="action.attrs.fold"></span>
</h2>
<div t-att-class="'oe_content' + (action.attrs.fold ? ' oe_folded' : '')"/>
</div>
</t>
<t t-name="DashBoard.NoContent">
<div class="o_view_nocontent">
<div class="o_nocontent_help">
<p class="o_view_nocontent_neutral_face">
Your personal dashboard is empty
</p><p>
To add your first report into this dashboard, go to any
menu, switch to list or graph view, and click <i>"Add to
Dashboard"</i> in the extended search options.
</p><p>
You can filter and group data before inserting into the
dashboard using the search options.
</p>
</div>
</div>
</t>
</template>
</data>
</odoo>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<data>
<menuitem id="base.menu_administration" name="Settings"
web_icon="idg_theme,static/src/img/icons/settinga.png"/>
<menuitem id="base.menu_management" name="Apps" web_icon="idg_theme,static/src/img/icons/apps.png"/>
<menuitem id="mail.menu_root_discuss" name="Discuss"
web_icon="idg_theme,static/src/img/icons/discuss.png"/>
</data>
</odoo>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<template id="code_custom_layout" inherit_id="web.layout"
name="Custom Layout">
<xpath expr="//meta[@content='IE=edge,chrome=1']" position="after">
<meta name="viewport"
content="width=device-width, initial-scale=1, user-scalable=no"/>
</xpath>
</template>
<template id="code_custom_login" inherit_id="web.login"
name="Custom Layout">
<xpath expr="//t[@t-call='web.login_layout']" position="replace">
<t t-call="web.login_layout">
<form class="oe_login_form" role="form"
t-attf-action="/web/login" method="post"
onsubmit="this.action = '/web/login' + location.hash">
<input type="hidden" name="csrf_token"
t-att-value="request.csrf_token()"/>
<div class="form-group field-db"
t-if="databases and len(databases) &gt; 1">
<label for="db" class="col-form-label">Database</label>
<div t-attf-class="input-group {{'input-group-sm' if form_small else ''}}">
<input type="text" name="db"
t-att-value="request.db" id="db"
t-attf-class="form-control #{'form-control-sm' if form_small else ''}"
required="required" readonly="readonly"/>
<span class="input-group-append">
<a role="button" href="/web/database/selector"
class="btn btn-secondary">Select
<i class="fa fa-database" role="img"
aria-label="Database"
title="Database"></i>
</a>
</span>
</div>
</div>
<div class="form-group field-login">
<label class="sr-only" for="login">Email</label>
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text">
<i class="fa fa-envelope"></i>
</div>
</div>
<input type="text" placeholder="Email" name="login"
t-att-value="login" id="login"
t-attf-class="form-control border-left-0 #{'form-control-sm' if form_small else ''}"
required="required" autofocus="autofocus"
autocapitalize="off"/>
</div>
</div>
<div class="form-group field-password">
<label for="password" class="sr-only">Password</label>
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text">
<i class="fa fa-asterisk"></i>
</div>
</div>
<input type="password" placeholder="Password"
name="password" id="password"
t-attf-class="form-control border-left-0 #{'form-control-sm' if form_small else ''}"
required="required"
autocomplete="current-password"
t-att-autofocus="'autofocus' if login else None"
maxlength="4096"/>
</div>
</div>
<p class="alert alert-danger" t-if="error" role="alert">
<t t-esc="error"/>
</p>
<p class="alert alert-success" t-if="message" role="status">
<t t-esc="message"/>
</p>
<div t-attf-class="clearfix oe_login_buttons text-center mb-1 {{'pt-2' if form_small else 'pt-3'}}">
<button type="submit" class="btn btn-primary btn-block">
Log in
</button>
<t t-if="debug">
<button type="submit" name="redirect"
value="/web/become"
class="btn btn-link btn-sm btn-block">Log in
as superuser
</button>
</t>
<div class="o_login_auth"/>
</div>
<input type="hidden" name="redirect"
t-att-value="redirect"/>
</form>
</t>
</xpath>
</template>
</odoo>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="idg_theme_data" model="ir.ui.view">
<field name="name">them.data.form</field>
<field name="model">theme.data</field>
<field name="arch" type="xml">
<form create="0">
<footer>
<button name="action_apply" id="jsxj" type="object" string="Apply" class="btn btn-primary"/>
</footer>
<sheet>
<group>
<group>
<field name="name"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
</odoo>
\ No newline at end of file \ No newline at end of file
from . import theme
# -*- coding: utf-8 -*-
import base64
from odoo import models, fields, api
from odoo.modules import get_module_resource
class Theme(models.TransientModel):
_name = "theme.data"
def _get_current_theme(self):
return self.env['theme.data.stored'].sudo().search([], limit=1).name
name = fields.Selection([
('default', 'Default'),
('two', 'Green'),
('three', 'Black'),
], 'Theme', required=True, default=_get_current_theme)
@api.onchange('name')
def onchange_name(self):
theme = self.sudo().env.ref('idg_theme.theme_data_stored')
if theme:
theme.name = self.name
else:
theme.create({
'name': self.name
})
def action_apply(self):
name = self.env['theme.data.stored'].sudo().search([], limit=1).name
if name == 'two':
link = '<link rel="stylesheet" href="/idg_theme/static/src/scss/theme_two.scss"/>'
self.icon_change_theme_green()
elif name == 'three':
link = '<link rel="stylesheet" href="/idg_theme/static/src/scss/theme_three.scss"/>'
self.icon_change_theme_default()
else:
link = '<link rel="stylesheet" href="/idg_theme/static/src/scss/theme_accent.scss"/>'
self.icon_change_theme_default()
theme = self.sudo().env.ref('idg_theme.idg_theme_assets')
login = self.sudo().env.ref(
'idg_theme.idg_theme_assets_frontend')
theme.arch_base = '''
<data name="SDN Theme Assets" inherit_id="web.assets_backend">
<xpath expr=".">
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;600&amp;display=swap" rel="stylesheet"/>
<link href="https://fonts.googleapis.com/css2?family=Nunito:wght@300;400;600&amp;display=swap" rel="stylesheet"/>
%s
<link rel="stylesheet" href="/idg_theme/static/src/scss/datetimepicker.scss"/>
<link rel="stylesheet" href="/idg_theme/static/src/scss/theme.scss"/>
<link rel="stylesheet" href="/idg_theme/static/src/scss/sidebar.scss"/>
<script type="application/javascript" src="/idg_theme/static/src/js/chrome/sidebar.js"/>
<script type="application/javascript" src="/idg_theme/static/src/js/chrome/sidebar_menu.js"/>
<script type="application/javascript" src="/idg_theme/static/src/js/systray.js"/>
<script type="application/javascript" src="/idg_theme/static/src/js/load.js"/>
</xpath>
</data>
''' % link
login.arch_base = '''
<data name="idg_theme_assets_frontend" inherit_id="web.assets_backend">
<xpath expr=".">
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;600&amp;display=swap" rel="stylesheet"/>
<link href="https://fonts.googleapis.com/css2?family=Nunito:wght@300;400;600&amp;display=swap" rel="stylesheet"/>
%s
<link rel="stylesheet" href="/idg_theme/static/src/scss/login.scss"/>
</xpath>
</data>
''' % link
return {
'type': 'ir.actions.client',
'tag': 'reload',
}
def icon_change_theme_default(self):
menu_item = self.env['ir.ui.menu'].sudo().search([('parent_id', '=', False)])
for menu in menu_item:
if menu.name == 'PDL Kab/Kota':
img_path = get_module_resource(
'idg_theme', 'static', 'src', 'img', 'icons',
'idg_pdl.png')
menu.write({'web_icon_data': base64.b64encode(
open(img_path, "rb").read())})
if menu.name == 'BPHTB':
img_path = get_module_resource(
'idg_theme', 'static', 'src', 'img', 'icons',
'idg_bphtb.png')
menu.write({'web_icon_data': base64.b64encode(
open(img_path, "rb").read())})
if menu.name == 'IDG Account':
img_path = get_module_resource(
'idg_theme', 'static', 'src', 'img', 'icons',
'idg_account.png')
menu.write({'web_icon_data': base64.b64encode(
open(img_path, "rb").read())})
if menu.name == 'ID Dashboard':
img_path = get_module_resource(
'idg_theme', 'static', 'src', 'img', 'icons',
'idg_board.png')
menu.write({'web_icon_data': base64.b64encode(
open(img_path, "rb").read())})
def icon_change_theme_green(self):
menu_item = self.env['ir.ui.menu'].sudo().search([('parent_id', '=', False)])
for menu in menu_item:
if menu.name == 'PDL Kab/Kota':
img_path = get_module_resource(
'idg_theme', 'static', 'src', 'img',
'icons_light',
'idg_pdl.png')
menu.write({'web_icon_data': base64.b64encode(
open(img_path, "rb").read())})
if menu.name == 'BPHTB':
img_path = get_module_resource(
'idg_theme', 'static', 'src', 'img',
'icons_light',
'idg_bphtb.png')
menu.write({'web_icon_data': base64.b64encode(
open(img_path, "rb").read())})
if menu.name == 'IDG Account':
img_path = get_module_resource(
'idg_theme', 'static', 'src', 'img',
'icons_light',
'idg_account.png')
menu.write({'web_icon_data': base64.b64encode(
open(img_path, "rb").read())})
if menu.name == 'ID Dashboard':
img_path = get_module_resource(
'idg_theme', 'static', 'src', 'img',
'icons_light',
'idg_board.png')
menu.write({'web_icon_data': base64.b64encode(
open(img_path, "rb").read())})
class ThemeStored(models.Model):
_name = "theme.data.stored"
name = fields.Selection([
('default', 'Default'),
('two', 'Green'),
('three', 'Black'),
], 'Theme', default='default')
==============
Web Responsive
==============
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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/licence-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%2Fweb-lightgray.png?logo=github
:target: https://github.com/OCA/web/tree/14.0/web_responsive
:alt: OCA/web
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/web-14-0/web-14-0-web_responsive
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/162/14.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
This module adds responsiveness to web backend.
Features for all devices:
* New navigation with an app drawer
.. image:: https://user-images.githubusercontent.com/973709/48417193-09a1e080-e74a-11e8-8a0c-e73eb689b2fb.gif
* Quick menu search from the app drawer
.. image:: https://user-images.githubusercontent.com/973709/48417213-17576600-e74a-11e8-846a-57691e82636b.gif
* Increase the size of the labels in extra large screens
.. image:: https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/label_size_small.png
.. image:: https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/label_size_large.png
Features for mobile:
* App-specific submenus are shown on full screen when toggling them from the
"hamburger" menu
.. image:: https://user-images.githubusercontent.com/973709/48417297-51286c80-e74a-11e8-9a47-22c810b18c43.gif
* View type picker dropdown displays confortably
.. image:: https://user-images.githubusercontent.com/973709/50964322-e3d55580-14c6-11e9-8249-48db9539600f.gif
* Top app bar is always visible, but the control panel is hidden when
scrolling down, to save some vaulable vertical space
.. image:: https://user-images.githubusercontent.com/973709/50964496-5cd4ad00-14c7-11e9-9261-fd223a329d02.gif
* Form status bar action and status buttons are collapsed in dropdowns.
Other control panel buttons use icons to save space.
.. image:: https://user-images.githubusercontent.com/973709/50965446-e08f9900-14c9-11e9-92d6-dda472cb6557.gif
* Breadcrumbs navigation is collapsed with a "back arrow" button.
.. image:: https://user-images.githubusercontent.com/973709/50965168-1d0ec500-14c9-11e9-82a0-dfee82ed0861.gif
* Search panel is hidden on small screens.
.. image:: https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/search_panel.gif
Features for computers:
* Keyboard shortcuts for easier navigation, **using ``Alt + Shift + [key]``**
combination instead of just ``Alt + [key]``.
See https://github.com/odoo/odoo/issues/30068 to understand why.
.. image:: https://user-images.githubusercontent.com/973709/48417578-ff341680-e74a-11e8-8881-017709e912bc.png
* Autofocus on search menu box when opening the drawer
.. image:: https://user-images.githubusercontent.com/973709/48417213-17576600-e74a-11e8-846a-57691e82636b.gif
* Set chatter on the side of the screen, optional per user
.. image:: https://user-images.githubusercontent.com/973709/48417270-41108d00-e74a-11e8-9172-cba825d027ed.gif
* Full width form sheets
.. image:: https://user-images.githubusercontent.com/973709/48417428-ac5a5f00-e74a-11e8-8839-5bc538c54c1d.png
* Sticky chatter topbar
.. image:: https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/chatter_topbar.gif
* AppMenu waits for action finished to show the view
.. image:: https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/appmenu.gif
* Sticky header & footer in list view
.. image:: https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/listview.gif
* Sticky statusbar in form view
.. image:: https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/formview.gif
* Followers and send button is displayed on mobile. Avatar is hidden.
.. image:: https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/chatter.gif
* When the chatter is configured on the side part, the document viewer fills that
part for side-by-side reading instead of full screen. You can still put it on full
width preview clicking on the new maximize button.
.. image:: https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/document_viewer.gif
* Bigger checkboxes in list view
.. image:: https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/big_checkboxes.gif
* Scrollable dropdowns
.. image:: https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/dropdown_scroll.gif
**Table of contents**
.. contents::
:local:
Usage
=====
The following keyboard shortcuts are implemented:
* Navigate app search results - Arrow keys
* Choose app result - ``Enter``
* ``Esc`` to close app drawer
Known issues / Roadmap
======================
* To view the full experience in a device, the page must be loaded with the
device screen size. This means that, if you change the size of your browser,
you should reload the web client to get the full experience for that
new size. This is Odoo's own limitation.
* App navigation with keyboard.
* Handle long titles on forms in a better way
* Standard sticky headers seems to not work properly on iOS Safari/Chrome (see #1626).
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/web/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
`feedback <https://github.com/OCA/web/issues/new?body=module:%20web_responsive%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* LasLabs
* Tecnativa
Contributors
~~~~~~~~~~~~
* Dave Lasley <dave@laslabs.com>
* Jairo Llopis <jairo.llopis@tecnativa.com>
* Dennis Sluijk <d.sluijk@onestein.nl>
* Sergio Teruel <sergio.teruel@tecnativa.com>
* Alexandre Díaz <dev@redneboa.es>
* Mathias Markl <mathias.markl@mukit.at>
* Iván Todorovich <ivan.todorovich@gmail.com>
* Sergey Shebanin <sergey@shebanin.ru>
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
.. |maintainer-Tardo| image:: https://github.com/Tardo.png?size=40px
:target: https://github.com/Tardo
:alt: Tardo
Current `maintainers <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-Yajo| |maintainer-Tardo|
This module is part of the `OCA/web <https://github.com/OCA/web/tree/14.0/web_responsive>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
from . import models
# Copyright 2016-2017 LasLabs Inc.
# Copyright 2017-2018 Tecnativa - Jairo Llopis
# Copyright 2018-2019 Tecnativa - Alexandre Díaz
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
{
"name": "Web Responsive",
"summary": "Responsive web client, community-supported",
"version": "14.0.1.2.0",
"category": "Website",
"website": "https://github.com/OCA/web",
"author": "LasLabs, Tecnativa, " "Odoo Community Association (OCA)",
"license": "LGPL-3",
"installable": True,
"depends": ["web", "mail"],
"development_status": "Production/Stable",
"maintainers": ["Yajo", "Tardo"],
"data": ["views/assets.xml", "views/res_users.xml", "views/web.xml"],
"qweb": [
"static/src/xml/apps.xml",
"static/src/xml/form_buttons.xml",
"static/src/xml/menu.xml",
"static/src/xml/navbar.xml",
"static/src/xml/attachment_viewer.xml",
"static/src/xml/discuss.xml",
"static/src/xml/control_panel.xml",
"static/src/xml/search_panel.xml",
],
"sequence": 1,
}
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_responsive
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2020-11-07 15:08+0000\n"
"Last-Translator: Waleed Mohsen <Mohsen.Waleed@gmail.com>\n"
"Language-Team: none\n"
"Language: ar\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
"X-Generator: Weblate 3.10\n"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#, python-format
msgid "#menu_id=#{app.menuID}&action_id=#{app.actionID}"
msgstr "#menu_id=#{app.menuID}&action_id=#{app.actionID}"
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users__chatter_position
msgid "Chatter Position"
msgstr "موقع الدردشة"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Close"
msgstr "إغلاق"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Create"
msgstr "إنشاء"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Discard"
msgstr "تجاهل"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Edit"
msgstr "تعديل"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Maximize"
msgstr "تكبير"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Minimize"
msgstr "تصغير"
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__normal
msgid "Normal"
msgstr "عادي"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Quick actions"
msgstr "اجراءات سريعة"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Save"
msgstr "حفظ"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#, python-format
msgid "Search menus..."
msgstr "بحث في القوائم..."
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/menu.xml:0
#, python-format
msgid "Shift"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__sided
msgid "Sided"
msgstr "جانبي"
#. module: web_responsive
#: model:ir.model,name:web_responsive.model_res_users
msgid "Users"
msgstr "المستخدمون"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/discuss.xml:0
#, python-format
msgid ""
"btn btn-secondary o_mail_discuss_button_multi_user_channel d-md-block d-none"
msgstr ""
"btn btn-secondary o_mail_discuss_button_multi_user_channel d-md-block d-none"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "false"
msgstr "false"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer"
msgstr ""
"modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer"
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_responsive
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2020-02-02 22:13+0000\n"
"Last-Translator: eduardgm <eduard.garcia@qubiq.es>\n"
"Language-Team: none\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.10\n"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#, python-format
msgid "#menu_id=#{app.menuID}&action_id=#{app.actionID}"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users__chatter_position
msgid "Chatter Position"
msgstr "Posició del chatter"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Close"
msgstr "Tancar"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Create"
msgstr "Crear"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Discard"
msgstr "Descartar"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Edit"
msgstr "Editar"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Maximize"
msgstr "Maximitzar"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Minimize"
msgstr "Minimitzar"
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__normal
msgid "Normal"
msgstr "Normal"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Quick actions"
msgstr "Accions ràpides"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Save"
msgstr "Guardar"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#, python-format
msgid "Search menus..."
msgstr "Cercar menús..."
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/menu.xml:0
#, python-format
msgid "Shift"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__sided
msgid "Sided"
msgstr "Lateral"
#. module: web_responsive
#: model:ir.model,name:web_responsive.model_res_users
msgid "Users"
msgstr "Usuaris"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/discuss.xml:0
#, python-format
msgid ""
"btn btn-secondary o_mail_discuss_button_multi_user_channel d-md-block d-none"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "false"
msgstr "fals"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer"
msgstr ""
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_responsive
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2018-09-02 05:11+0000\n"
"Last-Translator: Hans Henrik Gabelgaard <hhg@gabelgaard.org>\n"
"Language-Team: none\n"
"Language: da\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.1.1\n"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#, python-format
msgid "#menu_id=#{app.menuID}&action_id=#{app.actionID}"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users__chatter_position
msgid "Chatter Position"
msgstr "Log position"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Close"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Create"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Discard"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Edit"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Maximize"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Minimize"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__normal
msgid "Normal"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Quick actions"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Save"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#, python-format
msgid "Search menus..."
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/menu.xml:0
#, python-format
msgid "Shift"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__sided
msgid "Sided"
msgstr "Side"
#. module: web_responsive
#: model:ir.model,name:web_responsive.model_res_users
msgid "Users"
msgstr "Brugere"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/discuss.xml:0
#, python-format
msgid ""
"btn btn-secondary o_mail_discuss_button_multi_user_channel d-md-block d-none"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "false"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer"
msgstr ""
#~ msgid "<span class=\"sr-only\">Toggle App Drawer</span>"
#~ msgstr "<span class=\"sr-only\">Skift App skuffe</span>"
#~ msgid "<span class=\"sr-only\">Toggle Navigation</span>"
#~ msgstr "<span class=\"sr-only\">Skift navigation</span>"
#~ msgid "Apps"
#~ msgstr "Applikationer"
#~ msgid "More"
#~ msgstr "Mere"
#~ msgid "More <b class=\"caret\"/>"
#~ msgstr "Mere <b class=\"caret\"/>"
#~ msgid "Task"
#~ msgstr "Opgave"
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_responsive
#
# Translators:
# Niki Waibel <niki.waibel@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-03 01:37+0000\n"
"PO-Revision-Date: 2021-02-18 15:45+0000\n"
"Last-Translator: Janik Vonrotz <janikvonrotz@gmail.com>\n"
"Language-Team: German (https://www.transifex.com/oca/teams/23907/de/)\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#, python-format
msgid "#menu_id=#{app.menuID}&action_id=#{app.actionID}"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users__chatter_position
msgid "Chatter Position"
msgstr "Chatter-Position"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Close"
msgstr "Schließen"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Create"
msgstr "Erstellen"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Discard"
msgstr "Verwerfen"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Edit"
msgstr "Ändern"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Maximize"
msgstr "maximieren"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Minimize"
msgstr "minimieren"
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__normal
msgid "Normal"
msgstr "normal"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Quick actions"
msgstr "Schnell-Aktion"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Save"
msgstr "Speichern"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#, python-format
msgid "Search menus..."
msgstr "Such-Menü"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/menu.xml:0
#, python-format
msgid "Shift"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__sided
msgid "Sided"
msgstr "Seitlich"
#. module: web_responsive
#: model:ir.model,name:web_responsive.model_res_users
msgid "Users"
msgstr "Benutzer"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/discuss.xml:0
#, python-format
msgid ""
"btn btn-secondary o_mail_discuss_button_multi_user_channel d-md-block d-none"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "false"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer"
msgstr ""
#~ msgid "<span class=\"sr-only\">Toggle App Drawer</span>"
#~ msgstr "<span class=\"sr-only\">App Ordner umschalten</span>"
#~ msgid "<span class=\"sr-only\">Toggle Navigation</span>"
#~ msgstr "<span class=\"sr-only\">Navigation umschalten</span>"
#~ msgid "Apps"
#~ msgstr "Apps"
#~ msgid "More <b class=\"caret\"/>"
#~ msgstr "Mehr <b class=\"caret\"/>"
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_responsive
#
# Translators:
# Pedro M. Baeza <pedro.baeza@gmail.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-01-10 10:49+0000\n"
"PO-Revision-Date: 2021-02-17 14:45+0000\n"
"Last-Translator: claudiagn <claudia.gargallo@qubiq.es>\n"
"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#, python-format
msgid "#menu_id=#{app.menuID}&action_id=#{app.actionID}"
msgstr "#menu_id=#{app.menuID}&action_id=#{app.actionID}"
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users__chatter_position
msgid "Chatter Position"
msgstr "Posición del chatter"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Close"
msgstr "Cerrar"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Create"
msgstr "Crear"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Discard"
msgstr "Descartar"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Edit"
msgstr "Editar"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Maximize"
msgstr "Maximizar"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Minimize"
msgstr "Minimizar"
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__normal
msgid "Normal"
msgstr "Normal"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Quick actions"
msgstr "Acciones rápidas"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Save"
msgstr "Guardar"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#, python-format
msgid "Search menus..."
msgstr "Buscar menús..."
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/menu.xml:0
#, python-format
msgid "Shift"
msgstr "Turno"
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__sided
msgid "Sided"
msgstr "Lateral"
#. module: web_responsive
#: model:ir.model,name:web_responsive.model_res_users
msgid "Users"
msgstr "Usuarios"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/discuss.xml:0
#, python-format
msgid ""
"btn btn-secondary o_mail_discuss_button_multi_user_channel d-md-block d-none"
msgstr ""
"btn btn-secondary o_mail_discuss_button_multi_user_channel d-md-block d-none"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "false"
msgstr "falso"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer"
msgstr "modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer"
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_responsive
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2021-09-23 07:34+0000\n"
"Last-Translator: Saeed Raeisi <saeed.raesi2020@gmail.com>\n"
"Language-Team: none\n"
"Language: fa\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/search_panel.xml:0
#, python-format
msgid "All"
msgstr "همه"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/control_panel.xml:0
#, python-format
msgid "CLEAR"
msgstr "پاک کردن"
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users__chatter_position
msgid "Chatter Position"
msgstr "موقعیت چت باکس"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#, python-format
msgid "Create"
msgstr "ایجاد"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#, python-format
msgid "Discard"
msgstr "لغو"
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users__display_name
msgid "Display Name"
msgstr "نام نمایشی"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#, python-format
msgid "Edit"
msgstr "ویرایش"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/control_panel.xml:0
#: code:addons/web_responsive/static/src/xml/search_panel.xml:0
#, python-format
msgid "FILTER"
msgstr "فیلتر"
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users__id
msgid "ID"
msgstr "شناسه"
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users____last_update
msgid "Last Modified on"
msgstr "آخرین ویرایش در"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/attachment_viewer.xml:0
#: code:addons/web_responsive/static/src/xml/attachment_viewer.xml:0
#, python-format
msgid "Maximize"
msgstr "بزرگ کردن"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/attachment_viewer.xml:0
#: code:addons/web_responsive/static/src/xml/attachment_viewer.xml:0
#, python-format
msgid "Minimize"
msgstr "کوچک کردن"
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__normal
msgid "Normal"
msgstr "عادی"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#, python-format
msgid "Quick actions"
msgstr "اقدامات سریع"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/control_panel.xml:0
#: code:addons/web_responsive/static/src/xml/search_panel.xml:0
#, python-format
msgid "SEE RESULT"
msgstr "مشاهده نتیجه"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#, python-format
msgid "Save"
msgstr "ذخیره"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#, python-format
msgid "Search menus..."
msgstr "جستجو در منو..."
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/control_panel.xml:0
#: code:addons/web_responsive/static/src/xml/control_panel.xml:0
#, python-format
msgid "Search..."
msgstr "جستجو..."
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/menu.xml:0
#, python-format
msgid "Shift"
msgstr "شیفت"
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__sided
msgid "Sided"
msgstr "طرف"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#, python-format
msgid "Today"
msgstr "امروز"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/js/kanban_renderer_mobile.js:0
#, python-format
msgid "Undefined"
msgstr "تعریف نشده"
#. module: web_responsive
#: model:ir.model,name:web_responsive.model_res_users
msgid "Users"
msgstr "کاربران"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/control_panel.xml:0
#, python-format
msgid "View switcher"
msgstr "تعویض کننده نما"
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_responsive
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: fa_IR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/search_panel.xml:0
#, python-format
msgid "All"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/control_panel.xml:0
#, python-format
msgid "CLEAR"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users__chatter_position
msgid "Chatter Position"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#, python-format
msgid "Create"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#, python-format
msgid "Discard"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users__display_name
msgid "Display Name"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#, python-format
msgid "Edit"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/control_panel.xml:0
#: code:addons/web_responsive/static/src/xml/search_panel.xml:0
#, python-format
msgid "FILTER"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users__id
msgid "ID"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users____last_update
msgid "Last Modified on"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/attachment_viewer.xml:0
#: code:addons/web_responsive/static/src/xml/attachment_viewer.xml:0
#, python-format
msgid "Maximize"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/attachment_viewer.xml:0
#: code:addons/web_responsive/static/src/xml/attachment_viewer.xml:0
#, python-format
msgid "Minimize"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__normal
msgid "Normal"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#, python-format
msgid "Quick actions"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/control_panel.xml:0
#: code:addons/web_responsive/static/src/xml/search_panel.xml:0
#, python-format
msgid "SEE RESULT"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#, python-format
msgid "Save"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#, python-format
msgid "Search menus..."
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/control_panel.xml:0
#: code:addons/web_responsive/static/src/xml/control_panel.xml:0
#, python-format
msgid "Search..."
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/menu.xml:0
#, python-format
msgid "Shift"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__sided
msgid "Sided"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#, python-format
msgid "Today"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/js/kanban_renderer_mobile.js:0
#, python-format
msgid "Undefined"
msgstr ""
#. module: web_responsive
#: model:ir.model,name:web_responsive.model_res_users
msgid "Users"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/control_panel.xml:0
#, python-format
msgid "View switcher"
msgstr ""
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_responsive
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2021-09-25 08:34+0000\n"
"Last-Translator: Rémi <remi@le-filament.com>\n"
"Language-Team: none\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#, python-format
msgid "#menu_id=#{app.menuID}&action_id=#{app.actionID}"
msgstr "#menu_id=#{app.menuID}&action_id=#{app.actionID}"
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users__chatter_position
msgid "Chatter Position"
msgstr "Position du Chatter"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Close"
msgstr "Fermer"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Create"
msgstr "Créer"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Discard"
msgstr "Annuler"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Edit"
msgstr "Modifier"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Maximize"
msgstr "Maximiser"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Minimize"
msgstr "Minimiser"
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__normal
msgid "Normal"
msgstr "Normal"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Quick actions"
msgstr "Actions rapides"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Save"
msgstr "Sauvegarder"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#, python-format
msgid "Search menus..."
msgstr "Rechercher dans les menus..."
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/menu.xml:0
#, fuzzy, python-format
msgid "Shift"
msgstr "Shift"
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__sided
msgid "Sided"
msgstr "À coté"
#. module: web_responsive
#: model:ir.model,name:web_responsive.model_res_users
msgid "Users"
msgstr "Utilisateurs"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/discuss.xml:0
#, python-format
msgid ""
"btn btn-secondary o_mail_discuss_button_multi_user_channel d-md-block d-none"
msgstr ""
"btn btn-secondary o_mail_discuss_button_multi_user_channel d-md-block d-none"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, fuzzy, python-format
msgid "false"
msgstr "false"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer"
msgstr "modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer"
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_responsive
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2021-04-11 18:46+0000\n"
"Last-Translator: Yves Le Doeuff <yld@alliasys.fr>\n"
"Language-Team: none\n"
"Language: fr_FR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/search_panel.xml:0
#, python-format
msgid "All"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/control_panel.xml:0
#, python-format
msgid "CLEAR"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users__chatter_position
msgid "Chatter Position"
msgstr "Position du Chatter"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#, python-format
msgid "Create"
msgstr "Créer"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#, python-format
msgid "Discard"
msgstr "Annuler"
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users__display_name
msgid "Display Name"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#, python-format
msgid "Edit"
msgstr "Editer"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/control_panel.xml:0
#: code:addons/web_responsive/static/src/xml/search_panel.xml:0
#, python-format
msgid "FILTER"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users__id
msgid "ID"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users____last_update
msgid "Last Modified on"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/attachment_viewer.xml:0
#: code:addons/web_responsive/static/src/xml/attachment_viewer.xml:0
#, python-format
msgid "Maximize"
msgstr "Maximiser"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/attachment_viewer.xml:0
#: code:addons/web_responsive/static/src/xml/attachment_viewer.xml:0
#, python-format
msgid "Minimize"
msgstr "Minimiser"
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__normal
msgid "Normal"
msgstr "Normal"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#, python-format
msgid "Quick actions"
msgstr "Actions rapides"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/control_panel.xml:0
#: code:addons/web_responsive/static/src/xml/search_panel.xml:0
#, python-format
msgid "SEE RESULT"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#, python-format
msgid "Save"
msgstr "Sauvegarder"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#, python-format
msgid "Search menus..."
msgstr "Rechercher dans les menus..."
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/control_panel.xml:0
#: code:addons/web_responsive/static/src/xml/control_panel.xml:0
#, python-format
msgid "Search..."
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/menu.xml:0
#, python-format
msgid "Shift"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__sided
msgid "Sided"
msgstr "À coté"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#, python-format
msgid "Today"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/js/kanban_renderer_mobile.js:0
#, python-format
msgid "Undefined"
msgstr ""
#. module: web_responsive
#: model:ir.model,name:web_responsive.model_res_users
msgid "Users"
msgstr "Utilisateurs"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/control_panel.xml:0
#, python-format
msgid "View switcher"
msgstr ""
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_responsive
#
# Translators:
# Bole <bole@dajmi5.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-04-28 18:03+0000\n"
"PO-Revision-Date: 2017-04-28 18:03+0000\n"
"Last-Translator: Bole <bole@dajmi5.com>, 2017\n"
"Language-Team: Croatian (https://www.transifex.com/oca/teams/23907/hr/)\n"
"Language: hr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#, python-format
msgid "#menu_id=#{app.menuID}&action_id=#{app.actionID}"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users__chatter_position
msgid "Chatter Position"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Close"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Create"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Discard"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Edit"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Maximize"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Minimize"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__normal
msgid "Normal"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Quick actions"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Save"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#, python-format
msgid "Search menus..."
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/menu.xml:0
#, python-format
msgid "Shift"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__sided
msgid "Sided"
msgstr ""
#. module: web_responsive
#: model:ir.model,name:web_responsive.model_res_users
msgid "Users"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/discuss.xml:0
#, python-format
msgid ""
"btn btn-secondary o_mail_discuss_button_multi_user_channel d-md-block d-none"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "false"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer"
msgstr ""
#~ msgid "<span class=\"sr-only\">Toggle App Drawer</span>"
#~ msgstr "<span class=\"sr-only\">Izmjeni izbornik aplikacije</span>"
#~ msgid "<span class=\"sr-only\">Toggle Navigation</span>"
#~ msgstr "<span class=\"sr-only\">Izmjeni navigaciju</span>"
#~ msgid "Apps"
#~ msgstr "Apikacije"
#~ msgid "More <b class=\"caret\"/>"
#~ msgstr "Više <b class=\"caret\"/>"
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_responsive
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2021-05-17 20:47+0000\n"
"Last-Translator: Bosd <c5e2fd43-d292-4c90-9d1f-74ff3436329a@anonaddy.me>\n"
"Language-Team: none\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#, python-format
msgid "#menu_id=#{app.menuID}&action_id=#{app.actionID}"
msgstr "#menu_id=#{app.menuID}&action_id=#{app.actionID}"
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users__chatter_position
msgid "Chatter Position"
msgstr "Chatter Positie"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Close"
msgstr "Sluit"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Create"
msgstr "Aanmaken"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Discard"
msgstr "Negeren"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Edit"
msgstr "Bewerken"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Maximize"
msgstr "Maximaliseren"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Minimize"
msgstr "Minimaliseren"
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__normal
msgid "Normal"
msgstr "Normaal"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Quick actions"
msgstr "Snelle Acties"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Save"
msgstr "Opslaan"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#, python-format
msgid "Search menus..."
msgstr "Zoek menu's..."
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/menu.xml:0
#, fuzzy, python-format
msgid "Shift"
msgstr "Shift"
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__sided
msgid "Sided"
msgstr "Aan de zijkant"
#. module: web_responsive
#: model:ir.model,name:web_responsive.model_res_users
msgid "Users"
msgstr "Gebruikers"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/discuss.xml:0
#, python-format
msgid ""
"btn btn-secondary o_mail_discuss_button_multi_user_channel d-md-block d-none"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, fuzzy, python-format
msgid "false"
msgstr "false"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer"
msgstr ""
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_responsive
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-08-12 11:44+0000\n"
"Last-Translator: Pedro Castro Silva <pedrocs@exo.pt>\n"
"Language-Team: none\n"
"Language: pt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 3.7.1\n"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#, python-format
msgid "#menu_id=#{app.menuID}&action_id=#{app.actionID}"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users__chatter_position
msgid "Chatter Position"
msgstr "Posição do Chatter"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Close"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Create"
msgstr "Criar"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Discard"
msgstr "Descartar"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Edit"
msgstr "Editar"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Maximize"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Minimize"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__normal
msgid "Normal"
msgstr "Normal"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Quick actions"
msgstr "Ações rápidas"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Save"
msgstr "Gravar"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#, python-format
msgid "Search menus..."
msgstr "Procurar menus..."
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/menu.xml:0
#, python-format
msgid "Shift"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__sided
msgid "Sided"
msgstr "Lateralizado"
#. module: web_responsive
#: model:ir.model,name:web_responsive.model_res_users
msgid "Users"
msgstr "Utilizadores"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/discuss.xml:0
#, python-format
msgid ""
"btn btn-secondary o_mail_discuss_button_multi_user_channel d-md-block d-none"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "false"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer"
msgstr ""
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_responsive
#
# Translators:
# Rodrigo de Almeida Sottomaior Macedo <rmsolucoeseminformatic4@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-06-22 08:27+0000\n"
"PO-Revision-Date: 2020-03-21 21:13+0000\n"
"Last-Translator: Rodrigo Macedo <rmsolucoeseminformatic4@gmail.com>\n"
"Language-Team: Portuguese (Brazil) (https://www.transifex.com/oca/"
"teams/23907/pt_BR/)\n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 3.10\n"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#, python-format
msgid "#menu_id=#{app.menuID}&action_id=#{app.actionID}"
msgstr "#menu_id=#{app.menuID}&action_id=#{app.actionID}"
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users__chatter_position
msgid "Chatter Position"
msgstr "Posição do Chatter"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Close"
msgstr "Fechar"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Create"
msgstr "Criar"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Discard"
msgstr "Descartar"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Edit"
msgstr "Editar"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Maximize"
msgstr "Maximizar"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Minimize"
msgstr "Minimizar"
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__normal
msgid "Normal"
msgstr "Normal"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Quick actions"
msgstr "Ações rápidas"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Save"
msgstr "Salvar"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#, python-format
msgid "Search menus..."
msgstr "Pesquisar menus..."
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/menu.xml:0
#, python-format
msgid "Shift"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__sided
msgid "Sided"
msgstr "Frente e verso"
#. module: web_responsive
#: model:ir.model,name:web_responsive.model_res_users
msgid "Users"
msgstr "Usuários"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/discuss.xml:0
#, python-format
msgid ""
"btn btn-secondary o_mail_discuss_button_multi_user_channel d-md-block d-none"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "false"
msgstr "falso"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer"
msgstr ""
"modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer"
#~ msgid "<span class=\"sr-only\">Toggle App Drawer</span>"
#~ msgstr "<span class=\"sr-only\">Aplicativo Desenhador Alternativo</span>"
#~ msgid "<span class=\"sr-only\">Toggle Navigation</span>"
#~ msgstr "<span class=\"sr-only\">Navegação Alternativa</span>"
#~ msgid "Apps"
#~ msgstr "Aplicativos"
#~ msgid "HTTP routing"
#~ msgstr "roteamento HTTP"
#~ msgid "More <b class=\"caret\"/>"
#~ msgstr "Mais <b class=\"caret\"/>"
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_responsive
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2021-03-31 16:36+0000\n"
"Last-Translator: SplashS <sergey@shebanin.ru>\n"
"Language-Team: none\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/search_panel.xml:0
#, python-format
msgid "All"
msgstr "Все"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/control_panel.xml:0
#, python-format
msgid "CLEAR"
msgstr "Очистить"
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users__chatter_position
msgid "Chatter Position"
msgstr "Расположение Чата"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#, python-format
msgid "Create"
msgstr "Создать"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#, python-format
msgid "Discard"
msgstr "Отменить"
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users__display_name
msgid "Display Name"
msgstr "Видимое имя"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#, python-format
msgid "Edit"
msgstr "Править"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/control_panel.xml:0
#: code:addons/web_responsive/static/src/xml/search_panel.xml:0
#, python-format
msgid "FILTER"
msgstr "Фильтр"
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users__id
msgid "ID"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users____last_update
msgid "Last Modified on"
msgstr ""
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/attachment_viewer.xml:0
#: code:addons/web_responsive/static/src/xml/attachment_viewer.xml:0
#, python-format
msgid "Maximize"
msgstr "Увеличить"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/attachment_viewer.xml:0
#: code:addons/web_responsive/static/src/xml/attachment_viewer.xml:0
#, python-format
msgid "Minimize"
msgstr "Уменьшить"
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__normal
msgid "Normal"
msgstr "Снизу"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#, python-format
msgid "Quick actions"
msgstr "Действия"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/control_panel.xml:0
#: code:addons/web_responsive/static/src/xml/search_panel.xml:0
#, python-format
msgid "SEE RESULT"
msgstr "Применить"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#, python-format
msgid "Save"
msgstr "Сохранить"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#, python-format
msgid "Search menus..."
msgstr "Поиск по меню..."
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/control_panel.xml:0
#: code:addons/web_responsive/static/src/xml/control_panel.xml:0
#, python-format
msgid "Search..."
msgstr "Поиск..."
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/menu.xml:0
#, python-format
msgid "Shift"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__sided
msgid "Sided"
msgstr "Справа"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_buttons.xml:0
#, python-format
msgid "Today"
msgstr "Сегодня"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/js/kanban_renderer_mobile.js:0
#, python-format
msgid "Undefined"
msgstr "Не определено"
#. module: web_responsive
#: model:ir.model,name:web_responsive.model_res_users
msgid "Users"
msgstr "Пользователи"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/control_panel.xml:0
#, python-format
msgid "View switcher"
msgstr "Сменить вид"
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_responsive
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2020-07-08 05:19+0000\n"
"Last-Translator: 黎伟杰 <674416404@qq.com>\n"
"Language-Team: none\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 3.10\n"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#, python-format
msgid "#menu_id=#{app.menuID}&action_id=#{app.actionID}"
msgstr "#menu_id=#{app.menuID}&action_id=#{app.actionID}"
#. module: web_responsive
#: model:ir.model.fields,field_description:web_responsive.field_res_users__chatter_position
msgid "Chatter Position"
msgstr "聊天位置"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Close"
msgstr "关闭"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Create"
msgstr "创建"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Discard"
msgstr "丢弃"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Edit"
msgstr "编辑"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Maximize"
msgstr "最大化"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "Minimize"
msgstr "最小化"
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__normal
msgid "Normal"
msgstr "正常"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Quick actions"
msgstr "快捷方式"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/form_view.xml:0
#, python-format
msgid "Save"
msgstr "保存"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#, python-format
msgid "Search menus..."
msgstr "搜索菜单..."
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/menu.xml:0
#, python-format
msgid "Shift"
msgstr ""
#. module: web_responsive
#: model:ir.model.fields.selection,name:web_responsive.selection__res_users__chatter_position__sided
msgid "Sided"
msgstr "侧面"
#. module: web_responsive
#: model:ir.model,name:web_responsive.model_res_users
msgid "Users"
msgstr "用户"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/discuss.xml:0
#, python-format
msgid ""
"btn btn-secondary o_mail_discuss_button_multi_user_channel d-md-block d-none"
msgstr ""
"btn btn-secondary o_mail_discuss_button_multi_user_channel d-md-block d-none"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/apps.xml:0
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "false"
msgstr "false"
#. module: web_responsive
#. openerp-web
#: code:addons/web_responsive/static/src/xml/document_viewer.xml:0
#, python-format
msgid "modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer"
msgstr ""
"modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer"
from . import res_users
# Copyright 2018-2019 Alexandre Díaz
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class ResUsers(models.Model):
_inherit = "res.users"
chatter_position = fields.Selection(
[("normal", "Normal"), ("sided", "Sided")],
string="Chatter Position",
default="sided",
)
def __init__(self, pool, cr):
"""Override of __init__ to add access rights.
Access rights are disabled by default, but allowed on some specific
fields defined in self.SELF_{READ/WRITE}ABLE_FIELDS.
"""
super().__init__(pool, cr)
# duplicate list to avoid modifying the original reference
type(self).SELF_WRITEABLE_FIELDS = list(self.SELF_WRITEABLE_FIELDS)
type(self).SELF_WRITEABLE_FIELDS.extend(["chatter_position"])
# duplicate list to avoid modifying the original reference
type(self).SELF_READABLE_FIELDS = list(self.SELF_READABLE_FIELDS)
type(self).SELF_READABLE_FIELDS.extend(["chatter_position"])
* Dave Lasley <dave@laslabs.com>
* Jairo Llopis <jairo.llopis@tecnativa.com>
* Dennis Sluijk <d.sluijk@onestein.nl>
* Sergio Teruel <sergio.teruel@tecnativa.com>
* Alexandre Díaz <dev@redneboa.es>
* Mathias Markl <mathias.markl@mukit.at>
* Iván Todorovich <ivan.todorovich@gmail.com>
* Sergey Shebanin <sergey@shebanin.ru>
This module adds responsiveness to web backend.
Features for all devices:
* New navigation with an app drawer
.. image:: https://user-images.githubusercontent.com/973709/48417193-09a1e080-e74a-11e8-8a0c-e73eb689b2fb.gif
* Quick menu search from the app drawer
.. image:: https://user-images.githubusercontent.com/973709/48417213-17576600-e74a-11e8-846a-57691e82636b.gif
* Increase the size of the labels in extra large screens
.. image:: ../static/img/label_size_small.png
.. image:: ../static/img/label_size_large.png
Features for mobile:
* App-specific submenus are shown on full screen when toggling them from the
"hamburger" menu
.. image:: https://user-images.githubusercontent.com/973709/48417297-51286c80-e74a-11e8-9a47-22c810b18c43.gif
* View type picker dropdown displays confortably
.. image:: https://user-images.githubusercontent.com/973709/50964322-e3d55580-14c6-11e9-8249-48db9539600f.gif
* Top app bar is always visible, but the control panel is hidden when
scrolling down, to save some vaulable vertical space
.. image:: https://user-images.githubusercontent.com/973709/50964496-5cd4ad00-14c7-11e9-9261-fd223a329d02.gif
* Form status bar action and status buttons are collapsed in dropdowns.
Other control panel buttons use icons to save space.
.. image:: https://user-images.githubusercontent.com/973709/50965446-e08f9900-14c9-11e9-92d6-dda472cb6557.gif
* Breadcrumbs navigation is collapsed with a "back arrow" button.
.. image:: https://user-images.githubusercontent.com/973709/50965168-1d0ec500-14c9-11e9-82a0-dfee82ed0861.gif
* Search panel is hidden on small screens.
.. image:: ../static/img/search_panel.gif
Features for computers:
* Keyboard shortcuts for easier navigation, **using ``Alt + Shift + [key]``**
combination instead of just ``Alt + [key]``.
See https://github.com/odoo/odoo/issues/30068 to understand why.
.. image:: https://user-images.githubusercontent.com/973709/48417578-ff341680-e74a-11e8-8881-017709e912bc.png
* Autofocus on search menu box when opening the drawer
.. image:: https://user-images.githubusercontent.com/973709/48417213-17576600-e74a-11e8-846a-57691e82636b.gif
* Set chatter on the side of the screen, optional per user
.. image:: https://user-images.githubusercontent.com/973709/48417270-41108d00-e74a-11e8-9172-cba825d027ed.gif
* Full width form sheets
.. image:: https://user-images.githubusercontent.com/973709/48417428-ac5a5f00-e74a-11e8-8839-5bc538c54c1d.png
* Sticky chatter topbar
.. image:: ../static/img/chatter_topbar.gif
* AppMenu waits for action finished to show the view
.. image:: ../static/img/appmenu.gif
* Sticky header & footer in list view
.. image:: ../static/img/listview.gif
* Sticky statusbar in form view
.. image:: ../static/img/formview.gif
* Followers and send button is displayed on mobile. Avatar is hidden.
.. image:: ../static/img/chatter.gif
* When the chatter is configured on the side part, the document viewer fills that
part for side-by-side reading instead of full screen. You can still put it on full
width preview clicking on the new maximize button.
.. image:: ../static/img/document_viewer.gif
* Bigger checkboxes in list view
.. image:: ../static/img/big_checkboxes.gif
* Scrollable dropdowns
.. image:: ../static/img/dropdown_scroll.gif
* To view the full experience in a device, the page must be loaded with the
device screen size. This means that, if you change the size of your browser,
you should reload the web client to get the full experience for that
new size. This is Odoo's own limitation.
* App navigation with keyboard.
* Handle long titles on forms in a better way
* Standard sticky headers seems to not work properly on iOS Safari/Chrome (see #1626).
The following keyboard shortcuts are implemented:
* Navigate app search results - Arrow keys
* Choose app result - ``Enter``
* ``Esc`` to close app drawer
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
<title>Web Responsive</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
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, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="web-responsive">
<h1 class="title">Web Responsive</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Production/Stable" src="https://img.shields.io/badge/maturity-Production%2FStable-green.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/lgpl-3.0-standalone.html"><img alt="License: LGPL-3" src="https://img.shields.io/badge/licence-LGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/web/tree/14.0/web_responsive"><img alt="OCA/web" src="https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/web-14-0/web-14-0-web_responsive"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/162/14.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>This module adds responsiveness to web backend.</p>
<p>Features for all devices:</p>
<ul>
<li><p class="first">New navigation with an app drawer</p>
<img alt="https://user-images.githubusercontent.com/973709/48417193-09a1e080-e74a-11e8-8a0c-e73eb689b2fb.gif" src="https://user-images.githubusercontent.com/973709/48417193-09a1e080-e74a-11e8-8a0c-e73eb689b2fb.gif" />
</li>
<li><p class="first">Quick menu search from the app drawer</p>
<img alt="https://user-images.githubusercontent.com/973709/48417213-17576600-e74a-11e8-846a-57691e82636b.gif" src="https://user-images.githubusercontent.com/973709/48417213-17576600-e74a-11e8-846a-57691e82636b.gif" />
</li>
<li><p class="first">Increase the size of the labels in extra large screens</p>
<img alt="https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/label_size_small.png" src="https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/label_size_small.png" />
<img alt="https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/label_size_large.png" src="https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/label_size_large.png" />
</li>
</ul>
<p>Features for mobile:</p>
<ul>
<li><p class="first">App-specific submenus are shown on full screen when toggling them from the
“hamburger” menu</p>
<img alt="https://user-images.githubusercontent.com/973709/48417297-51286c80-e74a-11e8-9a47-22c810b18c43.gif" src="https://user-images.githubusercontent.com/973709/48417297-51286c80-e74a-11e8-9a47-22c810b18c43.gif" />
</li>
<li><p class="first">View type picker dropdown displays confortably</p>
<img alt="https://user-images.githubusercontent.com/973709/50964322-e3d55580-14c6-11e9-8249-48db9539600f.gif" src="https://user-images.githubusercontent.com/973709/50964322-e3d55580-14c6-11e9-8249-48db9539600f.gif" />
</li>
<li><p class="first">Top app bar is always visible, but the control panel is hidden when
scrolling down, to save some vaulable vertical space</p>
<img alt="https://user-images.githubusercontent.com/973709/50964496-5cd4ad00-14c7-11e9-9261-fd223a329d02.gif" src="https://user-images.githubusercontent.com/973709/50964496-5cd4ad00-14c7-11e9-9261-fd223a329d02.gif" />
</li>
<li><p class="first">Form status bar action and status buttons are collapsed in dropdowns.
Other control panel buttons use icons to save space.</p>
<img alt="https://user-images.githubusercontent.com/973709/50965446-e08f9900-14c9-11e9-92d6-dda472cb6557.gif" src="https://user-images.githubusercontent.com/973709/50965446-e08f9900-14c9-11e9-92d6-dda472cb6557.gif" />
</li>
<li><p class="first">Breadcrumbs navigation is collapsed with a “back arrow” button.</p>
<img alt="https://user-images.githubusercontent.com/973709/50965168-1d0ec500-14c9-11e9-82a0-dfee82ed0861.gif" src="https://user-images.githubusercontent.com/973709/50965168-1d0ec500-14c9-11e9-82a0-dfee82ed0861.gif" />
</li>
<li><p class="first">Search panel is hidden on small screens.</p>
<img alt="https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/search_panel.gif" src="https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/search_panel.gif" />
</li>
</ul>
<p>Features for computers:</p>
<ul>
<li><p class="first">Keyboard shortcuts for easier navigation, <strong>using ``Alt + Shift + [key]``</strong>
combination instead of just <tt class="docutils literal">Alt + [key]</tt>.
See <a class="reference external" href="https://github.com/odoo/odoo/issues/30068">https://github.com/odoo/odoo/issues/30068</a> to understand why.</p>
<img alt="https://user-images.githubusercontent.com/973709/48417578-ff341680-e74a-11e8-8881-017709e912bc.png" src="https://user-images.githubusercontent.com/973709/48417578-ff341680-e74a-11e8-8881-017709e912bc.png" />
</li>
<li><p class="first">Autofocus on search menu box when opening the drawer</p>
<img alt="https://user-images.githubusercontent.com/973709/48417213-17576600-e74a-11e8-846a-57691e82636b.gif" src="https://user-images.githubusercontent.com/973709/48417213-17576600-e74a-11e8-846a-57691e82636b.gif" />
</li>
<li><p class="first">Set chatter on the side of the screen, optional per user</p>
<img alt="https://user-images.githubusercontent.com/973709/48417270-41108d00-e74a-11e8-9172-cba825d027ed.gif" src="https://user-images.githubusercontent.com/973709/48417270-41108d00-e74a-11e8-9172-cba825d027ed.gif" />
</li>
<li><p class="first">Full width form sheets</p>
<img alt="https://user-images.githubusercontent.com/973709/48417428-ac5a5f00-e74a-11e8-8839-5bc538c54c1d.png" src="https://user-images.githubusercontent.com/973709/48417428-ac5a5f00-e74a-11e8-8839-5bc538c54c1d.png" />
</li>
<li><p class="first">Sticky chatter topbar</p>
<img alt="https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/chatter_topbar.gif" src="https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/chatter_topbar.gif" />
</li>
<li><p class="first">AppMenu waits for action finished to show the view</p>
<img alt="https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/appmenu.gif" src="https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/appmenu.gif" />
</li>
<li><p class="first">Sticky header &amp; footer in list view</p>
<img alt="https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/listview.gif" src="https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/listview.gif" />
</li>
<li><p class="first">Sticky statusbar in form view</p>
<img alt="https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/formview.gif" src="https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/formview.gif" />
</li>
<li><p class="first">Followers and send button is displayed on mobile. Avatar is hidden.</p>
<img alt="https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/chatter.gif" src="https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/chatter.gif" />
</li>
<li><p class="first">When the chatter is configured on the side part, the document viewer fills that
part for side-by-side reading instead of full screen. You can still put it on full
width preview clicking on the new maximize button.</p>
<img alt="https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/document_viewer.gif" src="https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/document_viewer.gif" />
</li>
<li><p class="first">Bigger checkboxes in list view</p>
<img alt="https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/big_checkboxes.gif" src="https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/big_checkboxes.gif" />
</li>
<li><p class="first">Scrollable dropdowns</p>
<img alt="https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/dropdown_scroll.gif" src="https://raw.githubusercontent.com/OCA/web/14.0/web_responsive/static/img/dropdown_scroll.gif" />
</li>
</ul>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#usage" id="id1">Usage</a></li>
<li><a class="reference internal" href="#known-issues-roadmap" id="id2">Known issues / Roadmap</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id3">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id4">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id5">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id6">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id7">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id1">Usage</a></h1>
<p>The following keyboard shortcuts are implemented:</p>
<ul class="simple">
<li>Navigate app search results - Arrow keys</li>
<li>Choose app result - <tt class="docutils literal">Enter</tt></li>
<li><tt class="docutils literal">Esc</tt> to close app drawer</li>
</ul>
</div>
<div class="section" id="known-issues-roadmap">
<h1><a class="toc-backref" href="#id2">Known issues / Roadmap</a></h1>
<ul class="simple">
<li>To view the full experience in a device, the page must be loaded with the
device screen size. This means that, if you change the size of your browser,
you should reload the web client to get the full experience for that
new size. This is Odoo’s own limitation.</li>
<li>App navigation with keyboard.</li>
<li>Handle long titles on forms in a better way</li>
<li>Standard sticky headers seems to not work properly on iOS Safari/Chrome (see #1626).</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id3">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/web/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/web/issues/new?body=module:%20web_responsive%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id4">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id5">Authors</a></h2>
<ul class="simple">
<li>LasLabs</li>
<li>Tecnativa</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id6">Contributors</a></h2>
<ul class="simple">
<li>Dave Lasley &lt;<a class="reference external" href="mailto:dave&#64;laslabs.com">dave&#64;laslabs.com</a>&gt;</li>
<li>Jairo Llopis &lt;<a class="reference external" href="mailto:jairo.llopis&#64;tecnativa.com">jairo.llopis&#64;tecnativa.com</a>&gt;</li>
<li>Dennis Sluijk &lt;<a class="reference external" href="mailto:d.sluijk&#64;onestein.nl">d.sluijk&#64;onestein.nl</a>&gt;</li>
<li>Sergio Teruel &lt;<a class="reference external" href="mailto:sergio.teruel&#64;tecnativa.com">sergio.teruel&#64;tecnativa.com</a>&gt;</li>
<li>Alexandre Díaz &lt;<a class="reference external" href="mailto:dev&#64;redneboa.es">dev&#64;redneboa.es</a>&gt;</li>
<li>Mathias Markl &lt;<a class="reference external" href="mailto:mathias.markl&#64;mukit.at">mathias.markl&#64;mukit.at</a>&gt;</li>
<li>Iván Todorovich &lt;<a class="reference external" href="mailto:ivan.todorovich&#64;gmail.com">ivan.todorovich&#64;gmail.com</a>&gt;</li>
<li>Sergey Shebanin &lt;<a class="reference external" href="mailto:sergey&#64;shebanin.ru">sergey&#64;shebanin.ru</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id7">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>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.</p>
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainers</a>:</p>
<p><a class="reference external" href="https://github.com/Yajo"><img alt="Yajo" src="https://github.com/Yajo.png?size=40px" /></a> <a class="reference external" href="https://github.com/Tardo"><img alt="Tardo" src="https://github.com/Tardo.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/web/tree/14.0/web_responsive">OCA/web</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>
<svg xmlns="http://www.w3.org/2000/svg" width="2000" height="1128" viewBox="0 0 2000 1128">
<polygon fill-opacity=".03" points="0 1077.844 392.627 778.443 1504.99 1127.745 0 1127.745"/>
<polygon fill-opacity=".02" points="392.216 778.443 283.294 0 0 0 0 666.504"/>
<polygon fill-opacity=".03" points="1000 0 2000 1009.98 2000 439.94 1749.817 0"/>
</svg>
odoo.define("web_responsive.KanbanRendererMobile", function (require) {
"use strict";
/**
* The purpose of this file is to improve the UX of grouped kanban views in
* mobile. It includes the KanbanRenderer (in mobile only) to only display one
* column full width, and enables the swipe to browse to the other columns.
* Moreover, records in columns are lazy-loaded.
*/
var config = require("web.config");
var core = require("web.core");
var KanbanRenderer = require("web.KanbanRenderer");
var KanbanView = require("web.KanbanView");
var KanbanQuickCreate = require("web.kanban_column_quick_create");
var _t = core._t;
var qweb = core.qweb;
if (!config.device.isMobile) {
return;
}
KanbanQuickCreate.include({
init() {
this._super.apply(this, arguments);
this.isMobile = true;
},
/**
* KanbanRenderer will decide can we close quick create or not
* @private
* @override
*/
_cancel: function () {
this.trigger_up("close_quick_create");
},
/**
* Clear input when showed
* @override
*/
toggleFold: function () {
this._super.apply(this, arguments);
if (!this.folded) {
this.$input.val("");
}
},
});
KanbanView.include({
init() {
this._super.apply(this, arguments);
this.jsLibs.push("/web/static/lib/jquery.touchSwipe/jquery.touchSwipe.js");
},
});
KanbanRenderer.include({
custom_events: _.extend({}, KanbanRenderer.prototype.custom_events || {}, {
quick_create_column_created: "_onColumnAdded",
}),
events: _.extend({}, KanbanRenderer.prototype.events, {
"click .o_kanban_mobile_tab": "_onMobileTabClicked",
"click .o_kanban_mobile_add_column": "_onMobileQuickCreateClicked",
}),
ANIMATE: true, // Allows to disable animations for the tests
/**
* @override
*/
init: function () {
this._super.apply(this, arguments);
this.activeColumnIndex = 0; // Index of the currently displayed column
this._scrollPosition = null;
},
/**
* As this renderer defines its own scrolling area (the column in grouped
* mode), we override this hook to restore the scroll position like it was
* when the renderer has been last detached.
*
* @override
*/
on_attach_callback: function () {
if (
this._scrollPosition &&
this.state.groupedBy.length &&
this.widgets.length
) {
var $column = this.widgets[this.activeColumnIndex].$el;
$column.scrollLeft(this._scrollPosition.left);
$column.scrollTop(this._scrollPosition.top);
}
this._computeTabPosition();
this._super.apply(this, arguments);
},
/**
* As this renderer defines its own scrolling area (the column in grouped
* mode), we override this hook to store the scroll position, so that we can
* restore it if the renderer is re-attached to the DOM later.
*
* @override
*/
on_detach_callback: function () {
if (this.state.groupedBy.length && this.widgets.length) {
var $column = this.widgets[this.activeColumnIndex].$el;
this._scrollPosition = {
left: $column.scrollLeft(),
top: $column.scrollTop(),
};
} else {
this._scrollPosition = null;
}
this._super.apply(this, arguments);
},
// --------------------------------------------------------------------------
// Public
// --------------------------------------------------------------------------
/**
* Displays the quick create record in the active column
* override to open quick create record in current active column
*
* @override
* @returns {Promise}
*/
addQuickCreate: function () {
if (this._canCreateColumn() && !this.quickCreate.folded) {
this._onMobileQuickCreateClicked();
}
return this.widgets[this.activeColumnIndex].addQuickCreate();
},
/**
* Overrides to restore the left property and the scrollTop on the updated
* column, and to enable the swipe handlers
*
* @override
*/
updateColumn: function (localID) {
var index = _.findIndex(this.widgets, {db_id: localID});
var $column = this.widgets[index].$el;
var scrollTop = $column.scrollTop();
return (
this._super
.apply(this, arguments)
.then(() => this._layoutUpdate(false))
// Required when clicking on 'Load More'
.then(() => $column.scrollTop(scrollTop))
.then(() => this._enableSwipe())
);
},
// --------------------------------------------------------------------------
// Private
// --------------------------------------------------------------------------
/**
* Check if we use the quick create on mobile
* @returns {Boolean}
* @private
*/
_canCreateColumn: function () {
return this.quickCreateEnabled && this.quickCreate && this.widgets.length;
},
/**
* Update the columns positions
*
* @private
* @param {Boolean} [animate=false] set to true to animate
*/
_computeColumnPosition: function (animate) {
if (this.widgets.length) {
// Check rtl to compute correct css value
const rtl = _t.database.parameters.direction === "rtl";
// Display all o_kanban_group
this.$(".o_kanban_group").show();
const $columnAfter = this._toNode(
this.widgets.filter(
(widget, index) => index > this.activeColumnIndex
)
);
const promiseAfter = this._updateColumnCss(
$columnAfter,
rtl ? {right: "100%"} : {left: "100%"},
animate
);
const $columnBefore = this._toNode(
this.widgets.filter(
(widget, index) => index < this.activeColumnIndex
)
);
const promiseBefore = this._updateColumnCss(
$columnBefore,
rtl ? {right: "-100%"} : {left: "-100%"},
animate
);
const $columnCurrent = this._toNode(
this.widgets.filter(
(widget, index) => index === this.activeColumnIndex
)
);
const promiseCurrent = this._updateColumnCss(
$columnCurrent,
rtl ? {right: "0%"} : {left: "0%"},
animate
);
promiseAfter
.then(promiseBefore)
.then(promiseCurrent)
.then(() => {
$columnAfter.hide();
$columnBefore.hide();
});
}
},
/**
* Define the o_current class to the current selected kanban (column & tab)
*
* @private
*/
_computeCurrentColumn: function () {
if (this.widgets.length) {
var column = this.widgets[this.activeColumnIndex];
if (!column) {
return;
}
var columnID = column.id || column.db_id;
this.$(
".o_kanban_mobile_tab.o_current, .o_kanban_group.o_current"
).removeClass("o_current");
this.$(
'.o_kanban_group[data-id="' +
columnID +
'"], ' +
'.o_kanban_mobile_tab[data-id="' +
columnID +
'"]'
).addClass("o_current");
}
},
/**
* Update the tabs positions
*
* @private
*/
_computeTabPosition: function () {
this._computeTabJustification();
this._computeTabScrollPosition();
},
/**
* Update the tabs positions
*
* @private
*/
_computeTabScrollPosition: function () {
if (this.widgets.length) {
var lastItemIndex = this.widgets.length - 1;
var moveToIndex = this.activeColumnIndex;
var scrollToLeft = 0;
for (var i = 0; i < moveToIndex; i++) {
var columnWidth = this._getTabWidth(this.widgets[i]);
// Apply
if (moveToIndex !== lastItemIndex && i === moveToIndex - 1) {
var partialWidth = 0.75;
scrollToLeft += columnWidth * partialWidth;
} else {
scrollToLeft += columnWidth;
}
}
// Apply the scroll x on the tabs
// XXX in case of RTL, should we use scrollRight?
this.$(".o_kanban_mobile_tabs").scrollLeft(scrollToLeft);
}
},
/**
* Compute the justify content of the kanban tab headers
*
* @private
*/
_computeTabJustification: function () {
if (this.widgets.length) {
var self = this;
// Use to compute the sum of the width of all tab
var widthChilds = this.widgets.reduce(function (total, column) {
return total + self._getTabWidth(column);
}, 0);
// Apply a space around between child if the parent length is higher then the sum of the child width
var $tabs = this.$(".o_kanban_mobile_tabs");
$tabs.toggleClass(
"justify-content-between",
$tabs.outerWidth() >= widthChilds
);
}
},
/**
* Enables swipe event on the current column
*
* @private
*/
_enableSwipe: function () {
var self = this;
var step = _t.database.parameters.direction === "rtl" ? -1 : 1;
this.$el.swipe({
excludedElements: ".o_kanban_mobile_tabs",
swipeLeft: function () {
var moveToIndex = self.activeColumnIndex + step;
if (moveToIndex < self.widgets.length) {
self._moveToGroup(moveToIndex, self.ANIMATE);
}
},
swipeRight: function () {
var moveToIndex = self.activeColumnIndex - step;
if (moveToIndex > -1) {
self._moveToGroup(moveToIndex, self.ANIMATE);
}
},
});
},
/**
* Retrieve the outerWidth of a given widget column
*
* @param {KanbanColumn} column
* @returns {integer} outerWidth of the found column
* @private
*/
_getTabWidth: function (column) {
var columnID = column.id || column.db_id;
return this.$(
'.o_kanban_mobile_tab[data-id="' + columnID + '"]'
).outerWidth();
},
/**
* Update the kanban layout
*
* @private
* @param {Boolean} [animate=false] set to true to animate
*/
_layoutUpdate: function (animate) {
this._computeCurrentColumn();
this._computeTabPosition();
this._computeColumnPosition(animate);
this._enableSwipe();
},
/**
* Moves to the given kanban column
*
* @private
* @param {integer} moveToIndex index of the column to move to
* @param {Boolean} [animate=false] set to true to animate
* @returns {Promise} resolved when the new current group has been loaded
* and displayed
*/
_moveToGroup: function (moveToIndex, animate) {
if (this.widgets.length === 0) {
return Promise.resolve();
}
var self = this;
if (moveToIndex >= 0 && moveToIndex < this.widgets.length) {
this.activeColumnIndex = moveToIndex;
}
var column = this.widgets[this.activeColumnIndex];
this._enableSwipe();
if (!column.data.isOpen) {
this.trigger_up("column_toggle_fold", {
db_id: column.db_id,
onSuccess: () => self._layoutUpdate(animate),
});
} else {
this._layoutUpdate(animate);
}
return Promise.resolve();
},
/**
* @override
* @private
*/
_renderExampleBackground: function () {
// Override to avoid display of example background
},
/**
* @override
* @private
*/
_renderGrouped: function (fragment) {
var self = this;
var newFragment = document.createDocumentFragment();
this._super.apply(this, [newFragment]);
this.defs.push(
Promise.all(this.defs).then(function () {
var data = [];
_.each(self.state.data, function (group) {
if (!group.value) {
group = _.extend({}, group, {value: _t("Undefined")});
data.unshift(group);
} else {
data.push(group);
}
});
var kanbanColumnContainer = document.createElement("div");
kanbanColumnContainer.classList.add("o_kanban_columns_content");
kanbanColumnContainer.appendChild(newFragment);
fragment.appendChild(kanbanColumnContainer);
$(
qweb.render("KanbanView.MobileTabs", {
data: data,
quickCreateEnabled: self._canCreateColumn(),
})
).prependTo(fragment);
})
);
},
/**
* @override
* @private
*/
_renderView: function () {
var self = this;
return this._super.apply(this, arguments).then(function () {
if (self.state.groupedBy.length) {
// Force first column for kanban view, because the groupedBy can be changed
return self._moveToGroup(0);
}
if (self._canCreateColumn()) {
self._onMobileQuickCreateClicked();
}
return Promise.resolve();
});
},
/**
* Retrieve the Jquery node (.o_kanban_group) for a list of a given widgets
*
* @private
* @param widgets
* @returns {jQuery} the matching .o_kanban_group widgets
*/
_toNode: function (widgets) {
const selectorCss = widgets
.map(
(widget) =>
'.o_kanban_group[data-id="' + (widget.id || widget.db_id) + '"]'
)
.join(", ");
return this.$(selectorCss);
},
/**
* Update the given column to the updated positions
*
* @private
* @param $column The jquery column
* @param cssProperties Use to update column
* @param {Boolean} [animate=false] set to true to animate
* @returns {Promise}
*/
_updateColumnCss: function ($column, cssProperties, animate) {
if (animate) {
return new Promise((resolve) =>
$column.animate(cssProperties, "fast", resolve)
);
}
$column.css(cssProperties);
return Promise.resolve();
},
// --------------------------------------------------------------------------
// Handlers
// --------------------------------------------------------------------------
/**
* @private
*/
_onColumnAdded: function () {
this._computeTabPosition();
if (this._canCreateColumn() && !this.quickCreate.folded) {
this.quickCreate.toggleFold();
}
},
/**
* @private
*/
_onMobileQuickCreateClicked: function (event) {
if (event) {
event.stopPropagation();
}
this.quickCreate.toggleFold();
this.$(".o_kanban_group").toggle(this.quickCreate.folded);
},
/**
* @private
* @param {MouseEvent} event
*/
_onMobileTabClicked: function (event) {
if (this._canCreateColumn() && !this.quickCreate.folded) {
this.quickCreate.toggleFold();
}
this._moveToGroup($(event.currentTarget).index(), true);
},
/**
* @private
* @override
*/
_onCloseQuickCreate: function () {
if (this.widgets.length && !this.quickCreate.folded) {
this.$(".o_kanban_group").toggle(true);
this.quickCreate.toggleFold();
}
},
});
});
/* Copyright 2018 Tecnativa - Jairo Llopis
* Copyright 2018 Tecnativa - Sergey Shebanin
* License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). */
odoo.define("web_responsive", function (require) {
"use strict";
const ActionManager = require("web.ActionManager");
const AbstractWebClient = require("web.AbstractWebClient");
const AppsMenu = require("web.AppsMenu");
const BasicController = require("web.BasicController");
const config = require("web.config");
const core = require("web.core");
const FormRenderer = require("web.FormRenderer");
const Menu = require("web.Menu");
const RelationalFields = require("web.relational_fields");
const ListRenderer = require("web.ListRenderer");
const CalendarRenderer = require("web.CalendarRenderer");
const patchMixin = require("web.patchMixin");
const AttachmentViewer = require("mail/static/src/components/attachment_viewer/attachment_viewer.js");
const PatchableAttachmentViewer = patchMixin(AttachmentViewer);
const ControlPanel = require("web.ControlPanel");
const SearchPanel = require("web/static/src/js/views/search_panel.js");
/* global owl */
const {QWeb, Context} = owl;
const {useState, useContext} = owl.hooks;
/* Hide AppDrawer in desktop and mobile modes.
* To avoid delays in pages with a lot of DOM nodes we make
* sub-groups' with 'querySelector' to improve the performance.
*/
function closeAppDrawer() {
_.defer(function () {
// Need close AppDrawer?
var menu_apps_dropdown = document.querySelector(".o_menu_apps .dropdown");
$(menu_apps_dropdown)
.has(".dropdown-menu.show")
.find("> a")
.dropdown("toggle");
// Need close Sections Menu?
// TODO: Change to 'hide' in modern Bootstrap >4.1
var menu_sections = document.querySelector(
".o_menu_sections li.show .dropdown-toggle"
);
$(menu_sections).dropdown("toggle");
// Need close Mobile?
var menu_sections_mobile = document.querySelector(".o_menu_sections.show");
$(menu_sections_mobile).collapse("hide");
});
}
/**
* Reduce menu data to a searchable format understandable by fuzzy.js
*
* `AppsMenu.init()` gets `menuData` in a format similar to this (only
* relevant data is shown):
*
* ```js
* {
* [...],
* children: [
* // This is a menu entry:
* {
* action: "ir.actions.client,94", // Or `false`
* children: [... similar to above "children" key],
* name: "Actions",
* parent_id: [146, "Settings/Technical/Actions"], // Or `false`
* },
* ...
* ]
* }
* ```
*
* This format is very hard to process to search matches, and it would
* slow down the search algorithm, so we reduce it with this method to be
* able to later implement a simpler search.
*
* @param {Object} memo
* Reference to current result object, passed on recursive calls.
*
* @param {Object} menu
* A menu entry, as described above.
*
* @returns {Object}
* Reduced object, without entries that have no action, and with a
* format like this:
*
* ```js
* {
* "Discuss": {Menu entry Object},
* "Settings": {Menu entry Object},
* "Settings/Technical/Actions/Actions": {Menu entry Object},
* ...
* }
* ```
*/
function findNames(memo, menu) {
if (menu.action) {
var key = menu.parent_id ? menu.parent_id[1] + "/" : "";
memo[key + menu.name] = menu;
}
if (menu.children.length) {
_.reduce(menu.children, findNames, memo);
}
return memo;
}
AppsMenu.include({
events: _.extend(
{
"keydown .search-input input": "_searchResultsNavigate",
"input .search-input input": "_searchMenusSchedule",
"click .o-menu-search-result": "_searchResultChosen",
"shown.bs.dropdown": "_searchFocus",
"hidden.bs.dropdown": "_searchReset",
"hide.bs.dropdown": "_hideAppsMenu",
},
AppsMenu.prototype.events
),
/**
* Rescue some menu data stripped out in original method.
*
* @override
*/
init: function (parent, menuData) {
this._super.apply(this, arguments);
// Keep base64 icon for main menus
for (const n in this._apps) {
this._apps[n].web_icon_data = menuData.children[n].web_icon_data;
}
// Store menu data in a format searchable by fuzzy.js
this._searchableMenus = _.reduce(menuData.children, findNames, {});
// Search only after timeout, for fast typers
this._search_def = false;
},
/**
* @override
*/
start: function () {
this.$search_container = this.$(".search-container");
this.$search_input = this.$(".search-input input");
this.$search_results = this.$(".search-results");
return this._super.apply(this, arguments);
},
/**
* Prevent the menu from being opened twice
*
* @override
*/
_onAppsMenuItemClicked: function (ev) {
this._super.apply(this, arguments);
ev.preventDefault();
ev.stopPropagation();
},
/**
* Get all info for a given menu.
*
* @param {String} key
* Full path to requested menu.
*
* @returns {Object}
* Menu definition, plus extra needed keys.
*/
_menuInfo: function (key) {
const original = this._searchableMenus[key];
return _.extend(
{
action_id: parseInt(original.action.split(",")[1], 10),
},
original
);
},
/**
* Autofocus on search field on big screens.
*/
_searchFocus: function () {
if (!config.device.isMobile) {
// This timeout is necessary since the menu has a 100ms fading animation
setTimeout(() => this.$search_input.focus(), 100);
}
},
/**
* Reset search input and results
*/
_searchReset: function () {
this.$search_container.removeClass("has-results");
this.$search_results.empty();
this.$search_input.val("");
},
/**
* Schedule a search on current menu items.
*/
_searchMenusSchedule: function () {
this._search_def = new Promise((resolve) => {
setTimeout(resolve, 50);
});
this._search_def.then(this._searchMenus.bind(this));
},
/**
* Search among available menu items, and render that search.
*/
_searchMenus: function () {
const query = this.$search_input.val();
if (query === "") {
this.$search_container.removeClass("has-results");
this.$search_results.empty();
return;
}
var results = fuzzy.filter(query, _.keys(this._searchableMenus), {
pre: "<b>",
post: "</b>",
});
this.$search_container.toggleClass("has-results", Boolean(results.length));
this.$search_results.html(
core.qweb.render("web_responsive.MenuSearchResults", {
results: results,
widget: this,
})
);
},
/**
* Use chooses a search result, so we navigate to that menu
*
* @param {jQuery.Event} event
*/
_searchResultChosen: function (event) {
event.preventDefault();
event.stopPropagation();
const $result = $(event.currentTarget),
text = $result.text().trim(),
data = $result.data(),
suffix = ~text.indexOf("/") ? "/" : "";
// Load the menu view
this.trigger_up("menu_clicked", {
action_id: data.actionId,
id: data.menuId,
previous_menu_id: data.parentId,
});
// Find app that owns the chosen menu
const app = _.find(this._apps, function (_app) {
return text.indexOf(_app.name + suffix) === 0;
});
// Update navbar menus
core.bus.trigger("change_menu_section", app.menuID);
},
/**
* Navigate among search results
*
* @param {jQuery.Event} event
*/
_searchResultsNavigate: function (event) {
// Find current results and active element (1st by default)
const all = this.$search_results.find(".o-menu-search-result"),
pre_focused = all.filter(".active") || $(all[0]);
let offset = all.index(pre_focused),
key = event.key;
// Keyboard navigation only supports search results
if (!all.length) {
return;
}
// Transform tab presses in arrow presses
if (key === "Tab") {
event.preventDefault();
key = event.shiftKey ? "ArrowUp" : "ArrowDown";
}
switch (key) {
// Pressing enter is the same as clicking on the active element
case "Enter":
pre_focused.click();
break;
// Navigate up or down
case "ArrowUp":
offset--;
break;
case "ArrowDown":
offset++;
break;
default:
// Other keys are useless in this event
return;
}
// Allow looping on results
if (offset < 0) {
offset = all.length + offset;
} else if (offset >= all.length) {
offset -= all.length;
}
// Switch active element
const new_focused = $(all[offset]);
pre_focused.removeClass("active");
new_focused.addClass("active");
this.$search_results.scrollTo(new_focused, {
offset: {
top: this.$search_results.height() * -0.5,
},
});
},
/*
* Control if AppDrawer can be closed
*/
_hideAppsMenu: function () {
return !this.$("input").is(":focus");
},
});
BasicController.include({
/**
* Close the AppDrawer if the data set is dirty and a discard dialog
* is opened
*
* @override
*/
canBeDiscarded: function (recordID) {
if (this.model.isDirty(recordID || this.handle)) {
closeAppDrawer();
}
return this._super.apply(this, arguments);
},
});
Menu.include({
events: _.extend(
{
// Clicking a hamburger menu item should close the hamburger
"click .o_menu_sections [role=menuitem]": "_onClickMenuItem",
// Opening any dropdown in the navbar should hide the hamburger
"show.bs.dropdown .o_menu_systray, .o_menu_apps": "_hideMobileSubmenus",
},
Menu.prototype.events
),
start: function () {
this.$menu_toggle = this.$(".o-menu-toggle");
return this._super.apply(this, arguments);
},
/**
* Hide menus for current app if you're in mobile
*/
_hideMobileSubmenus: function () {
if (
config.device.isMobile &&
this.$menu_toggle.is(":visible") &&
this.$section_placeholder.is(":visible")
) {
this.$section_placeholder.collapse("hide");
}
},
/**
* Prevent hide the menu (should be closed when action is loaded)
*
* @param {ClickEvent} ev
*/
_onClickMenuItem: function (ev) {
ev.stopPropagation();
},
/**
* No menu brand in mobiles
*
* @override
*/
_updateMenuBrand: function () {
if (!config.device.isMobile) {
return this._super.apply(this, arguments);
}
},
});
RelationalFields.FieldStatus.include({
/**
* Fold all on mobiles.
*
* @override
*/
_setState: function () {
this._super.apply(this, arguments);
if (config.device.isMobile) {
_.map(this.status_information, (value) => {
value.fold = true;
});
}
},
});
// Sticky Column Selector
ListRenderer.include({
_renderView: function () {
const self = this;
return this._super.apply(this, arguments).then(() => {
const $col_selector = self.$el.find(
".o_optional_columns_dropdown_toggle"
);
if ($col_selector.length !== 0) {
const $th = self.$el.find("thead>tr:first>th:last");
$col_selector.appendTo($th);
}
});
},
_onToggleOptionalColumnDropdown: function (ev) {
// FIXME: For some strange reason the 'stopPropagation' call
// in the main method don't work. Invoking here the same method
// does the expected behavior... O_O!
// This prevents the action of sorting the column from being
// launched.
ev.stopPropagation();
this._super.apply(this, arguments);
},
});
// Responsive view "action" buttons
FormRenderer.include({
/**
* In mobiles, put all statusbar buttons in a dropdown.
*
* @override
*/
_renderHeaderButtons: function () {
const $buttons = this._super.apply(this, arguments);
if (
!config.device.isMobile ||
$buttons.children("button:not(.o_invisible_modifier)").length <= 2
) {
return $buttons;
}
// $buttons must be appended by JS because all events are bound
const $dropdown = $(
core.qweb.render("web_responsive.MenuStatusbarButtons")
);
$buttons.addClass("dropdown-menu").appendTo($dropdown);
return $dropdown;
},
});
CalendarRenderer.include({
_getFullCalendarOptions: function () {
var options = this._super.apply(this, arguments);
if (config.device.isMobile) {
options.views.dayGridMonth.columnHeaderFormat = "ddd";
}
return options;
},
});
// Hide AppDrawer or Menu when the action has been completed
ActionManager.include({
/**
* @override
*/
_appendController: function () {
this._super.apply(this, arguments);
closeAppDrawer();
},
});
/**
* Use ALT+SHIFT instead of ALT as hotkey triggerer.
*
* HACK https://github.com/odoo/odoo/issues/30068 - See it to know why.
*
* Cannot patch in `KeyboardNavigationMixin` directly because it's a mixin,
* not a `Class`, and altering a mixin's `prototype` doesn't alter it where
* it has already been used.
*
* Instead, we provide an additional mixin to be used wherever you need to
* enable this behavior.
*/
var KeyboardNavigationShiftAltMixin = {
/**
* Alter the key event to require pressing Shift.
*
* This will produce a mocked event object where it will seem that
* `Alt` is not pressed if `Shift` is not pressed.
*
* The reason for this is that original upstream code, found in
* `KeyboardNavigationMixin` is very hardcoded against the `Alt` key,
* so it is more maintainable to mock its input than to rewrite it
* completely.
*
* @param {keyEvent} keyEvent
* Original event object
*
* @returns {keyEvent}
* Altered event object
*/
_shiftPressed: function (keyEvent) {
const alt = keyEvent.altKey || keyEvent.key === "Alt",
newEvent = _.extend({}, keyEvent),
shift = keyEvent.shiftKey || keyEvent.key === "Shift";
// Mock event to make it seem like Alt is not pressed
if (alt && !shift) {
newEvent.altKey = false;
if (newEvent.key === "Alt") {
newEvent.key = "Shift";
}
}
return newEvent;
},
_onKeyDown: function (keyDownEvent) {
return this._super(this._shiftPressed(keyDownEvent));
},
_onKeyUp: function (keyUpEvent) {
return this._super(this._shiftPressed(keyUpEvent));
},
};
// Include the SHIFT+ALT mixin wherever
// `KeyboardNavigationMixin` is used upstream
AbstractWebClient.include(KeyboardNavigationShiftAltMixin);
// TODO: use default odoo device context when it will be realized
const deviceContext = new Context({
isMobile: config.device.isMobile,
size_class: config.device.size_class,
SIZES: config.device.SIZES,
});
window.addEventListener(
"resize",
owl.utils.debounce(() => {
const state = deviceContext.state;
if (state.isMobile !== config.device.isMobile) {
state.isMobile = !state.isMobile;
}
if (state.size_class !== config.device.size_class) {
state.size_class = config.device.size_class;
}
}, 15)
);
// Patch attachment viewer to add min/max buttons capability
PatchableAttachmentViewer.patch("web_responsive.AttachmentViewer", (T) => {
class AttachmentViewerPatchResponsive extends T {
constructor() {
super(...arguments);
this.state = useState({
maximized: false,
});
}
// Disable auto-close to allow to use form in edit mode.
isCloseable() {
return false;
}
}
return AttachmentViewerPatchResponsive;
});
QWeb.components.AttachmentViewer = PatchableAttachmentViewer;
// Patch control panel to add states for mobile quick search
ControlPanel.patch("web_responsive.ControlPanelMobile", (T) => {
class ControlPanelPatchResponsive extends T {
constructor() {
super(...arguments);
this.state = useState({
mobileSearchMode: "",
});
this.device = useContext(deviceContext);
}
}
return ControlPanelPatchResponsive;
});
// Patch search panel to add functionality for mobile view
SearchPanel.patch("web_responsive.SearchPanelMobile", (T) => {
class SearchPanelPatchResponsive extends T {
constructor() {
super(...arguments);
this.state.mobileSearch = false;
this.device = useContext(deviceContext);
}
getActiveSummary() {
const selection = [];
for (const filter of this.model.get("sections")) {
let filterValues = [];
if (filter.type === "category") {
if (filter.activeValueId) {
const parentIds = this._getAncestorValueIds(
filter,
filter.activeValueId
);
filterValues = [...parentIds, filter.activeValueId].map(
(valueId) => filter.values.get(valueId).display_name
);
}
} else {
let values = [];
if (filter.groups) {
values = Array.from(
filter.groups.values(),
(g) => g.values
).flat();
}
if (filter.values) {
values = [...filter.values.values()];
}
filterValues = values
.filter((v) => v.checked)
.map((v) => v.display_name);
}
if (filterValues.length) {
selection.push({
values: filterValues,
icon: filter.icon,
color: filter.color,
type: filter.type,
});
}
}
return selection;
}
}
return SearchPanelPatchResponsive;
});
return {
deviceContext: deviceContext,
};
});
@include media-breakpoint-down(sm) {
.o_kanban_view.o_kanban_grouped {
display: block;
position: relative;
overflow-x: hidden;
&.o_renderer_with_searchpanel {
width: 100%;
}
.o_kanban_mobile_tabs_container {
position: sticky;
display: flex;
justify-content: space-between;
width: 100%;
top: 0;
z-index: 1;
background-color: #5e5e5e;
.o_kanban_mobile_add_column {
height: $o-kanban-mobile-tabs-height;
padding: 10px;
border-left: grey 1px solid;
color: white;
font-size: 14px;
}
.o_kanban_mobile_tabs {
position: relative;
display: flex;
width: 100%;
height: $o-kanban-mobile-tabs-height;
overflow-x: auto;
.o_kanban_mobile_tab {
height: $o-kanban-mobile-tabs-height;
padding: 10px 20px;
font-size: 14px;
color: white;
&.o_current {
font-weight: bold;
border-bottom: 3px solid $o-brand-primary;
}
.o_column_title {
white-space: nowrap;
text-transform: uppercase;
}
}
}
}
.o_kanban_columns_content {
position: relative;
}
// [class] to get same specificity as elsewhere (kanban_view.less)
&[class] .o_kanban_group:not(.o_column_folded) {
@include o-position-absolute(
$top: $o-kanban-mobile-tabs-height,
$left: 0,
$bottom: 0
);
width: 100%;
padding: 0;
margin-left: 0; // override the margin-left: -1px of the desktop mode
border: none;
&.o_current {
position: inherit;
top: 0;
&.o_kanban_no_records {
// set a default height for clarity when embedded in another view
min-height: $o-kanban-mobile-empty-height;
}
}
.o_kanban_header {
display: none;
}
.o_kanban_record,
.o_kanban_quick_create {
border: none;
border-bottom: 1px solid lightgray;
padding: 10px 16px;
margin: 0;
}
}
}
.o_kanban_view .o_column_quick_create {
.o_quick_create_folded {
display: none !important;
}
.o_quick_create_unfolded {
width: 100%;
}
}
}
.o_web_client {
.o_mobile_search {
position: fixed;
top: 0;
left: 0;
bottom: 0;
padding: 0;
width: 100%;
background-color: white;
z-index: $zindex-modal;
overflow: auto;
.o_mobile_search_header {
height: 46px;
margin-bottom: 10px;
width: 100%;
background-color: $o-brand-odoo;
color: white;
span:active {
background-color: darken($o-brand-primary, 10%);
}
span {
cursor: pointer;
}
}
.o_searchview_input_container {
display: flex;
padding: 15px 20px 0 20px;
position: relative;
.o_searchview_input {
width: 100%;
margin-bottom: 15px;
border-bottom: 1px solid $o-brand-secondary;
}
.o_searchview_facet {
border-radius: 10px;
display: inline-flex;
order: 1;
.o_searchview_facet_label {
border-radius: 2em 0em 0em 2em;
}
}
.o_searchview_autocomplete {
top: 100%;
> li {
margin: 5px 0px;
}
}
}
.o_mobile_search_filter {
padding-bottom: 15%;
.o_dropdown {
width: 100%;
margin: 15px 5px 0px 5px;
border: solid 1px darken(gray("200"), 20%);
}
.o_dropdown_toggler_btn {
width: 100%;
text-align: left;
&:after {
display: none;
}
}
// We disable the backdrop in this case because it prevents any
// interaction outside of a dropdown while it is open.
.dropdown-backdrop {
z-index: -1;
}
.dropdown-menu {
// Here we use !important because of popper js adding custom style
// to element so to override it use !important
position: relative !important;
width: 100% !important;
transform: translate3d(0, 0, 0) !important;
box-shadow: none;
border: none;
color: gray("600");
.divider {
margin: 0px;
}
> li > a {
padding: 10px 26px;
}
}
}
.o_mobile_search_show_result {
padding: 10px;
font-size: 15px;
}
}
}
// Search panel
@include media-breakpoint-down(sm) {
.o_controller_with_searchpanel {
display: block;
.o_search_panel {
height: auto;
padding: 8px;
border-left: 1px solid $gray-300;
section {
padding: 0px 16px;
}
}
.o_search_panel_summary {
cursor: pointer;
}
}
}
/* Copyright 2018 Tecnativa - Jairo Llopis
* License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). */
$chatter_zone_width: 35%;
@mixin full-screen-dropdown {
border: none;
box-shadow: none;
display: flex;
flex-direction: column;
height: calc(100vh - #{$o-navbar-height});
position: fixed;
margin: 0;
width: 100vw;
z-index: 100;
// Inline style will override our `top`, so we need !important here
top: $o-navbar-height !important;
transform: none !important;
}
// Support for long titles
@include media-breakpoint-up(md) {
.o_form_view .oe_button_box + .oe_title,
.o_form_view .oe_button_box + .oe_avatar + .oe_title {
/* Button-box has a hardcoded width of 132px per button and have three columns */
width: calc(100% - 450px);
}
}
// Main navbar (with apps menu, user menu, debug menu...)
@include media-breakpoint-down(sm) {
.o_main_navbar {
// This allows to have a sane layout for mobiles
display: flex;
// Remove clutter to only have small icons that fit in a small screen
> .dropdown {
display: flex;
.navbar-toggler {
color: gray("white");
}
.o_menu_sections,
.o_menu_systray {
padding: 0;
}
}
// Whitespace before systray icons
.o_menu_systray {
margin-left: auto;
}
// Hide big things
.o_menu_brand,
.o_menu_sections,
.oe_topbar_name {
display: none;
}
// Fix toggler button padding
.o-menu-toggle {
cursor: pointer;
padding: 0 $o-horizontal-padding;
}
// Custom fullscreen layout when showing submenus
.o_menu_sections.show {
@include full-screen-dropdown();
background-color: $dropdown-bg;
overflow: auto;
.show {
display: flex;
flex-direction: column;
.dropdown-menu {
margin-left: 1rem;
min-width: auto;
width: calc(100vw - 2rem);
}
}
> li,
.o_menu_entry_lvl_1,
.o_menu_header_lvl_1 {
// Homogeneous background color
background-color: $dropdown-bg;
color: $dropdown-link-color;
&:hover {
background-color: $dropdown-link-hover-bg;
color: $dropdown-link-hover-color;
}
// Disable the .o-no-caret class effect, to display the caret
&.o-no-caret::after {
content: "";
}
// Fix a strange glitch leaving headers invisible
.dropdown-header {
color: $dropdown-header-color;
}
}
}
// Custom fullscreen layout for systray items
.o_mail_systray_dropdown.show {
@include full-screen-dropdown();
// Fix stretchy images
.o_mail_preview_image {
align-items: center;
display: flex;
flex-direction: row;
img {
display: block;
height: auto;
}
}
}
// Higher height for dropdown items, for those with sausage fingers
.dropdown-menu .dropdown-item {
padding: {
bottom: 0.5rem;
top: 0.5rem;
}
}
}
}
.o_main_navbar {
color: color-yiq($o-brand-odoo);
> ul > li > a,
> ul > li > label {
color: color-yiq($o-brand-odoo);
}
.dropdown-menu.show {
max-height: calc(100vh - #{$o-navbar-height});
}
}
// Iconized full screen apps menu
.o_menu_apps {
user-select: none;
a.full {
width: $o-navbar-height;
text-align: center;
}
.dropdown-menu.show {
opacity: 1;
visibility: visible;
}
.dropdown-menu {
@include full-screen-dropdown();
opacity: 0;
visibility: hidden;
transition: visibility 100ms ease, opacity 100ms ease;
background: url("../img/home-menu-bg-overlay.svg"),
linear-gradient(
to bottom,
$o-brand-odoo,
desaturate(lighten($o-brand-odoo, 20%), 15)
);
background-size: cover;
border-radius: 0;
// Display apps in a grid
align-content: flex-start;
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: flex-start;
@include media-breakpoint-up(lg) {
padding: {
left: calc((100vw - 850px) / 2);
right: calc((100vw - 850px) / 2);
}
}
.o_app {
align-items: center;
display: flex;
padding: 10px 0;
border-radius: 4px;
flex-direction: column;
justify-content: flex-start;
background: none;
transition: 300ms ease;
transition-property: background-color;
white-space: normal;
text-align: center;
img {
box-shadow: none;
transition: 300ms ease;
transition-property: box-shadow, transform;
}
&:focus {
background-color: rgba(gray("white"), 0.05);
}
// Size depends on screen
width: 33.33333333%;
@include media-breakpoint-up(sm) {
width: 25%;
}
@include media-breakpoint-up(md) {
width: 16.6666666%;
}
}
.o_app:hover img {
transform: translateY(-3px);
box-shadow: 0 9px 12px -4px rgba(gray("black"), 0.3);
}
// Hide app icons when searching
.has-results ~ .o_app {
display: none;
}
.o-app-icon {
height: auto;
max-width: 6rem;
}
.o-app-name {
color: gray("white");
margin-top: 4px;
font-size: 1.25rem;
text-shadow: 1px 1px 1px rgba(gray("black"), 0.4);
}
// Search input for menus
.form-row {
width: 100%;
}
.o-menu-search-result {
align-items: center;
background-position: left;
background-repeat: no-repeat;
background-size: contain;
cursor: pointer;
padding-left: 3rem;
white-space: normal;
}
.search-container {
padding-top: 1rem;
padding-bottom: 1.5rem;
.search-input {
margin-bottom: 0 !important;
padding: 0;
.input-group {
box-shadow: inset 0 1px 0 rgba(gray("white"), 0.1),
0 1px 0 rgba(gray("black"), 0.1);
text-shadow: 0 1px 0 rgba(gray("black"), 0.5);
border-radius: 4px;
padding: 0.4rem 0.8rem;
background-color: rgba(gray("white"), 0.1);
@include media-breakpoint-up(md) {
padding: 0.8rem 1.2rem;
}
.input-group-prepend {
span.fa {
color: gray("white");
font-size: 1.5rem;
margin-right: 1rem;
padding-top: 1px;
}
}
.form-control {
height: 2rem;
background: none;
border: none;
color: gray("white");
display: block;
padding: 1px 2px 2px 2px;
box-shadow: none;
&::placeholder {
color: gray("white");
opacity: 0.5;
}
}
}
}
}
// Allow to scroll only on results, keeping static search box above
.search-container.has-results {
height: 100%;
.search-results {
max-height: calc(100vh - 47px - 6em);
overflow-y: hidden;
overflow-x: scroll;
overflow: auto;
background: url("../img/home-menu-bg-overlay.svg"),
linear-gradient(to bottom, gray("200"), gray("white"));
background-position: center;
background-size: cover;
}
}
}
}
// Scroll all but top bar
html .o_web_client .o_action_manager .o_action {
@include media-breakpoint-down(sm) {
overflow: auto;
.o_content {
overflow: visible;
}
}
max-width: 100%;
}
// Make enough space for search panel filters buttons
.o_control_panel {
// There is no media breakpoint for XL upper bound
@include media-breakpoint-up(lg) {
@media (max-width: 1360px) {
.o_cp_top_left,
.o_cp_bottom_left {
width: 40%;
}
.o_cp_top_right,
.o_cp_bottom_right {
width: 60%;
}
}
}
// For FULL HD devices
@media (min-width: 1900px) {
.o_cp_top_left,
.o_cp_bottom_left {
width: 60%;
}
.o_cp_top_right,
.o_cp_bottom_right {
width: 40%;
}
}
@include media-breakpoint-only(md) {
.o_search_options_hide_labels .o_dropdown_title {
display: none;
}
}
.o_cp_bottom_right {
height: 30px;
}
}
// Mobile Control panel (breadcrumbs, search box, buttons...)
@include media-breakpoint-down(sm) {
.o_control_panel {
// Avoid horizontal scrolling of control panel.
// It doesn't work on iOS Safari, but it looks similar as
// without this patch. With this patch it looks better for
// other browsers.
position: sticky;
left: 0;
z-index: 3;
// Arrange buttons to use space better
.o_cp_top_left,
.o_cp_top_right {
flex: 1 1 100%;
}
.o_cp_top_left {
flex-basis: 80%;
}
.o_cp_top_right {
flex-basis: 20%;
}
.o_cp_bottom {
position: relative; // Necessary for dropdown menu positioning
display: block;
margin: 0;
}
.o_cp_bottom_left {
float: left;
margin: 5px 0;
}
.o_cp_bottom_right {
float: right;
height: 30px;
padding-left: 10px;
margin: 5px 0;
}
.o_cp_bottom_right,
.o_cp_pager {
white-space: nowrap;
}
.o_cp_pager {
margin-bottom: 0;
}
.o_cp_bottom_left > .o_cp_action_menus {
padding-right: 0;
.o_dropdown_title,
.fa-chevron-right,
.fa-chevron-down {
display: none;
}
.o_dropdown_toggler_btn {
margin: 0px 2px;
}
@include media-breakpoint-down(xs) {
.o_dropdown {
position: static;
}
.dropdown-menu {
right: 0;
left: 0;
top: 35px;
}
}
}
// Hide all but 2 last breadcrumbs, and render 2nd-to-last as arrow
.breadcrumb-item {
&:not(.active) {
padding-left: 0;
}
&::before {
content: none;
padding-right: 0;
}
&:nth-last-of-type(1n + 3) {
display: none;
}
&:nth-last-of-type(2) {
&::before {
color: var(--primary);
content: "\f060"; // .fa-arrow-left
cursor: pointer;
font-family: FontAwesome;
}
a {
display: none;
}
}
}
// Ellipsize long breadcrumbs
.breadcrumb {
max-width: 100%;
text-overflow: ellipsis;
}
// In case you install `mail`, there is a mess on BS vs inline styles
// we need to fix
.o_cp_buttons .btn.d-block:not(.d-none) {
display: inline-block !important;
}
.o_searchview {
padding: 1px 0px 3px 0px;
&.o_searchview_mobile {
cursor: pointer;
}
&.o_searchview_quick {
display: flex;
flex: 1 1 auto;
align-items: center;
.o_searchview_input_container {
flex: 1 1 auto;
}
}
}
}
.o_calendar_view .o_calendar_widget {
.fc-timeGridDay-view .fc-axis,
.fc-timeGridWeek-view .fc-axis {
padding-left: 0px;
}
.fc-dayGridMonth-view {
padding-left: 0px;
.fc-week-number {
display: none;
}
}
.fc-dayGridYear-view {
padding-left: 0px;
> .fc-month-container > .fc-month {
width: 100%;
}
}
.fc-timeGridDay-view .fc-widget-header {
margin: 0 4px;
}
.fc-timeGridWeek-view .fc-widget-header {
word-spacing: 4em;
white-space: normal;
text-align: center;
}
}
.o_base_settings .o_setting_container {
display: block;
.settings_tab {
flex-flow: row nowrap;
padding-top: 0px;
.tab {
padding-right: 16px;
}
.selected {
background-color: #212529;
box-shadow: inset 0 -5px #7c7bad;
}
}
}
}
// Size of labels
.o_web_client {
&.o_chatter_position_sided {
.o_action_manager {
.o_content,
.modal-content {
@include media-breakpoint-up(xl, $o-extra-grid-breakpoints) {
.o_inner_group {
.o_td_label {
min-width: 260px !important;
}
}
}
@include media-breakpoint-between(lg, xl, $o-extra-grid-breakpoints) {
.o_group_col_6 {
width: 100% !important;
}
}
}
}
}
&:not(.o_chatter_position_sided) {
@include media-breakpoint-up(lg, $o-extra-grid-breakpoints) {
.o_action_manager {
.o_content,
.modal-content {
.o_inner_group {
.o_td_label {
min-width: 260px !important;
}
}
}
}
}
}
}
// Normal views
.o_content,
.modal-content {
max-width: 100%;
// Form views
.o_form_view {
.o_form_sheet {
max-width: calc(100% - 32px);
overflow-x: auto;
}
.o_FormRenderer_chatterContainer {
padding-top: 0;
.o_Activity_info {
flex-wrap: wrap;
}
.o_ActivityBox_title {
margin-bottom: 0;
}
.o_MessageList_separatorDate {
padding-bottom: 0;
}
}
// Sided chatter scrolling behavior
.o_Chatter {
height: fit-content;
.o_Chatter_fixedPanel {
position: sticky;
top: 0;
z-index: 1;
background-color: white;
padding-bottom: 10px;
}
.o_Chatter_scrollPanel {
overflow: initial;
}
}
// Sticky statusbar
.o_form_statusbar {
position: sticky;
top: 0;
z-index: 2;
}
// Support for long title (with ellipsis)
.oe_title {
span.o_field_widget:not(.oe_inline) {
max-width: 100%;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
width: initial;
&:active {
white-space: normal;
}
}
}
@include media-breakpoint-down(sm) {
min-width: auto;
// More buttons border
.oe_button_box {
.o_dropdown_more {
button:last-child {
border-right: 1px solid gray("400");
}
}
}
// Avoid overflow on forms with title and/or button box
.oe_title {
max-width: 100%;
}
.oe_button_box + .oe_title,
.oe_button_box + .oe_avatar + .oe_title {
width: 100%;
}
// Avoid overflow on modals
.o_form_sheet {
min-width: auto;
}
// Render website inputs properly in phones
.o_group .o_field_widget.o_text_overflow {
// Overrides another !important
width: auto !important;
}
// Make all input groups vertical
.o_group_col_6 {
width: 100%;
}
// Statusbar buttons dropdown for mobiles
.o_statusbar_buttons_dropdown {
border: {
bottom: 0;
radius: 0;
top: 0;
}
height: 100%;
}
.o_statusbar_buttons.dropdown-menu > .btn {
border-radius: 0;
border: 0;
width: 100%;
margin-bottom: 0.2rem;
&:last-child {
margin-bottom: 0;
}
}
.o_statusbar_status {
// Arrow from rightmost button exceeds allowed width
.o_arrow_button:first-child::before {
content: none;
display: none;
}
}
// Full width in form sheets
.o_form_sheet,
.o_FormRenderer_chatterContainer {
min-width: auto;
max-width: 98%;
}
// Settings pages
.app_settings_block {
.row {
margin: 0;
}
}
.o_FormRenderer_chatterContainer {
padding-top: initial;
// Display send button on small screens
.o_thread_composer {
padding-left: $o-mail-thread-avatar-size * 0.5;
.o_composer_button_send {
display: initial !important; // Forced in core
}
.o_chatter_avatar {
display: none;
}
}
.o_chatter_topbar {
> .o_topbar_right_area {
flex: 1 0 auto;
flex-wrap: wrap;
max-width: 100%;
// Display followers on small screens
.o_followers {
display: initial !important; // Forced in core
@include media-breakpoint-down(xs) {
padding-bottom: 50px;
}
}
}
}
}
}
}
//No content message improvements on mobile
@include media-breakpoint-down(md) {
.o_view_nocontent {
top: 80px;
}
.o_nocontent_help {
box-shadow: none;
}
.o_sample_data_disabled {
display: none;
}
}
// Sided chatter, if user wants
.o_chatter_position_sided & {
@include media-breakpoint-up(lg) {
.o_form_view:not(.o_form_nosheet) {
display: flex;
flex-flow: row nowrap;
height: 100%;
.o_form_sheet_bg {
flex: 1 1 auto;
overflow: auto;
> .o_form_sheet {
min-width: unset;
}
}
.o_FormRenderer_chatterContainer {
border-left: 1px solid gray("400");
flex: 0 0 $chatter_zone_width;
max-width: initial;
min-width: initial;
overflow: auto;
.o_chatter_header_container {
padding-top: $grid-gutter-width * 0.5;
top: 0;
position: sticky;
background-color: $o-view-background-color;
z-index: 1;
// Scrollable input text to avoid hide conversation & buttons
.o_composer_text_field {
max-height: 120px;
overflow-y: auto !important; /* Forced because Odoo uses inline style */
}
.o_attachments_list {
overflow: auto;
max-height: $o-mail-attachment-image-size * 3;
margin-top: 0.4em;
}
.o_attachments_previews {
overflow: auto;
max-height: $o-mail-attachment-image-size * 6;
}
}
}
}
}
}
}
// Sticky Header & Footer in List View
.o_list_view {
.table-responsive {
.o_list_table {
// th & td are here for compatibility with chrome
thead tr:nth-child(1) th {
position: sticky;
top: 0;
z-index: 1;
}
thead tr:nth-child(1) th {
background-color: $o-list-footer-bg-color;
}
tfoot,
tfoot tr:nth-child(1) td {
position: sticky;
bottom: 0;
}
tfoot tr:nth-child(1) td {
background-color: $o-list-footer-bg-color;
}
}
}
}
// Big checkboxes
.o_list_view {
.custom-checkbox:not(.o_boolean_toggle) {
margin-right: 10px;
.custom-control-label {
top: -6px;
&::after {
width: 24px;
height: 24px;
}
&::before {
outline: none !important;
border: 1px solid #4c4c4c;
width: 24px;
height: 24px;
}
}
}
}
// Waiting Cursor
.oe_wait {
cursor: progress;
}
// Attachment Viewer
.o_web_client.o_chatter_position_sided .o_Dialog_AttachmentViewer {
/* Show sided viewer on large screens */
@include media-breakpoint-up(lg) {
position: static;
.o_AttachmentViewer_main {
padding-bottom: 20px;
}
.o_AttachmentViewer {
// On-top of navbar
z-index: 10;
position: absolute;
right: 0;
top: 0;
bottom: 0;
margin-left: auto;
background-color: rgba(0, 0, 0, 0.7);
.o_AttachmentViewer_name {
display: contents;
}
width: $chatter_zone_width;
&.o_AttachmentViewer_maximized {
width: 100%;
}
/* Show/Hide control buttons (next, prev, etc..) */
&:hover .o_AttachmentViewer_buttonNavigation,
&:hover .o_AttachmentViewer_toolbar {
display: flex;
}
.o_AttachmentViewer_buttonNavigation,
.o_AttachmentViewer_toolbar {
display: none;
}
.o_AttachmentViewer_viewIframe {
width: 95%;
}
}
}
@include media-breakpoint-down(md) {
.o_AttachmentViewer_headerItemButtonMinimize,
.o_AttachmentViewer_headerItemButtonMaximize {
display: none;
}
}
}
/* Attachment Viewer Max/Min buttons only are useful in sided mode */
.o_web_client:not(.o_chatter_position_sided) {
.o_AttachmentViewer_headerItemButtonMinimize,
.o_AttachmentViewer_headerItemButtonMaximize {
display: none;
}
}
.o_control_panel {
// Filter Menu
// Cut long filters names in the filters menu
.o_filter_menu {
.o_menu_item {
width: auto;
@include media-breakpoint-up(md) {
max-width: 250px;
}
a {
overflow: hidden;
text-overflow: ellipsis;
}
}
}
// Enable scroll on dropdowns
.o_cp_buttons .dropdown-menu {
max-height: 70vh;
overflow-y: auto;
overflow-x: hidden;
}
// Dropdown with buttons to switch the view type
.o_cp_switch_buttons.show {
.dropdown-menu {
align-content: center;
display: flex;
flex-direction: row;
justify-content: space-around;
padding: 0;
.btn {
border: {
bottom: 0;
radius: 0;
top: 0;
}
font-size: 1.3em;
}
}
}
}
// Shortcut table ui improvement
.o_shortcut_table {
width: 100%;
}
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Copyright 2018 Tecnativa - Jairo Llopis
License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). -->
<template>
<t t-extend="AppsMenu">
<!-- App icons must be clickable -->
<t t-jquery=".o_app" t-operation="attributes">
<attribute
name="t-attf-href"
t-translation="off"
>#menu_id=#{app.menuID}&amp;action_id=#{app.actionID}</attribute>
<attribute name="draggable" t-translation="off">false</attribute>
</t>
<!-- App icons should be more than a text -->
<t t-jquery=".o_app &gt; t" t-operation="replace">
<t t-call="web_responsive.AppIcon" />
</t>
<!-- Same hotkey as in EE -->
<t t-jquery=".full" t-operation="attributes">
<attribute name="accesskey">a</attribute>
</t>
<!-- Search bar -->
<t t-jquery="[t-as=app]" t-operation="before">
<div class="search-container align-items-center col-12">
<div class="search-input">
<div class="input-group">
<div class="input-group-prepend">
<span class="fa fa-search" />
</div>
<input
type="search"
autocomplete="off"
placeholder="Search menus..."
class="form-control"
/>
</div>
<div class="search-results ml-auto mr-auto rounded" />
</div>
</div>
</t>
</t>
<!-- Separate app icon template, for easier inheritance -->
<t t-name="web_responsive.AppIcon">
<img
class="o-app-icon"
draggable="false"
t-attf-src="data:image/png;base64,#{app.web_icon_data}"
/>
<span class="o-app-name">
<t t-esc="app.name" />
</span>
</t>
<!-- A search result -->
<t t-name="web_responsive.MenuSearchResults">
<t t-foreach="results" t-as="result">
<t t-set="menu" t-value="widget._menuInfo(result.original)" />
<a
t-attf-class="o-menu-search-result dropdown-item col-12 ml-auto mr-auto #{result_first ? 'active' : ''}"
t-attf-style="background-image:url('data:image/png;base64,#{menu.web_icon_data}')"
t-attf-href="#menu_id=#{menu.id}&amp;action_id=#{menu.action_id}"
t-att-data-menu-id="menu.id"
t-att-data-action-id="menu.action_id"
t-att-data-parent-id="menu.parent_id[0]"
draggable="false"
t-raw="result.string"
/>
</t>
</t>
</template>
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Copyright 2019 Tecnativa - Alexandre Díaz
Copyright 2021 Sergey Shebanin
License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). -->
<template>
<t t-inherit="mail.Dialog" t-inherit-mode="extension" owl="1">
<xpath expr="//div[hasclass('o_Dialog')]" position="attributes">
<attribute
name="t-attf-class"
t-translation="off"
>o_Dialog_{{dialog.record['constructor'].name}}</attribute>
</xpath>
</t>
<t t-inherit="mail.AttachmentViewer" t-inherit-mode="extension" owl="1">
<xpath expr="//div[hasclass('o_AttachmentViewer')]" position="attributes">
<attribute
name="t-att-class"
t-translation="off"
>state.maximized ? 'o_AttachmentViewer_maximized' : ''</attribute>
</xpath>
<xpath
expr="//div[hasclass('o_AttachmentViewer_header')]/div[hasclass('o-autogrow')]"
position="after"
>
<div
t-if="!state.maximized"
class="o_AttachmentViewer_headerItem o_AttachmentViewer_headerItemButton o_AttachmentViewer_headerItemButtonMaximize"
t-on-click="state.maximized=true"
role="button"
title="Maximize"
aria-label="Maximize"
>
<i class="fa fa-fw fa-window-maximize" role="img" />
</div>
<div
t-if="state.maximized"
class="o_AttachmentViewer_headerItem o_AttachmentViewer_headerItemButton o_AttachmentViewer_headerItemButtonMinimize"
t-on-click="state.maximized=false"
role="button"
title="Minimize"
aria-label="Minimize"
>
<i class="fa fa-fw fa-window-minimize" role="img" />
</div>
</xpath>
</t>
</template>
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Copyright 2021 Sergey Shebanin
License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). -->
<templates>
<t t-inherit="web.ControlPanel" t-inherit-mode="extension" owl="1">
<xpath expr="//nav[hasclass('o_cp_switch_buttons')]" position="replace">
<nav
t-if="props.views.length gt 1"
class="btn-group o_cp_switch_buttons"
role="toolbar"
aria-label="View switcher"
>
<t
t-set="collapse_switchview"
t-value="device.size_class &lt;= device.SIZES.LG"
/>
<button
t-if="collapse_switchview"
class="btn btn-link btn-sm"
data-toggle="dropdown"
aria-expanded="false"
>
<span
t-attf-class="fa fa-lg o_switch_view o_{{ env.view.type }} {{ props.views.filter(view => view.type === env.view.type)[0].icon }}"
/>
</button>
<ul
t-if="collapse_switchview"
class="dropdown-menu dropdown-menu-right list-inline"
>
<li t-foreach="props.views" t-as="view" t-key="view.type">
<t t-call="web.ViewSwitcherButton" />
</li>
</ul>
<t
t-if="!collapse_switchview"
t-foreach="props.views"
t-as="view"
t-key="view.type"
>
<t t-call="web.ViewSwitcherButton" />
</t>
</nav>
</xpath>
<xpath expr="//div[hasclass('o_searchview')]" position="replace">
<div
t-if="props.withSearchBar"
class="o_searchview"
t-att-class="state.mobileSearchMode == 'quick' ? 'o_searchview_quick' : 'o_searchview_mobile'"
role="search"
aria-autocomplete="list"
t-on-click.self="state.mobileSearchMode = device.isMobile ? 'quick' : ''"
>
<t t-if="!device.isMobile">
<i
class="o_searchview_icon fa fa-search"
title="Search..."
role="img"
aria-label="Search..."
/>
<SearchBar fields="fields" />
</t>
<t t-if="device.isMobile and state.mobileSearchMode == 'quick'">
<button
class="btn btn-link fa fa-arrow-left"
t-on-click.stop="state.mobileSearchMode = ''"
/>
<SearchBar fields="fields" />
<button
class="btn fa fa-filter"
t-on-click.stop="state.mobileSearchMode = 'full'"
/>
</t>
<t
t-if="device.isMobile and state.mobileSearchMode == 'full'"
t-call="web_responsive.MobileSearchView"
/>
<t t-if="device.isMobile and state.mobileSearchMode == ''">
<button
class="btn btn-link fa fa-search"
t-on-click.stop="state.mobileSearchMode = 'quick'"
/>
</t>
</div>
</xpath>
<xpath expr="//div[hasclass('o_cp_top_left')]" position="attributes">
<attribute
name="t-att-class"
t-translation="off"
>device.isMobile and state.mobileSearchMode == 'quick' ? 'o_hidden' : ''</attribute>
</xpath>
<xpath expr="//div[hasclass('o_search_options')]" position="attributes">
<attribute name="t-if" t-translation="off">!device.isMobile</attribute>
<attribute
name="t-att-class"
t-translation="off"
>device.size_class == device.SIZES.MD ? 'o_search_options_hide_labels' : ''</attribute>
</xpath>
</t>
<t t-name="web_responsive.MobileSearchView" owl="1">
<div class="o_mobile_search">
<div class="o_mobile_search_header">
<span
class="o_mobile_search_close float-left mt16 mb16 mr8 ml16"
t-on-click.stop="state.mobileSearchMode = 'quick'"
>
<i class="fa fa-arrow-left" />
<strong class="float-right ml8">FILTER</strong>
</span>
<span
class="float-right o_mobile_search_clear_facets mt16 mr16"
t-on-click.stop="model.dispatch('clearQuery')"
>
<t>CLEAR</t>
</span>
</div>
<SearchBar fields="fields" />
<div class="o_mobile_search_filter o_search_options mb8 mt8 ml16 mr16">
<FilterMenu
t-if="props.searchMenuTypes.includes('filter')"
class="o_filter_menu"
fields="fields"
/>
<GroupByMenu
t-if="props.searchMenuTypes.includes('groupBy')"
class="o_group_by_menu"
fields="fields"
/>
<ComparisonMenu
t-if="props.searchMenuTypes.includes('comparison') and model.get('filters', f => f.type === 'comparison').length"
class="o_comparison_menu"
/>
<FavoriteMenu
t-if="props.searchMenuTypes.includes('favorite')"
class="o_favorite_menu"
/>
</div>
<div
class="btn btn-primary o_mobile_search_show_result fixed-bottom"
t-on-click.stop="state.mobileSearchMode = ''"
>
<t>SEE RESULT</t>
</div>
</div>
</t>
</templates>
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Copyright 2019 Tecnativa - Alexandre Díaz
License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). -->
<template>
<t t-extend="mail.discuss.ControlButtons">
<t
t-jquery=".o_mail_discuss_button_multi_user_channel"
t-operation="attributes"
>
<attribute name="class" t-translation="off">
btn btn-secondary o_mail_discuss_button_multi_user_channel d-md-block
d-none
</attribute>
</t>
</t>
</template>
<?xml version="1.0" encoding="utf-8" ?>
<!--
Copyright 2017 LasLabs Inc.
Copyright 2018 Alexandre Díaz
Copyright 2018 Tecnativa - Jairo Llopis
License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
-->
<templates id="form_view" xml:space="preserve">
<!-- Template for buttons that display only the icon in xs -->
<t t-name="web_responsive.icon_button">
<i t-attf-class="fa fa-#{icon}" t-att-title="label" />
<span class="d-none d-sm-inline" t-esc="label" />
</t>
<t t-name="web_responsive.MenuStatusbarButtons">
<div class="dropdown">
<button
class="o_statusbar_buttons_dropdown btn btn-secondary dropdown-toggle"
type="button"
data-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false"
>
<t t-call="web_responsive.icon_button">
<t t-set="icon" t-value="'cogs'" />
<t t-set="label">Quick actions</t>
</t>
</button>
<!-- A div.o_statusbar_buttons.dropdown-menu
is appended here from JS -->
</div>
</t>
<t t-extend="FormView.buttons">
<!-- Change "Edit" button hotkey to "E" -->
<t t-jquery=".o_form_button_edit" t-operation="attributes">
<attribute name="accesskey">e</attribute>
</t>
<!-- Change "Discard" button hotkey to "D" -->
<t t-jquery=".o_form_button_cancel" t-operation="attributes">
<attribute name="accesskey">d</attribute>
</t>
<!-- Add responsive icons to buttons -->
<t t-jquery=".o_form_button_edit" t-operation="inner">
<t t-call="web_responsive.icon_button">
<t t-set="icon" t-value="'pencil'" />
<t t-set="label">Edit</t>
</t>
</t>
<t t-jquery=".o_form_button_create" t-operation="inner">
<t t-call="web_responsive.icon_button">
<t t-set="icon" t-value="'plus'" />
<t t-set="label">Create</t>
</t>
</t>
<t t-jquery=".o_form_button_save" t-operation="inner">
<t t-call="web_responsive.icon_button">
<t t-set="icon" t-value="'check'" />
<t t-set="label">Save</t>
</t>
</t>
<t t-jquery=".o_form_button_cancel" t-operation="inner">
<t t-call="web_responsive.icon_button">
<t t-set="icon" t-value="'times'" />
<t t-set="label">Discard</t>
</t>
</t>
</t>
<t t-extend="KanbanView.buttons">
<!-- Add responsive icons to buttons -->
<t t-jquery="button" t-operation="inner">
<t t-call="web_responsive.icon_button">
<t t-set="icon" t-value="'plus'" />
<t t-set="label" t-value="create_text || _t('Create')" />
</t>
</t>
</t>
<t t-extend="ListView.buttons">
<!-- Change "Discard" button hotkey to "D" -->
<t t-jquery=".o_list_button_discard" t-operation="attributes">
<attribute name="accesskey">d</attribute>
</t>
<!-- Add responsive icons to buttons -->
<t t-jquery=".o_list_button_add" t-operation="inner">
<t t-call="web_responsive.icon_button">
<t t-set="icon" t-value="'plus'" />
<t t-set="label">Create</t>
</t>
</t>
<t t-jquery=".o_list_button_save" t-operation="inner">
<t t-call="web_responsive.icon_button">
<t t-set="icon" t-value="'check'" />
<t t-set="label">Save</t>
</t>
</t>
<t t-jquery=".o_list_button_discard" t-operation="inner">
<t t-call="web_responsive.icon_button">
<t t-set="icon" t-value="'times'" />
<t t-set="label">Discard</t>
</t>
</t>
</t>
<t t-extend="CalendarView.navigation_buttons">
<!-- Add responsive icons to buttons -->
<t t-jquery=".o_calendar_button_today" t-operation="inner">
<t t-call="web_responsive.icon_button">
<t t-set="icon" t-value="'calendar-check-o'" />
<t t-set="label">Today</t>
</t>
</t>
</t>
</templates>
<?xml version="1.0" encoding="UTF-8" ?>
<templates id="template" xml:space="preserve">
<div t-extend="UserMenu.shortcuts">
<t
t-jquery="table.o_shortcut_table > tbody > tr > td:nth-child(2) > span:first-child"
t-operation="after"
>
+ <span class="o_key">Shift</span>
</t>
</div>
</templates>
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Copyright 2017-2018 Tecnativa - Jairo Llopis
License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). -->
<templates>
<t t-extend="Menu">
<t t-jquery=".o_menu_apps" t-operation="after">
<!-- Hamburger button to show submenus in sm screens -->
<button
class="o-menu-toggle d-md-none"
data-toggle="collapse"
data-target=".o_main_navbar .o_menu_sections"
>
<i class="fa fa-bars" />
</button>
</t>
</t>
</templates>
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Copyright 2021 Sergey Shebanin
License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). -->
<templates>
<t t-inherit="web.SearchPanel" t-inherit-mode="extension" owl="1">
<xpath expr="//div[hasclass('o_search_panel')]" position="inside">
<div
t-if="device.isMobile"
class="o_search_panel_summary"
t-on-click.stop="state.mobileSearch = true"
>
<div class="d-flex flex-wrap align-items-center">
<i class="fa fa-fw fa-filter mr-1" />
<t t-set="filters" t-value="getActiveSummary()" />
<span t-foreach="filters" t-as="filter" class="mx-1">
<i
t-if="filter.icon"
t-attf-class="fa {{ filter.icon }} mr-2"
t-att-style="filter.color and ('color: ' + filter.color)"
/>
<t
t-esc="filter.values.join(filter.type == 'category' ? ' / ' : ', ')"
/>
</span>
<t t-if="!filters.length">All</t>
</div>
</div>
<div
class="o_search_panel_content"
t-att-class="device.isMobile ? (state.mobileSearch ? 'o_mobile_search' : 'd-none'): ''"
/>
</xpath>
<xpath expr="//div[hasclass('o_search_panel_content')]" position="inside">
<div t-if="device.isMobile" class="o_mobile_search_header">
<span
class="o_mobile_search_close float-left mt16 mb16 mr8 ml16"
t-on-click.stop="state.mobileSearch = false"
>
<i class="fa fa-arrow-left" />
<strong class="float-right ml8">FILTER</strong>
</span>
</div>
<xpath expr="//section" position="move" />
<div
t-if="device.isMobile"
class="btn btn-primary o_mobile_search_show_result fixed-bottom"
t-on-click.stop="state.mobileSearch = false"
>
<t>SEE RESULT</t>
</div>
</xpath>
</t>
</templates>
from . import test_res_users
# Copyright 2018 Alexandre Díaz
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
from odoo.tests import common
class TestResUsers(common.TransactionCase):
def test_chatter_position_wr(self):
user_public = self.env.ref("base.public_user")
self.assertEqual(user_public.chatter_position, "sided")
user_public.with_user(user_public).write({"chatter_position": "normal"})
self.assertEqual(user_public.chatter_position, "normal")
<?xml version="1.0" encoding="utf-8" ?>
<!--
Copyright 2016 LasLabs Inc.
@author Dave Lasley <dave@laslabs.com>
License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
-->
<odoo>
<template
id="assets_backend"
name="Open Mobile Assets"
inherit_id="web.assets_backend"
>
<xpath expr="//link[last()]" position="after">
<link
type="text/css"
rel="stylesheet"
href="/web_responsive/static/src/scss/web_responsive.scss"
/>
<link
type="text/css"
rel="stylesheet"
href="/web_responsive/static/src/scss/search_view_mobile.scss"
/>
<link
type="text/css"
rel="stylesheet"
href="/web_responsive/static/src/scss/kanban_view_mobile.scss"
/>
</xpath>
<xpath expr="//script[last()]" position="after">
<script
type="application/javascript"
src="/web_responsive/static/src/js/web_responsive.js"
/>
<script
type="application/javascript"
src="/web_responsive/static/src/js/kanban_renderer_mobile.js"
/>
</xpath>
</template>
</odoo>
<?xml version="1.0" ?>
<!--
Copyright 2018
@author Alexanre Díaz <dev@redneboa.es>
License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
-->
<odoo>
<record id="view_users_form_simple_modif" model="ir.ui.view">
<field name="model">res.users</field>
<field name="inherit_id" ref="base.view_users_form_simple_modif" />
<field name="arch" type="xml">
<xpath expr="//field[@name='email']" position="after">
<field name="chatter_position" readonly="0" />
</xpath>
</field>
</record>
</odoo>
<?xml version="1.0" encoding="utf-8" ?>
<!--
Copyright 2018 Alexandre Díaz
License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
-->
<odoo>
<template
id="webclient_bootstrap"
inherit_id="web.webclient_bootstrap"
name="App Drawer - Web Client"
>
<xpath expr="//t[@t-set='body_classname']" position="attributes">
<attribute
name="t-value"
add="+ ' o_chatter_position_' + (request.env.user.chatter_position or 'normal')"
separator=" "
/>
</xpath>
</template>
<template
id="responsive_web_layout"
inherit_id="web.layout"
name="Responsive Layout"
>
<xpath expr="//meta[last()]" position="after">
<meta
name="viewport"
content="width=device-width, initial-scale=1, user-scalable=no"
/>
</xpath>
</template>
</odoo>
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!