mirror of https://github.com/OCA/web.git
web_widget_digital_signature_sale_order was moved in sale workflow https://github.com/OCA/sale-workflow/pull/252
Rename module this module in web_widget_digitized_signaturepull/267/head
parent
7f8e41a6e3
commit
59f262c01b
|
@ -1,53 +0,0 @@
|
|||
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
|
||||
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
|
||||
:alt: License: AGPL-3
|
||||
|
||||
=====================================
|
||||
Web Digital Signature for sale orders
|
||||
=====================================
|
||||
|
||||
This module adds a signature field to sale order form, so that salesman can let customers sign their quotations.
|
||||
|
||||
Usage
|
||||
=====
|
||||
|
||||
Just open a quotation and sign it.
|
||||
|
||||
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
|
||||
:alt: Try me on Runbot
|
||||
:target: https://runbot.odoo-community.org/runbot/162/8.0
|
||||
|
||||
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:%20
|
||||
web_widget_digital_signature_sale_order%0Aversion:%20
|
||||
8.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
|
||||
|
||||
Credits
|
||||
=======
|
||||
|
||||
Contributors
|
||||
------------
|
||||
|
||||
* Lorenzo Battistini <lorenzo.battistini@agilebg.com>
|
||||
|
||||
Maintainer
|
||||
----------
|
||||
|
||||
.. image:: https://odoo-community.org/logo.png
|
||||
:alt: Odoo Community Association
|
||||
:target: https://odoo-community.org
|
||||
|
||||
This module is maintained by the OCA.
|
||||
|
||||
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.
|
||||
|
||||
To contribute to this module, please visit https://odoo-community.org.
|
|
@ -1,10 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Copyright 2015 Lorenzo Battistini - Agile Business Group
|
||||
#
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from . import models
|
|
@ -1,27 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Copyright 2015 Lorenzo Battistini - Agile Business Group
|
||||
#
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
{
|
||||
"name": "Web Digital Signature for sale orders",
|
||||
"version": "8.0.1.0.0",
|
||||
"author": "Agile Business Group, "
|
||||
"Odoo Community Association (OCA)",
|
||||
"category": 'web',
|
||||
"license": "AGPL-3",
|
||||
'depends': ['web_widget_digital_signature', 'sale'],
|
||||
'data': [
|
||||
'views/sale_order_view.xml'
|
||||
],
|
||||
'images': [
|
||||
'images/so_signature.png',
|
||||
],
|
||||
'website': 'http://www.agilebg.com',
|
||||
'installable': True,
|
||||
'auto_install': False,
|
||||
}
|
Binary file not shown.
Before Width: | Height: | Size: 37 KiB |
|
@ -1,10 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Copyright 2015 Lorenzo Battistini - Agile Business Group
|
||||
#
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from . import sale_order
|
|
@ -1,16 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Copyright 2015 Lorenzo Battistini - Agile Business Group
|
||||
#
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from openerp import models, fields
|
||||
|
||||
|
||||
class Users(models.Model):
|
||||
_inherit = 'sale.order'
|
||||
|
||||
signature_image = fields.Binary(string='Signature')
|
Binary file not shown.
Before Width: | Height: | Size: 5.6 KiB |
|
@ -1,19 +0,0 @@
|
|||
<?xml version="1.0" ?>
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<record id="view_order_form_signature" model="ir.ui.view">
|
||||
<field name="name">view_order_form_signature</field>
|
||||
<field name="model">sale.order</field>
|
||||
<field name="inherit_id" ref="sale.view_order_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='note']" position="after">
|
||||
<div class="oe_clear"/>
|
||||
<label for="signature_image" class="oe_edit_only"/>
|
||||
<h2><field name="signature_image" widget="signature" width="400" height="100"/></h2>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
|
@ -30,7 +30,7 @@ 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:%20
|
||||
web_widget_digital_signature%0Aversion:%20
|
||||
web_widget_digitized_signature%0Aversion:%20
|
||||
8.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
|
||||
|
||||
Credits
|
|
@ -12,7 +12,7 @@
|
|||
##############################################################################
|
||||
|
||||
{
|
||||
"name": "Web Digital Signature",
|
||||
"name": "Web Widget Digitized Signature",
|
||||
"version": "8.0.1.0.0",
|
||||
"author": "Serpent Consulting Services Pvt. Ltd., "
|
||||
"Odoo Community Association (OCA)",
|
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 8.9 KiB |
|
@ -1,246 +1,246 @@
|
|||
|
||||
(function($) { // Hide scope, no $ conflict
|
||||
|
||||
var signatureOverrides = {
|
||||
|
||||
// Global defaults for signature
|
||||
options: {
|
||||
background: '#ffffff', // Colour of the background
|
||||
color: '#000000', // Colour of the signature
|
||||
thickness: 2, // Thickness of the lines
|
||||
guideline: false, // Add a guide line or not?
|
||||
guidelineColor: '#a0a0a0', // Guide line colour
|
||||
guidelineOffset: 50, // Guide line offset from the bottom
|
||||
guidelineIndent: 10, // Guide line indent from the edges
|
||||
notAvailable: 'Your browser doesn\'t support signing', // Error message when no canvas
|
||||
syncField: null, // Selector for synchronised text field
|
||||
change: null, // Callback when signature changed
|
||||
width: 170,
|
||||
height: 50
|
||||
},
|
||||
|
||||
/* Initialise a new signature area. */
|
||||
_create: function() {
|
||||
|
||||
|
||||
this.element.addClass(this.widgetFullName || this.widgetBaseClass);
|
||||
try {
|
||||
this.canvas = $('<canvas width="' + this.options.width + '" height="' +
|
||||
this.options.height + '">' + '' + '</canvas>')[0];
|
||||
this.element.prepend(this.canvas);
|
||||
this.element.find('img').remove();
|
||||
this.ctx = this.canvas.getContext('2d');
|
||||
}
|
||||
catch (e) {
|
||||
$(this.canvas).remove();
|
||||
this.resize = true;
|
||||
this.canvas = document.createElement('canvas');
|
||||
this.canvas.setAttribute('width', this.element.width());
|
||||
this.canvas.setAttribute('height', this.element.height());
|
||||
this.canvas.innerHTML = this.options.notAvailable;
|
||||
this.element.append(this.canvas);
|
||||
if (G_vmlCanvasManager) { // Requires excanvas.js
|
||||
G_vmlCanvasManager.initElement(this.canvas);
|
||||
}
|
||||
this.ctx = this.canvas.getContext('2d');
|
||||
}
|
||||
this._refresh(true);
|
||||
this._mouseInit();
|
||||
},
|
||||
|
||||
/* Refresh the appearance of the signature area.
|
||||
@param init (boolean, internal) true if initialising */
|
||||
_refresh: function(init) {
|
||||
if (this.resize) {
|
||||
var parent = $(this.canvas);
|
||||
$('div', this.canvas).css({width: parent.width(), height: parent.height()});
|
||||
}
|
||||
this.ctx.fillStyle = this.options.background;
|
||||
this.ctx.strokeStyle = this.options.color;
|
||||
this.ctx.lineWidth = this.options.thickness;
|
||||
this.ctx.lineCap = 'round';
|
||||
this.ctx.lineJoin = 'round';
|
||||
this.clear(init);
|
||||
},
|
||||
|
||||
/* Clear the signature area.
|
||||
@param init (boolean, internal) true if initialising */
|
||||
clear: function(init) {
|
||||
this.ctx.fillRect(0, 0, this.element.width(), this.element.height());
|
||||
if (this.options.guideline) {
|
||||
this.ctx.save();
|
||||
this.ctx.strokeStyle = this.options.guidelineColor;
|
||||
this.ctx.lineWidth = 1;
|
||||
this.ctx.beginPath();
|
||||
this.ctx.moveTo(this.options.guidelineIndent,
|
||||
this.element.height() - this.options.guidelineOffset);
|
||||
this.ctx.lineTo(this.element.width() - this.options.guidelineIndent,
|
||||
this.element.height() - this.options.guidelineOffset);
|
||||
this.ctx.stroke();
|
||||
this.ctx.restore();
|
||||
}
|
||||
this.lines = [];
|
||||
if (!init) {
|
||||
this._changed();
|
||||
}
|
||||
},
|
||||
|
||||
/* Synchronise changes and trigger change event.
|
||||
@param event (Event) the triggering event */
|
||||
_changed: function(event) {
|
||||
if (this.options.syncField) {
|
||||
$(this.options.syncField).val(this.toJSON());
|
||||
}
|
||||
this._trigger('change', event, {});
|
||||
},
|
||||
|
||||
/* Custom options handling.
|
||||
@param options (object) the new option values */
|
||||
_setOptions: function(options) {
|
||||
if (this._superApply) {
|
||||
this._superApply(arguments); // Base widget handling
|
||||
}
|
||||
else {
|
||||
$.Widget.prototype._setOptions.apply(this, arguments); // Base widget handling
|
||||
}
|
||||
this._refresh();
|
||||
},
|
||||
|
||||
/* Determine if dragging can start.
|
||||
@param event (Event) the triggering mouse event
|
||||
@return (boolean) true if allowed, false if not */
|
||||
_mouseCapture: function(event) {
|
||||
return !this.options.disabled;
|
||||
},
|
||||
|
||||
/* Start a new line.
|
||||
@param event (Event) the triggering mouse event */
|
||||
_mouseStart: function(event) {
|
||||
this.offset = this.element.offset();
|
||||
this.offset.left -= document.documentElement.scrollLeft || document.body.scrollLeft;
|
||||
this.offset.top -= document.documentElement.scrollTop || document.body.scrollTop;
|
||||
this.lastPoint = [this._round(event.clientX - this.offset.left),
|
||||
this._round(event.clientY - this.offset.top)];
|
||||
this.curLine = [this.lastPoint];
|
||||
this.lines.push(this.curLine);
|
||||
},
|
||||
|
||||
/* Track the mouse.
|
||||
@param event (Event) the triggering mouse event */
|
||||
_mouseDrag: function(event) {
|
||||
var point = [this._round(event.clientX - this.offset.left),
|
||||
this._round(event.clientY - this.offset.top)];
|
||||
this.curLine.push(point);
|
||||
this.ctx.beginPath();
|
||||
this.ctx.moveTo(this.lastPoint[0], this.lastPoint[1]);
|
||||
this.ctx.lineTo(point[0], point[1]);
|
||||
this.ctx.stroke();
|
||||
this.lastPoint = point;
|
||||
},
|
||||
|
||||
/* End a line.
|
||||
@param event (Event) the triggering mouse event */
|
||||
_mouseStop: function(event) {
|
||||
this.lastPoint = null;
|
||||
this.curLine = null;
|
||||
this._changed(event);
|
||||
},
|
||||
|
||||
/* Round to two decimal points.
|
||||
@param value (number) the value to round
|
||||
@return (number) the rounded value */
|
||||
_round: function(value) {
|
||||
return Math.round(value * 100) / 100;
|
||||
},
|
||||
|
||||
/* Convert the captured lines to JSON text.
|
||||
@return (string) the JSON text version of the lines */
|
||||
toJSON: function() {
|
||||
return '{"lines":[' + $.map(this.lines, function(line) {
|
||||
return '[' + $.map(line, function(point) {
|
||||
return '[' + point + ']';
|
||||
}) + ']';
|
||||
}) + ']}';
|
||||
},
|
||||
|
||||
/* Convert the captured lines to SVG text.
|
||||
@return (string) the SVG text version of the lines */
|
||||
toSVG: function() {
|
||||
return '<?xml version="1.0"?>\n<!DOCTYPE svg PUBLIC ' +
|
||||
'"-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n' +
|
||||
'<svg xmlns="http://www.w3.org/2000/svg" width="15cm" height="15cm">\n' +
|
||||
' <g fill="' + this.options.background + '">\n' +
|
||||
' <rect x="0" y="0" width="' + this.canvas.width +
|
||||
'" height="' + this.canvas.height + '"/>\n' +
|
||||
' <g fill="none" stroke="' + this.options.color + '" stroke-width="' +
|
||||
this.options.thickness + '">\n'+
|
||||
$.map(this.lines, function(line) {
|
||||
return ' <polyline points="' +
|
||||
$.map(line, function(point) { return point + ''; }).join(' ') + '"/>\n';
|
||||
}).join('') +
|
||||
' </g>\n </g>\n</svg>\n';
|
||||
},
|
||||
|
||||
/* Draw a signature from its JSON description.
|
||||
@param sigJSON (object) object with attribute lines
|
||||
being an array of arrays of points or
|
||||
(string) text version of the JSON */
|
||||
draw: function(sigJSON) {
|
||||
this.clear(true);
|
||||
if (typeof sigJSON === 'string') {
|
||||
sigJSON = $.parseJSON(sigJSON);
|
||||
}
|
||||
this.lines = sigJSON.lines || [];
|
||||
var ctx = this.ctx;
|
||||
$.each(this.lines, function() {
|
||||
ctx.beginPath();
|
||||
$.each(this, function(i) {
|
||||
ctx[i === 0 ? 'moveTo' : 'lineTo'](this[0], this[1]);
|
||||
});
|
||||
ctx.stroke();
|
||||
});
|
||||
this._changed();
|
||||
},
|
||||
|
||||
/* Determine whether or not any drawing has occurred.
|
||||
@return (boolean) true if not signed, false if signed */
|
||||
isEmpty: function() {
|
||||
return this.lines.length === 0;
|
||||
},
|
||||
|
||||
/* Remove the signature functionality. */
|
||||
_destroy: function() {
|
||||
this.element.removeClass(this.widgetFullName || this.widgetBaseClass);
|
||||
$(this.canvas).remove();
|
||||
this.canvas = this.ctx = this.lines = null;
|
||||
this._mouseDestroy();
|
||||
}
|
||||
};
|
||||
|
||||
if (!$.Widget.prototype._destroy) {
|
||||
$.extend(signatureOverrides, {
|
||||
/* Remove the signature functionality. */
|
||||
destroy: function() {
|
||||
this._destroy();
|
||||
$.Widget.prototype.destroy.call(this); // Base widget handling
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if($.Widget.prototype._getCreateOptions === $.noop) {
|
||||
$.extend(signatureOverrides, {
|
||||
/* Restore the metadata functionality. */
|
||||
_getCreateOptions: function() {
|
||||
return $.metadata && $.metadata.get(this.element[0])[this.widgetName];
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* Signature capture and display.
|
||||
Depends on jquery.ui.widget, jquery.ui.mouse. */
|
||||
$.widget('kbw.signature', $.ui.mouse, signatureOverrides);
|
||||
|
||||
// Make some things more accessible
|
||||
$.kbw.signature.options = $.kbw.signature.prototype.options;
|
||||
|
||||
})(jQuery);
|
||||
|
||||
(function($) { // Hide scope, no $ conflict
|
||||
|
||||
var signatureOverrides = {
|
||||
|
||||
// Global defaults for signature
|
||||
options: {
|
||||
background: '#ffffff', // Colour of the background
|
||||
color: '#000000', // Colour of the signature
|
||||
thickness: 2, // Thickness of the lines
|
||||
guideline: false, // Add a guide line or not?
|
||||
guidelineColor: '#a0a0a0', // Guide line colour
|
||||
guidelineOffset: 50, // Guide line offset from the bottom
|
||||
guidelineIndent: 10, // Guide line indent from the edges
|
||||
notAvailable: 'Your browser doesn\'t support signing', // Error message when no canvas
|
||||
syncField: null, // Selector for synchronised text field
|
||||
change: null, // Callback when signature changed
|
||||
width: 170,
|
||||
height: 50
|
||||
},
|
||||
|
||||
/* Initialise a new signature area. */
|
||||
_create: function() {
|
||||
|
||||
|
||||
this.element.addClass(this.widgetFullName || this.widgetBaseClass);
|
||||
try {
|
||||
this.canvas = $('<canvas width="' + this.options.width + '" height="' +
|
||||
this.options.height + '">' + '' + '</canvas>')[0];
|
||||
this.element.prepend(this.canvas);
|
||||
this.element.find('img').remove();
|
||||
this.ctx = this.canvas.getContext('2d');
|
||||
}
|
||||
catch (e) {
|
||||
$(this.canvas).remove();
|
||||
this.resize = true;
|
||||
this.canvas = document.createElement('canvas');
|
||||
this.canvas.setAttribute('width', this.element.width());
|
||||
this.canvas.setAttribute('height', this.element.height());
|
||||
this.canvas.innerHTML = this.options.notAvailable;
|
||||
this.element.append(this.canvas);
|
||||
if (G_vmlCanvasManager) { // Requires excanvas.js
|
||||
G_vmlCanvasManager.initElement(this.canvas);
|
||||
}
|
||||
this.ctx = this.canvas.getContext('2d');
|
||||
}
|
||||
this._refresh(true);
|
||||
this._mouseInit();
|
||||
},
|
||||
|
||||
/* Refresh the appearance of the signature area.
|
||||
@param init (boolean, internal) true if initialising */
|
||||
_refresh: function(init) {
|
||||
if (this.resize) {
|
||||
var parent = $(this.canvas);
|
||||
$('div', this.canvas).css({width: parent.width(), height: parent.height()});
|
||||
}
|
||||
this.ctx.fillStyle = this.options.background;
|
||||
this.ctx.strokeStyle = this.options.color;
|
||||
this.ctx.lineWidth = this.options.thickness;
|
||||
this.ctx.lineCap = 'round';
|
||||
this.ctx.lineJoin = 'round';
|
||||
this.clear(init);
|
||||
},
|
||||
|
||||
/* Clear the signature area.
|
||||
@param init (boolean, internal) true if initialising */
|
||||
clear: function(init) {
|
||||
this.ctx.fillRect(0, 0, this.element.width(), this.element.height());
|
||||
if (this.options.guideline) {
|
||||
this.ctx.save();
|
||||
this.ctx.strokeStyle = this.options.guidelineColor;
|
||||
this.ctx.lineWidth = 1;
|
||||
this.ctx.beginPath();
|
||||
this.ctx.moveTo(this.options.guidelineIndent,
|
||||
this.element.height() - this.options.guidelineOffset);
|
||||
this.ctx.lineTo(this.element.width() - this.options.guidelineIndent,
|
||||
this.element.height() - this.options.guidelineOffset);
|
||||
this.ctx.stroke();
|
||||
this.ctx.restore();
|
||||
}
|
||||
this.lines = [];
|
||||
if (!init) {
|
||||
this._changed();
|
||||
}
|
||||
},
|
||||
|
||||
/* Synchronise changes and trigger change event.
|
||||
@param event (Event) the triggering event */
|
||||
_changed: function(event) {
|
||||
if (this.options.syncField) {
|
||||
$(this.options.syncField).val(this.toJSON());
|
||||
}
|
||||
this._trigger('change', event, {});
|
||||
},
|
||||
|
||||
/* Custom options handling.
|
||||
@param options (object) the new option values */
|
||||
_setOptions: function(options) {
|
||||
if (this._superApply) {
|
||||
this._superApply(arguments); // Base widget handling
|
||||
}
|
||||
else {
|
||||
$.Widget.prototype._setOptions.apply(this, arguments); // Base widget handling
|
||||
}
|
||||
this._refresh();
|
||||
},
|
||||
|
||||
/* Determine if dragging can start.
|
||||
@param event (Event) the triggering mouse event
|
||||
@return (boolean) true if allowed, false if not */
|
||||
_mouseCapture: function(event) {
|
||||
return !this.options.disabled;
|
||||
},
|
||||
|
||||
/* Start a new line.
|
||||
@param event (Event) the triggering mouse event */
|
||||
_mouseStart: function(event) {
|
||||
this.offset = this.element.offset();
|
||||
this.offset.left -= document.documentElement.scrollLeft || document.body.scrollLeft;
|
||||
this.offset.top -= document.documentElement.scrollTop || document.body.scrollTop;
|
||||
this.lastPoint = [this._round(event.clientX - this.offset.left),
|
||||
this._round(event.clientY - this.offset.top)];
|
||||
this.curLine = [this.lastPoint];
|
||||
this.lines.push(this.curLine);
|
||||
},
|
||||
|
||||
/* Track the mouse.
|
||||
@param event (Event) the triggering mouse event */
|
||||
_mouseDrag: function(event) {
|
||||
var point = [this._round(event.clientX - this.offset.left),
|
||||
this._round(event.clientY - this.offset.top)];
|
||||
this.curLine.push(point);
|
||||
this.ctx.beginPath();
|
||||
this.ctx.moveTo(this.lastPoint[0], this.lastPoint[1]);
|
||||
this.ctx.lineTo(point[0], point[1]);
|
||||
this.ctx.stroke();
|
||||
this.lastPoint = point;
|
||||
},
|
||||
|
||||
/* End a line.
|
||||
@param event (Event) the triggering mouse event */
|
||||
_mouseStop: function(event) {
|
||||
this.lastPoint = null;
|
||||
this.curLine = null;
|
||||
this._changed(event);
|
||||
},
|
||||
|
||||
/* Round to two decimal points.
|
||||
@param value (number) the value to round
|
||||
@return (number) the rounded value */
|
||||
_round: function(value) {
|
||||
return Math.round(value * 100) / 100;
|
||||
},
|
||||
|
||||
/* Convert the captured lines to JSON text.
|
||||
@return (string) the JSON text version of the lines */
|
||||
toJSON: function() {
|
||||
return '{"lines":[' + $.map(this.lines, function(line) {
|
||||
return '[' + $.map(line, function(point) {
|
||||
return '[' + point + ']';
|
||||
}) + ']';
|
||||
}) + ']}';
|
||||
},
|
||||
|
||||
/* Convert the captured lines to SVG text.
|
||||
@return (string) the SVG text version of the lines */
|
||||
toSVG: function() {
|
||||
return '<?xml version="1.0"?>\n<!DOCTYPE svg PUBLIC ' +
|
||||
'"-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n' +
|
||||
'<svg xmlns="http://www.w3.org/2000/svg" width="15cm" height="15cm">\n' +
|
||||
' <g fill="' + this.options.background + '">\n' +
|
||||
' <rect x="0" y="0" width="' + this.canvas.width +
|
||||
'" height="' + this.canvas.height + '"/>\n' +
|
||||
' <g fill="none" stroke="' + this.options.color + '" stroke-width="' +
|
||||
this.options.thickness + '">\n'+
|
||||
$.map(this.lines, function(line) {
|
||||
return ' <polyline points="' +
|
||||
$.map(line, function(point) { return point + ''; }).join(' ') + '"/>\n';
|
||||
}).join('') +
|
||||
' </g>\n </g>\n</svg>\n';
|
||||
},
|
||||
|
||||
/* Draw a signature from its JSON description.
|
||||
@param sigJSON (object) object with attribute lines
|
||||
being an array of arrays of points or
|
||||
(string) text version of the JSON */
|
||||
draw: function(sigJSON) {
|
||||
this.clear(true);
|
||||
if (typeof sigJSON === 'string') {
|
||||
sigJSON = $.parseJSON(sigJSON);
|
||||
}
|
||||
this.lines = sigJSON.lines || [];
|
||||
var ctx = this.ctx;
|
||||
$.each(this.lines, function() {
|
||||
ctx.beginPath();
|
||||
$.each(this, function(i) {
|
||||
ctx[i === 0 ? 'moveTo' : 'lineTo'](this[0], this[1]);
|
||||
});
|
||||
ctx.stroke();
|
||||
});
|
||||
this._changed();
|
||||
},
|
||||
|
||||
/* Determine whether or not any drawing has occurred.
|
||||
@return (boolean) true if not signed, false if signed */
|
||||
isEmpty: function() {
|
||||
return this.lines.length === 0;
|
||||
},
|
||||
|
||||
/* Remove the signature functionality. */
|
||||
_destroy: function() {
|
||||
this.element.removeClass(this.widgetFullName || this.widgetBaseClass);
|
||||
$(this.canvas).remove();
|
||||
this.canvas = this.ctx = this.lines = null;
|
||||
this._mouseDestroy();
|
||||
}
|
||||
};
|
||||
|
||||
if (!$.Widget.prototype._destroy) {
|
||||
$.extend(signatureOverrides, {
|
||||
/* Remove the signature functionality. */
|
||||
destroy: function() {
|
||||
this._destroy();
|
||||
$.Widget.prototype.destroy.call(this); // Base widget handling
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if($.Widget.prototype._getCreateOptions === $.noop) {
|
||||
$.extend(signatureOverrides, {
|
||||
/* Restore the metadata functionality. */
|
||||
_getCreateOptions: function() {
|
||||
return $.metadata && $.metadata.get(this.element[0])[this.widgetName];
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* Signature capture and display.
|
||||
Depends on jquery.ui.widget, jquery.ui.mouse. */
|
||||
$.widget('kbw.signature', $.ui.mouse, signatureOverrides);
|
||||
|
||||
// Make some things more accessible
|
||||
$.kbw.signature.options = $.kbw.signature.prototype.options;
|
||||
|
||||
})(jQuery);
|
|
@ -1,5 +1,5 @@
|
|||
/* Styles for signature plugin v1.1.0. */
|
||||
.kbw-signature {
|
||||
display: inline-block;
|
||||
border: 1px solid #a0a0a0;
|
||||
}
|
||||
/* Styles for signature plugin v1.1.0. */
|
||||
.kbw-signature {
|
||||
display: inline-block;
|
||||
border: 1px solid #a0a0a0;
|
||||
}
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
@ -2,11 +2,11 @@
|
|||
<data>
|
||||
<template id="signature_backend" name="signature assets" inherit_id="web.assets_backend">
|
||||
<xpath expr="." position="inside">
|
||||
<link rel="stylesheet" href="/web_widget_digital_signature/static/src/css/digital.css"/>
|
||||
<link rel="stylesheet" href="/web_widget_digital_signature/static/src/css/jquery.signature.css"/>
|
||||
<script type="text/javascript" src="/web_widget_digital_signature/static/lib/excanvas.js"></script>
|
||||
<script type="text/javascript" src="/web_widget_digital_signature/static/lib/jquery.signature.js"></script>
|
||||
<script type="text/javascript" src="/web_widget_digital_signature/static/src/js/digital_sign.js"></script>
|
||||
<link rel="stylesheet" href="/web_widget_digitized_signature/static/src/css/digital.css"/>
|
||||
<link rel="stylesheet" href="/web_widget_digitized_signature/static/src/css/jquery.signature.css"/>
|
||||
<script type="text/javascript" src="/web_widget_digitized_signature/static/lib/excanvas.js"></script>
|
||||
<script type="text/javascript" src="/web_widget_digitized_signature/static/lib/jquery.signature.js"></script>
|
||||
<script type="text/javascript" src="/web_widget_digitized_signature/static/src/js/digital_sign.js"></script>
|
||||
</xpath>
|
||||
</template>
|
||||
</data>
|
Loading…
Reference in New Issue