Browse Source

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_signature
pull/267/head
archetipo 9 years ago
parent
commit
59f262c01b
  1. 53
      web_widget_digital_signature_sale_order/README.rst
  2. 10
      web_widget_digital_signature_sale_order/__init__.py
  3. 27
      web_widget_digital_signature_sale_order/__openerp__.py
  4. BIN
      web_widget_digital_signature_sale_order/images/so_signature.png
  5. 10
      web_widget_digital_signature_sale_order/models/__init__.py
  6. 16
      web_widget_digital_signature_sale_order/models/sale_order.py
  7. BIN
      web_widget_digital_signature_sale_order/static/description/icon.png
  8. 19
      web_widget_digital_signature_sale_order/views/sale_order_view.xml
  9. 2
      web_widget_digitized_signature/README.rst
  10. 0
      web_widget_digitized_signature/__init__.py
  11. 2
      web_widget_digitized_signature/__openerp__.py
  12. 0
      web_widget_digitized_signature/static/description/icon.png
  13. 0
      web_widget_digitized_signature/static/lib/excanvas.js
  14. 492
      web_widget_digitized_signature/static/lib/jquery.signature.js
  15. 0
      web_widget_digitized_signature/static/src/css/digital.css
  16. 0
      web_widget_digitized_signature/static/src/css/jquery-ui.css
  17. 10
      web_widget_digitized_signature/static/src/css/jquery.signature.css
  18. 0
      web_widget_digitized_signature/static/src/img/icon.png
  19. 0
      web_widget_digitized_signature/static/src/js/digital_sign.js
  20. 0
      web_widget_digitized_signature/static/src/xml/digital_sign.xml
  21. 10
      web_widget_digitized_signature/views/we_digital_sign_view.xml

53
web_widget_digital_signature_sale_order/README.rst

@ -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.

10
web_widget_digital_signature_sale_order/__init__.py

@ -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

27
web_widget_digital_signature_sale_order/__openerp__.py

@ -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,
}

BIN
web_widget_digital_signature_sale_order/images/so_signature.png

Before

Width: 864  |  Height: 540  |  Size: 37 KiB

10
web_widget_digital_signature_sale_order/models/__init__.py

@ -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

16
web_widget_digital_signature_sale_order/models/sale_order.py

@ -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')

BIN
web_widget_digital_signature_sale_order/static/description/icon.png

Before

Width: 128  |  Height: 128  |  Size: 5.6 KiB

19
web_widget_digital_signature_sale_order/views/sale_order_view.xml

@ -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>

2
web_widget_digital_signature/README.rst → web_widget_digitized_signature/README.rst

@ -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

0
web_widget_digital_signature/__init__.py → web_widget_digitized_signature/__init__.py

2
web_widget_digital_signature/__openerp__.py → web_widget_digitized_signature/__openerp__.py

@ -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)",

0
web_widget_digital_signature/static/description/icon.png → web_widget_digitized_signature/static/description/icon.png

Before

Width: 128  |  Height: 128  |  Size: 8.9 KiB

After

Width: 128  |  Height: 128  |  Size: 8.9 KiB

0
web_widget_digital_signature/static/lib/excanvas.js → web_widget_digitized_signature/static/lib/excanvas.js

492
web_widget_digital_signature/static/lib/jquery.signature.js → web_widget_digitized_signature/static/lib/jquery.signature.js

@ -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);

0
web_widget_digital_signature/static/src/css/digital.css → web_widget_digitized_signature/static/src/css/digital.css

0
web_widget_digital_signature/static/src/css/jquery-ui.css → web_widget_digitized_signature/static/src/css/jquery-ui.css

10
web_widget_digital_signature/static/src/css/jquery.signature.css → web_widget_digitized_signature/static/src/css/jquery.signature.css

@ -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;
}

0
web_widget_digital_signature/static/src/img/icon.png → web_widget_digitized_signature/static/src/img/icon.png

Before

Width: 159  |  Height: 221  |  Size: 16 KiB

After

Width: 159  |  Height: 221  |  Size: 16 KiB

0
web_widget_digital_signature/static/src/js/digital_sign.js → web_widget_digitized_signature/static/src/js/digital_sign.js

0
web_widget_digital_signature/static/src/xml/digital_sign.xml → web_widget_digitized_signature/static/src/xml/digital_sign.xml

10
web_widget_digital_signature/views/we_digital_sign_view.xml → web_widget_digitized_signature/views/we_digital_sign_view.xml

@ -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…
Cancel
Save