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
-
53web_widget_digital_signature_sale_order/README.rst
-
10web_widget_digital_signature_sale_order/__init__.py
-
27web_widget_digital_signature_sale_order/__openerp__.py
-
BINweb_widget_digital_signature_sale_order/images/so_signature.png
-
10web_widget_digital_signature_sale_order/models/__init__.py
-
16web_widget_digital_signature_sale_order/models/sale_order.py
-
BINweb_widget_digital_signature_sale_order/static/description/icon.png
-
19web_widget_digital_signature_sale_order/views/sale_order_view.xml
-
2web_widget_digitized_signature/README.rst
-
0web_widget_digitized_signature/__init__.py
-
2web_widget_digitized_signature/__openerp__.py
-
0web_widget_digitized_signature/static/description/icon.png
-
0web_widget_digitized_signature/static/lib/excanvas.js
-
492web_widget_digitized_signature/static/lib/jquery.signature.js
-
0web_widget_digitized_signature/static/src/css/digital.css
-
0web_widget_digitized_signature/static/src/css/jquery-ui.css
-
10web_widget_digitized_signature/static/src/css/jquery.signature.css
-
0web_widget_digitized_signature/static/src/img/icon.png
-
0web_widget_digitized_signature/static/src/js/digital_sign.js
-
0web_widget_digitized_signature/static/src/xml/digital_sign.xml
-
10web_widget_digitized_signature/views/we_digital_sign_view.xml
@ -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, |
|||
} |
Before Width: 864 | Height: 540 | 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') |
Before Width: 128 | Height: 128 | 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> |
Before Width: 128 | Height: 128 | Size: 8.9 KiB After Width: 128 | Height: 128 | 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: 159 | Height: 221 | Size: 16 KiB After Width: 159 | Height: 221 | Size: 16 KiB |