Add basic Buefy form support when generating reports
apparently we have a lot of work to do yet for Buefy forms elsewhere...
This commit is contained in:
parent
4a198ce473
commit
a8db5db308
|
@ -2,7 +2,7 @@
|
||||||
################################################################################
|
################################################################################
|
||||||
#
|
#
|
||||||
# Rattail -- Retail Software Framework
|
# Rattail -- Retail Software Framework
|
||||||
# Copyright © 2010-2018 Lance Edgar
|
# Copyright © 2010-2019 Lance Edgar
|
||||||
#
|
#
|
||||||
# This file is part of Rattail.
|
# This file is part of Rattail.
|
||||||
#
|
#
|
||||||
|
@ -26,6 +26,7 @@ Forms Core
|
||||||
|
|
||||||
from __future__ import unicode_literals, absolute_import
|
from __future__ import unicode_literals, absolute_import
|
||||||
|
|
||||||
|
import json
|
||||||
import datetime
|
import datetime
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
@ -743,7 +744,12 @@ class Form(object):
|
||||||
context['request'] = self.request
|
context['request'] = self.request
|
||||||
context['readonly_fields'] = self.readonly_fields
|
context['readonly_fields'] = self.readonly_fields
|
||||||
context['render_field_readonly'] = self.render_field_readonly
|
context['render_field_readonly'] = self.render_field_readonly
|
||||||
return render('/forms/deform.mako', context)
|
return render(template, context)
|
||||||
|
|
||||||
|
def messages_json(self, messages):
|
||||||
|
dump = json.dumps(messages)
|
||||||
|
dump = dump.replace("'", ''')
|
||||||
|
return dump
|
||||||
|
|
||||||
def field_visible(self, field):
|
def field_visible(self, field):
|
||||||
if self.hidden and self.hidden.get(field):
|
if self.hidden and self.hidden.get(field):
|
||||||
|
|
|
@ -1,33 +1,53 @@
|
||||||
|
<!-- -*- mode: html; -*- -->
|
||||||
<div tal:define="css_class css_class|field.widget.css_class;
|
<div tal:define="css_class css_class|field.widget.css_class;
|
||||||
oid oid|field.oid;
|
oid oid|field.oid;
|
||||||
|
field_name field_name|field.name;
|
||||||
style style|field.widget.style;
|
style style|field.widget.style;
|
||||||
type_name type_name|field.widget.type_name;"
|
type_name type_name|field.widget.type_name;
|
||||||
|
use_buefy use_buefy|0;"
|
||||||
tal:omit-tag="">
|
tal:omit-tag="">
|
||||||
${field.start_mapping()}
|
|
||||||
<input type="${type_name}"
|
|
||||||
name="date"
|
|
||||||
value="${cstruct}"
|
|
||||||
|
|
||||||
tal:attributes="class string: ${css_class or ''} form-control;
|
<div tal:condition="not use_buefy" tal:omit-tag="">
|
||||||
style style"
|
${field.start_mapping()}
|
||||||
id="${oid}"/>
|
<input type="${type_name}"
|
||||||
${field.end_mapping()}
|
name="date"
|
||||||
<script type="text/javascript">
|
value="${cstruct}"
|
||||||
deform.addCallback(
|
|
||||||
'${oid}',
|
|
||||||
function deform_cb(oid) {
|
|
||||||
$('#' + oid).datepicker(${options_json});
|
|
||||||
}
|
|
||||||
);
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script tal:condition="selected_callback" type="text/javascript">
|
tal:attributes="class string: ${css_class or ''} form-control;
|
||||||
deform.addCallback(
|
style style"
|
||||||
'${oid}',
|
id="${oid}"/>
|
||||||
function (oid) {
|
${field.end_mapping()}
|
||||||
$('#' + oid).datepicker('option', 'onSelect', ${selected_callback});
|
<script type="text/javascript">
|
||||||
}
|
deform.addCallback(
|
||||||
);
|
'${oid}',
|
||||||
</script>
|
function deform_cb(oid) {
|
||||||
|
$('#' + oid).datepicker(${options_json});
|
||||||
|
}
|
||||||
|
);
|
||||||
|
</script>
|
||||||
|
<script tal:condition="selected_callback" type="text/javascript">
|
||||||
|
deform.addCallback(
|
||||||
|
'${oid}',
|
||||||
|
function (oid) {
|
||||||
|
$('#' + oid).datepicker('option', 'onSelect', ${selected_callback});
|
||||||
|
}
|
||||||
|
);
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div tal:condition="use_buefy">
|
||||||
|
${field.start_mapping()}
|
||||||
|
<b-datepicker placeholder="Click to select..."
|
||||||
|
name="date"
|
||||||
|
id="${oid}"
|
||||||
|
editable
|
||||||
|
icon-pack="fas"
|
||||||
|
icon="calendar-alt"
|
||||||
|
tal:attributes=":date-formatter 'formatDate';
|
||||||
|
:date-parser 'parseDate';
|
||||||
|
:value ('parseDate(\'' + cstruct + '\')') if cstruct else 'null'">
|
||||||
|
</b-datepicker>
|
||||||
|
${field.end_mapping()}
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
87
tailbone/templates/forms/deform_buefy.mako
Normal file
87
tailbone/templates/forms/deform_buefy.mako
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
## -*- coding: utf-8; -*-
|
||||||
|
|
||||||
|
<script type="text/x-template" id="buefy-form-template">
|
||||||
|
% if not readonly:
|
||||||
|
${h.form(form.action_url, id=dform.formid, method='post', enctype='multipart/form-data', **form_kwargs)}
|
||||||
|
${h.csrf_token(request)}
|
||||||
|
% endif
|
||||||
|
|
||||||
|
<section>
|
||||||
|
% for field in form.fields:
|
||||||
|
<% field = dform[field] %>
|
||||||
|
|
||||||
|
<b-field label="${form.get_label(field.name)}"
|
||||||
|
% if field.error:
|
||||||
|
type="is-danger"
|
||||||
|
:message='${form.messages_json(field.error.messages())|n}'
|
||||||
|
% endif
|
||||||
|
>
|
||||||
|
${field.serialize(use_buefy=True)|n}
|
||||||
|
</b-field>
|
||||||
|
|
||||||
|
% endfor
|
||||||
|
</section>
|
||||||
|
|
||||||
|
% if buttons:
|
||||||
|
<br />
|
||||||
|
${buttons|n}
|
||||||
|
% elif not readonly and (buttons is Undefined or (buttons is not None and buttons is not False)):
|
||||||
|
<br />
|
||||||
|
<div class="buttons">
|
||||||
|
${h.submit('save', getattr(form, 'submit_label', getattr(form, 'save_label', "Submit")), class_='button is-primary')}
|
||||||
|
% if getattr(form, 'show_reset', False):
|
||||||
|
<input type="reset" value="Reset" class="button" />
|
||||||
|
% endif
|
||||||
|
% if getattr(form, 'show_cancel', True):
|
||||||
|
% if form.mobile:
|
||||||
|
${h.link_to("Cancel", form.cancel_url, class_='ui-btn ui-corner-all')}
|
||||||
|
% else:
|
||||||
|
${h.link_to("Cancel", form.cancel_url, class_='cancel button{}'.format(' autodisable' if form.auto_disable_cancel else ''))}
|
||||||
|
% endif
|
||||||
|
% endif
|
||||||
|
</div>
|
||||||
|
% endif
|
||||||
|
|
||||||
|
% if not readonly:
|
||||||
|
${h.end_form()}
|
||||||
|
% endif
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<div id="buefy-form-app">
|
||||||
|
<buefy-form></buefy-form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
const BuefyForm = {
|
||||||
|
template: '#buefy-form-template',
|
||||||
|
methods: {
|
||||||
|
|
||||||
|
formatDate(date) {
|
||||||
|
// just need to convert to simple ISO date format here, seems
|
||||||
|
// like there should be a more obvious way to do that?
|
||||||
|
var year = date.getFullYear()
|
||||||
|
var month = date.getMonth() + 1
|
||||||
|
var day = date.getDate()
|
||||||
|
month = month < 10 ? '0' + month : month
|
||||||
|
day = day < 10 ? '0' + day : day
|
||||||
|
return year + '-' + month + '-' + day
|
||||||
|
},
|
||||||
|
|
||||||
|
parseDate(date) {
|
||||||
|
// note, this assumes classic YYYY-MM-DD (i.e. ISO?) format
|
||||||
|
var parts = date.split('-')
|
||||||
|
return new Date(parts[0], parseInt(parts[1]) - 1, parts[2])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Vue.component('buefy-form', BuefyForm)
|
||||||
|
|
||||||
|
new Vue({
|
||||||
|
el: '#buefy-form-app'
|
||||||
|
})
|
||||||
|
|
||||||
|
</script>
|
5
tailbone/templates/forms/form_buefy.mako
Normal file
5
tailbone/templates/forms/form_buefy.mako
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
## -*- coding: utf-8; -*-
|
||||||
|
|
||||||
|
<div class="form">
|
||||||
|
${form.render_deform(template='/forms/deform_buefy.mako')|n}
|
||||||
|
</div>
|
|
@ -16,7 +16,7 @@
|
||||||
|
|
||||||
<div class="form-wrapper">
|
<div class="form-wrapper">
|
||||||
<p style="padding: 1em;">${report.__doc__}</p>
|
<p style="padding: 1em;">${report.__doc__}</p>
|
||||||
${form.render()|n}
|
${form.render(template='/forms/form{}.mako'.format('_buefy' if use_buefy else ''))|n}
|
||||||
</div><!-- form-wrapper -->
|
</div><!-- form-wrapper -->
|
||||||
|
|
||||||
<ul id="context-menu">
|
<ul id="context-menu">
|
||||||
|
|
|
@ -380,6 +380,7 @@ class GenerateReport(View):
|
||||||
'report': report,
|
'report': report,
|
||||||
'form': form,
|
'form': form,
|
||||||
'dform': form.make_deform_form(),
|
'dform': form.make_deform_form(),
|
||||||
|
'use_buefy': self.get_use_buefy(),
|
||||||
}
|
}
|
||||||
|
|
||||||
def generate_thread(self, report, params, user_uuid, progress=None):
|
def generate_thread(self, report, params, user_uuid, progress=None):
|
||||||
|
|
Loading…
Reference in a new issue