Browse Source

APR 22: [FIX] Bug fixed 'table_reservation_on_website'

15.0
Cybrosys Technologies 4 days ago
parent
commit
2b35914baf
  1. 3
      table_reservation_on_website/__manifest__.py
  2. 3
      table_reservation_on_website/controllers/__init__.py
  3. 29
      table_reservation_on_website/controllers/pos_config.py
  4. 27
      table_reservation_on_website/controllers/table_reservation.py
  5. 6
      table_reservation_on_website/doc/RELEASE_NOTES.md
  6. 12
      table_reservation_on_website/models/pos_config.py
  7. BIN
      table_reservation_on_website/static/description/assets/screenshots/19.png
  8. BIN
      table_reservation_on_website/static/description/assets/screenshots/4.png
  9. 5
      table_reservation_on_website/static/description/index.html
  10. 108
      table_reservation_on_website/static/src/js/reservation.js
  11. 4
      table_reservation_on_website/static/src/js/reservation_floor.js
  12. 6
      table_reservation_on_website/static/src/js/table_reservation.js
  13. 20
      table_reservation_on_website/views/pos_config_views.xml
  14. 337
      table_reservation_on_website/views/table_reservation_templates.xml

3
table_reservation_on_website/__manifest__.py

@ -21,7 +21,7 @@
###############################################################################
{
'name': 'Table Reservation on Website',
'version': '15.0.1.0.0',
'version': '15.0.1.1.0',
'category': 'eCommerce,Point of Sale',
'summary': 'We can reserve table through website',
'description': 'We can reserve table through website. And also user can '
@ -53,6 +53,7 @@
'web.assets_frontend': [
'table_reservation_on_website/static/src/js/table_reservation.js',
'table_reservation_on_website/static/src/js/reservation_floor.js',
'table_reservation_on_website/static/src/js/reservation.js',
],
},
'images': ['static/description/banner.png'],

3
table_reservation_on_website/controllers/__init__.py

@ -20,4 +20,5 @@
#
###############################################################################
from . import main
from . import table_reservation_on_website
from . import table_reservation
from . import pos_config

29
table_reservation_on_website/controllers/pos_config.py

@ -0,0 +1,29 @@
from odoo import http
from odoo.http import request
class ResConfigSettingsController(http.Controller):
@http.route('/pos/get_opening_closing_hours', type='json', auth='public', methods=['POST'])
def get_opening_closing_hours(self):
pos_config = request.env['pos.config'].sudo().search([], limit=1, order="id desc")
# Ensure proper time format
try:
opening_hour = self.float_to_time(float(pos_config.opening_hour))
closing_hour = self.float_to_time(float(pos_config.closing_hour))
except ValueError:
opening_hour = "00:00"
closing_hour = "23:59"
if pos_config:
return {
'opening_hour': opening_hour,
'closing_hour': closing_hour
}
return {'error': 'POS configuration not found'}
def float_to_time(self, hour_float):
""" Convert float hours (e.g., 8.5 → 08:30) to HH:MM format """
hours = int(hour_float)
minutes = int((hour_float - hours) * 60)
return f"{hours:02d}:{minutes:02d}"

27
table_reservation_on_website/controllers/table_reservation_on_website.py → table_reservation_on_website/controllers/table_reservation.py

@ -30,8 +30,27 @@ class TableReservation(http.Controller):
@http.route(['/table_reservation'], type='http', auth='user', website=True)
def table_reservation(self):
"""For render table reservation template"""
pos_config = request.env['pos.config'].sudo().search([],limit=1,
order="id desc")
try:
opening_hour = self.float_to_time(
float(pos_config.opening_hour))
closing_hour = self.float_to_time(
float(pos_config.closing_hour))
except ValueError:
opening_hour = "00:00"
closing_hour = "23:59"
return http.request.render(
"table_reservation_on_website.table_reservation", {})
"table_reservation_on_website.table_reservation",
{'opening_hour': opening_hour,
'closing_hour': closing_hour})
def float_to_time(self, hour_float):
""" Convert float hours (e.g., 8.5 → 08:30) to HH:MM format """
hours = int(hour_float)
minutes = int((hour_float - hours) * 60)
return f"{hours:02d}:{minutes:02d}"
@http.route(['/restaurant/floors'], type='http', auth='user', website=True)
def restaurant_floors(self, **kwargs):
@ -54,7 +73,7 @@ class TableReservation(http.Controller):
"table_reservation_on_website.restaurant_floors", vals)
@http.route(['/restaurant/floors/tables'], type='json', auth='user',
website=True)
website=True )
def restaurant_floors_tables(self, **kwargs):
"""To get non-reserved table details"""
table_inbetween = []
@ -93,8 +112,8 @@ class TableReservation(http.Controller):
data_tables[rec.id]['rate'] = 0
return data_tables
@http.route(['/booking/confirm'], type="http", auth="public",
csrf=False, website=True)
@http.route(['/booking/confirm'], type="http", auth="public", methods=['POST'], website=True
)
def booking_confirm(self, **kwargs):
"""For booking tables"""
company = request.env.company

6
table_reservation_on_website/doc/RELEASE_NOTES.md

@ -5,3 +5,9 @@
#### ADD
- Initial commit for Table Reservation on Website
#### 01.04.2025
#### Version 15.0.1.1.0
#### UPDATE
- Updated module to set opening and closing hours.

12
table_reservation_on_website/models/pos_config.py

@ -35,3 +35,15 @@ class PosConfig(models.Model):
refund = fields.Text(string="No Refund Notes", help="No refund notes to "
"display in website",
config_parameter="table_reservation_on_website.refund")
set_opening_hours = fields.Boolean(string="Set Opening Hours",
help="Enable to configure restaurant opening and closing hours.",
config_parameter="table_"
"reservation_on_"
"website.reservation"
"set_opening_hours")
opening_hour = fields.Float(string="Opening Hours",
help="Restaurant opening hour in 24-hour format."
)
closing_hour = fields.Float(string="Closing Hours",
help="Restaurant closing hour in 24-hour format."
)

BIN
table_reservation_on_website/static/description/assets/screenshots/19.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

BIN
table_reservation_on_website/static/description/assets/screenshots/4.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 37 KiB

5
table_reservation_on_website/static/description/index.html

@ -175,7 +175,10 @@
<img src="assets/screenshots/3.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> Set Opening and Closing hours for table reservation</h3>
<img src="assets/screenshots/19.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> Select Your Date and Time</h3>
<img src="assets/screenshots/4.png" class="img-thumbnail">

108
table_reservation_on_website/static/src/js/reservation.js

@ -0,0 +1,108 @@
/** @odoo-module **/
import publicWidget from 'web.public.widget';
import { registry } from '@web/core/registry';
import { rpc } from "@web/core/network/rpc_service";
import ajax from "web.ajax";
publicWidget.registry.reservation = publicWidget.Widget.extend({
selector: '.container',
events: {
'change #date': '_onChangeDate',
'change #start_time': '_onChangeTime',
'change #end_time': '_onChangeTime',
'click .close_btn_alert_modal': '_onClickCloseBtn',
'click .close_btn_time_alert_modal': '_onClickCloseAlertBtn',
},
async start() {
this.openingHour = null;
this.closingHour = null;
await this._fetchOpeningClosingHours();
},
async _fetchOpeningClosingHours() {
try {
const result = await ajax.jsonRpc("/pos/get_opening_closing_hours", "call", {});
if (result && !result.error) {
this.openingHour = result.opening_hour;
this.closingHour = result.closing_hour;
} else {
console.error("Error: ", result.error);
}
} catch (error) {
console.error("Failed to fetch opening and closing hours:", error);
}
},
_onChangeDate: function (ev) {
let selectedDate = new Date(this.$el.find("#date").val());
const currentDate = new Date();
if (selectedDate.setHours(0, 0, 0, 0) < currentDate.setHours(0, 0, 0, 0)) {
this.$el.find("#alert_modal").show();
this.$el.find("#date").val('');
}
this._onChangeTime();
},
_onClickCloseBtn: function() {
this.$el.find("#alert_modal").hide();
},
_onChangeTime: function() {
let start_time = this.$el.find("#start_time");
let end_time = this.$el.find("#end_time");
let now = new Date();
let currentHours = now.getHours().toString().padStart(2, '0');
let currentMinutes = now.getMinutes().toString().padStart(2, '0');
let currentTime = `${currentHours}:${currentMinutes}`;
const currentDate = new Date();
const formattedDate = currentDate.toISOString().split('T')[0];
if (start_time.val() && end_time.val()) {
if (start_time.val() > end_time.val() || start_time.val() == end_time.val()) {
this.$el.find("#time_alert_modal").show();
start_time.val('');
end_time.val('');
return;
}
}
if (!this.openingHour || !this.closingHour) {
console.warn("Opening and closing hours are not set.");
return;
}
if (start_time.val() && (start_time.val() < this.openingHour || start_time.val() > this.closingHour)) {
this.$el.find("#time_alert_modal").show();
start_time.val('');
end_time.val('');
return;
}
if (end_time.val() && (end_time.val() < this.openingHour || end_time.val() > this.closingHour)) {
this.$el.find("#time_alert_modal").show();
start_time.val('');
end_time.val('');
return;
}
if (formattedDate == this.$el.find("#date").val()) {
if (start_time.val() && start_time.val() < currentTime) {
this.$el.find("#time_alert_modal").show();
start_time.val('');
end_time.val('');
return;
}
if (end_time.val() && end_time.val() < currentTime) {
this.$el.find("#time_alert_modal").show();
start_time.val('');
end_time.val('');
return;
}
}
},
_onClickCloseAlertBtn: function() {
this.$el.find("#time_alert_modal").hide();
}
});

4
table_reservation_on_website/static/src/js/reservation_floor.js

@ -15,20 +15,16 @@ publicWidget.registry.table_reservation_floor = publicWidget.Widget.extend({
var count = this.$el.find('#count_table')[0];
var amount = this.$el.find('#total_amount')[0];
var booked = this.$el.find('#tables_input')[0];
var table_count = this.$el.find('#tables_counts')[0];
count.innerText = table_count.value
if (current_div_id.style.backgroundColor == 'green'){
booked_table.splice(booked_table.indexOf(Number(current_div_id.id)), 1);
current_div_id.style.backgroundColor = '#96ccd5';
count.innerText = Number(count.innerText) - 1;
amount.innerText = Number(amount.innerText) - Number(rate)
table_count.value = Number(count.innerText);
}
else{
current_div_id.style.backgroundColor = 'green'
count.innerText = Number(count.innerText) + 1;
booked_table.push(Number(current_div_id.id))
table_count.value = Number(count.innerText);
if (amount.innerText){
amount.innerText = Number(rate) + Number(amount.innerText)
}

6
table_reservation_on_website/static/src/js/table_reservation.js

@ -12,15 +12,15 @@ publicWidget.registry.table_reservation = publicWidget.Widget.extend({
**/
_onFloorChange: function () {
var floors = this.$el.find("#floors_rest")[0].value;
var date = this.$el.find("#date_id").prevObject[0].offsetParent.lastElementChild[1].defaultValue
var start = this.$el.find("#start_id").prevObject[0].offsetParent.lastElementChild[2].defaultValue
var date = $("#date_id").val();
var start = $("#start_id").val();
document.getElementById('count_table').innerText = 0;
document.getElementById('total_amount').innerText = 0;
ajax.jsonRpc("/restaurant/floors/tables", 'call', {
'floors_id' : floors,
'date': date,
'start':start,
})
})
.then(function (data) {
if(floors == 0){
$('#table_container_row').empty();

20
table_reservation_on_website/views/pos_config_views.xml

@ -26,6 +26,26 @@
<field name="refund"/>
</div>
</div>
<!-- New Fields for Opening Hours -->
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="set_opening_hours"/>
</div>
<div class="o_setting_right_pane">
<label for="set_opening_hours"/>
<div class="text-muted">
Set opening and closing hours for restaurant reservation
</div>
</div>
<div class="o_setting_right_pane" style="display:flex;"
attrs="{'invisible': [('set_opening_hours', '=', False)]}">
Opening Hour:<field name="opening_hour"/>
</div>
<div class="o_setting_right_pane" style="display:flex;"
attrs="{'invisible': [('set_opening_hours', '=', False)]}">
Closing Hour: <field name="closing_hour"/>
</div>
</div>
</xpath>
</field>
</record>

337
table_reservation_on_website/views/table_reservation_templates.xml

@ -1,11 +1,100 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!--Template for time and slots-->
<!-- <template id="table_reservation" name="Table Reservation">-->
<!-- <t t-call="website.layout">-->
<!-- <div id="wrap" class="oe_structure oe_empty">-->
<!-- <section class="s_website_form" data-vcss="001"-->
<!-- data-snippet="s_website_form">-->
<!-- <div class="container">-->
<!-- <form id="reservationForm" action="/restaurant/floors" method="post" enctype="multipart/form-data" class="oe_import">-->
<!-- <input type="hidden" name="csrf_token"-->
<!-- t-att-value="request.csrf_token()"/>-->
<!-- <center>-->
<!-- <br/>-->
<!-- <br/>-->
<!-- <h1>-->
<!-- <b>Table Reservation</b>-->
<!-- </h1>-->
<!-- <br/>-->
<!-- <br/>-->
<!-- <div>-->
<!-- <div class="form-group row"-->
<!-- style="width:70%;padding-left:15%;">-->
<!-- <label for="date"-->
<!-- class="col-2 col-form-label">-->
<!-- Date-->
<!-- </label>-->
<!-- <div class="col-4">-->
<!-- <input type="date"-->
<!-- name="date"-->
<!-- class="form-control"-->
<!-- id="date"-->
<!-- required="1"/>-->
<!-- </div>-->
<!-- </div>-->
<!-- <br/>-->
<!-- </div>-->
<!-- </center>-->
<!-- <center>-->
<!-- <div class="s_website_form_rows row s_col_no_bgcolor">-->
<!-- <div class="row"-->
<!-- style="padding-left:32%;width:85%;">-->
<!-- <div class="col-2">-->
<!-- <strong>Slots:</strong>-->
<!-- </div>-->
<!-- <div class="col-2">-->
<!-- <label for="start_time">-->
<!-- Start Time-->
<!-- </label>-->
<!-- </div>-->
<!-- <div class="col-3">-->
<!-- <input id="start_time"-->
<!-- name="start_time"-->
<!-- type="time"-->
<!-- class="form-control s_website_form_input"-->
<!-- required="1"/>-->
<!-- </div>-->
<!-- </div>-->
<!-- <br/>-->
<!-- <br/>-->
<!-- <div class="row"-->
<!-- style="padding-left:40%;width:95%;">-->
<!-- <div class="col-2">-->
<!-- <label for="end_time">-->
<!-- End Time-->
<!-- </label>-->
<!-- </div>-->
<!-- <div class="col-3">-->
<!-- <input id="end_time"-->
<!-- name="end_time"-->
<!-- type="time"-->
<!-- class="form-control s_website_form_input"-->
<!-- required="1"/>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </center>-->
<!-- <br/>-->
<!-- <div class="row" data-name="Submit Button">-->
<!-- <div class="col-sm-2" style="padding-left:45%;">-->
<!-- <button type="submit"-->
<!-- class="btn btn-primary">-->
<!-- Submit-->
<!-- </button>-->
<!-- </div>-->
<!-- </div>-->
<!-- </form>-->
<!-- </div>-->
<!-- </section>-->
<!-- </div>-->
<!-- </t>-->
<!-- </template>-->
<template id="table_reservation" name="Table Reservation">
<t t-call="website.layout">
<div id="wrap" class="oe_structure oe_empty">
<section class="s_website_form" data-vcss="001"
data-snippet="s_website_form">
<section class="s_text_block pt40 pb40 o_colored_level "
data-snippet="s_text_block">
<div class="container">
<form action="/restaurant/floors" method="POST"
enctype="multipart/form-data"
@ -19,6 +108,9 @@
<b>Table Reservation</b>
</h1>
<br/>
<t t-if="opening_hour and closing_hour">
<h4>Opening Hours: <t t-esc="opening_hour"/> - <t t-esc="closing_hour"/></h4>
</t>
<br/>
<div>
<div class="form-group row"
@ -77,6 +169,86 @@
</div>
</div>
</center>
<center>
<div class="modal" tabindex="-1" id="alert_modal">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Invalid
Date
</h5>
</div>
<hr class="m-0"/>
<div class="modal-body">
<p>Please select a valid date.</p>
</div>
<hr class="m-0"/>
<div class="modal-footer">
<button type="button"
class="btn btn-secondary close_btn_alert_modal"
data-bs-dismiss="modal">
Close
</button>
</div>
</div>
</div>
</div>
</center>
<center>
<div class="modal" tabindex="-1"
id="time_alert_modal">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Invalid
Time
</h5>
</div>
<hr class="m-0"/>
<div class="modal-body">
<p>Please select a valid booking
start and end time.
</p>
</div>
<hr class="m-0"/>
<div class="modal-footer">
<button type="button"
class="btn btn-secondary close_btn_time_alert_modal"
data-bs-dismiss="modal">
Close
</button>
</div>
</div>
</div>
</div>
</center>
<center>
<div class="modal" tabindex="-1"
id="open_hours_alert_modal">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Invalid
Time
</h5>
</div>
<hr class="m-0"/>
<div class="modal-body">
<p>Select a time between the opening and closing hours
</p>
</div>
<hr class="m-0"/>
<div class="modal-footer">
<button type="button"
class="btn btn-secondary close_btn_time_alert_modal"
data-bs-dismiss="modal">
Close
</button>
</div>
</div>
</div>
</div>
</center>
<br/>
<div class="row" data-name="Submit Button">
<div class="col-sm-2" style="padding-left:45%;">
@ -93,17 +265,157 @@
</t>
</template>
<!-- Template for floors-->
<template id="restaurant_floors" name="Admission Submit">
<!-- <template id="restaurant_floors" name="Admission Submit">-->
<!-- <t t-call="website.layout">-->
<!-- <div id="wrap" class="oe_structure oe_empty">-->
<!-- <section class="s_website_form" data-vcss="001"-->
<!-- data-snippet="s_website_form">-->
<!-- <div class="container">-->
<!-- <br/>-->
<!-- <br/>-->
<!-- <form action="/booking/confirm" method="POST"-->
<!-- enctype="multipart/form-data"-->
<!-- class="oe_import">-->
<!-- <div class="row">-->
<!-- <div class="col-2">-->
<!-- <span>Select Your Floor</span>-->
<!-- </div>-->
<!-- <div class="col-2" id="restaurant_floors">-->
<!-- <select name="floors"-->
<!-- id="floors_rest"-->
<!-- class="form-control">-->
<!-- <option value="0">Select a-->
<!-- Floor-->
<!-- </option>-->
<!-- <t t-foreach="floors" t-as="floor">-->
<!-- <option t-att-value="floor.id">-->
<!-- <t t-esc="floor.name"/>-->
<!-- </option>-->
<!-- </t>-->
<!-- </select>-->
<!-- </div>-->
<!-- </div>-->
<!-- <br/>-->
<!-- <br/>-->
<!-- <br/>-->
<!-- <div id="info" style=" display: none;">-->
<!-- <div id="tableContainer"-->
<!-- style="width:100%;display:flex;">-->
<!-- <div class="row" id="table_container_row">-->
<!-- </div>-->
<!-- <div class="card"-->
<!-- style="background-color:#c8e0e0;width:1000px;height:370px;border:0;">-->
<!-- <div class="card-body"-->
<!-- style="border:1px;">-->
<!-- <h5 class="card-title"-->
<!-- style="Font-size:45px;">Booking-->
<!-- Info-->
<!-- </h5>-->
<!-- <table style="border:0;">-->
<!-- <tr>-->
<!-- <td>-->
<!-- Date:-->
<!-- </td>-->
<!-- <td style="text-align:right;">-->
<!-- <t t-esc="date"/>-->
<!-- </td>-->
<!-- </tr>-->
<!-- <tr>-->
<!-- <td>Start Time:</td>-->
<!-- <td style="text-align:right;">-->
<!-- <t t-esc="start_time"/>-->
<!-- </td>-->
<!-- </tr>-->
<!-- <tr>-->
<!-- <td>End Time:</td>-->
<!-- <td style="text-align:right;">-->
<!-- <t t-esc="end_time"/>-->
<!-- </td>-->
<!-- </tr>-->
<!-- <tr>-->
<!-- <td>-->
<!-- <b>Booking Amount-->
<!-- For <span-->
<!-- id="count_table">-->
<!-- 0-->
<!-- </span>Tables-->
<!-- </b>-->
<!-- </td>-->
<!-- <td style="text-align:right;">-->
<!-- <span id="total_amount">-->
<!-- </span>-->
<!-- </td>-->
<!-- </tr>-->
<!-- </table>-->
<!-- <span hidden="hidden">-->
<!-- <input name="date"-->
<!-- id="date_id"-->
<!-- ref="dateInput"-->
<!-- class="form-control border-0 p-0"-->
<!-- type="text"-->
<!-- data-allow-hotkeys="true"-->
<!-- t-att-value="date"-->
<!-- t-ref="autofocus"/>-->
<!-- <input name="start_time"-->
<!-- id="start_id"-->
<!-- class="form-control border-0 p-0"-->
<!-- type="text"-->
<!-- data-allow-hotkeys="true"-->
<!-- t-att-value="start_time"-->
<!-- t-ref="autofocus"/>-->
<!-- <input name="end_time"-->
<!-- class="form-control border-0 p-0"-->
<!-- type="text"-->
<!-- data-allow-hotkeys="true"-->
<!-- t-att-value="end_time"-->
<!-- t-ref="autofocus"/>-->
<!-- <input name="tables"-->
<!-- id="tables_input"-->
<!-- class="form-control border-0 p-0"-->
<!-- type="text"-->
<!-- data-allow-hotkeys="true"-->
<!-- t-ref="autofocus">-->
<!-- </input>-->
<!-- <input name="tables_count"-->
<!-- id="tables_counts"-->
<!-- class="form-control border-0 p-0"-->
<!-- type="text"-->
<!-- data-allow-hotkeys="true"-->
<!-- t-ref="autofocus">-->
<!-- </input>-->
<!-- </span>-->
<!-- <button type="submit"-->
<!-- class="btn btn-primary">-->
<!-- Booking Confirm-->
<!-- </button>-->
<!-- </div>-->
<!-- <div style="line-height:1px;background: #ffffff;border:0;">-->
<!-- </div>-->
<!-- <t t-if="payment">-->
<!-- <div style="background: #ffffff;border:0;color:#FF0000;">-->
<!-- <t t-esc="refund"/>-->
<!-- </div>-->
<!-- </t>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <br/>-->
<!-- </form>-->
<!-- </div>-->
<!-- </section>-->
<!-- </div>-->
<!-- </t>-->
<!-- </template>-->
<template id="restaurant_floors" name="Admission Submit">
<t t-call="website.layout">
<div id="wrap" class="oe_structure oe_empty">
<section class="s_website_form" data-vcss="001"
data-snippet="s_website_form">
<section class="s_text_block pt40 pb40 o_colored_level "
data-snippet="s_text_block">
<div class="container">
<br/>
<br/>
<form action="/booking/confirm" method="POST"
enctype="multipart/form-data"
class="oe_import">
<form action="/booking/confirm" method="POST" enctype="multipart/form-data" class="oe_import">
<input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
<div class="row">
<div class="col-2">
<span>Select Your Floor</span>
@ -178,7 +490,6 @@
<span hidden="hidden">
<input name="date"
id="date_id"
ref="dateInput"
class="form-control border-0 p-0"
type="text"
data-allow-hotkeys="true"
@ -204,13 +515,6 @@
data-allow-hotkeys="true"
t-ref="autofocus">
</input>
<input name="tables_count"
id="tables_counts"
class="form-control border-0 p-0"
type="text"
data-allow-hotkeys="true"
t-ref="autofocus">
</input>
</span>
<button type="submit"
class="btn btn-primary">
@ -234,4 +538,5 @@
</div>
</t>
</template>
</odoo>

Loading…
Cancel
Save