vue2-client 1.15.106 → 1.15.107

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (875) hide show
  1. package/.claude/settings.local.json +12 -0
  2. package/.cursorrules +19 -19
  3. package/.editorconfig +9 -9
  4. package/.env +20 -20
  5. package/.env.apply +19 -19
  6. package/.env.development +1 -1
  7. package/.env.gaslink +19 -19
  8. package/.env.his +19 -19
  9. package/.env.iot +19 -19
  10. package/.env.liuli +20 -20
  11. package/.env.message +19 -19
  12. package/.env.revenue +19 -19
  13. package/.env.runtime +19 -19
  14. package/.env.scada +19 -19
  15. package/.eslintrc.js +90 -90
  16. package/.eslintrc.json +5 -5
  17. package/CHANGELOG.md +824 -824
  18. package/CLAUDE.md +89 -89
  19. package/Components.md +60 -60
  20. package/README.md +65 -65
  21. package/babel.config.js +21 -21
  22. package/docs/Logic/345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +46 -46
  23. package/docs/LowCode/lowcode.md +155 -155
  24. package/docs/LowCode/lowcodeForDeveloper.md +230 -230
  25. package/docs/index.md +30 -30
  26. package/docs/notice.md +22 -22
  27. package/docs//345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +179 -185
  28. package/index.js +31 -31
  29. package/jest-transform-stub.js +8 -8
  30. package/jest.config.js +22 -22
  31. package/jest.setup.js +7 -7
  32. package/jsconfig.json +19 -19
  33. package/package.json +111 -111
  34. package/public/his/editor/editor.html +51 -51
  35. package/public/his/editor/mock/bind_data.html +779 -779
  36. package/public/his/editor/mock/data_table.html +40 -40
  37. package/public/his/editor/mock/sign.html +75 -75
  38. package/public/his/editor/vender/JsBarcode.all.js +3669 -3669
  39. package/public/his/editor/vender/date97/My97DatePicker.htm +65 -65
  40. package/public/his/editor/vender/date97/WdatePicker.js +677 -677
  41. package/public/his/editor/vender/date97/calendar.js +4 -4
  42. package/public/his/editor/vender/date97/lang/en.js +13 -13
  43. package/public/his/editor/vender/date97/lang/zh-cn.js +13 -13
  44. package/public/his/editor/vender/date97/lang/zh-tw.js +13 -13
  45. package/public/his/editor/vender/date97/skin/WdatePicker.css +10 -10
  46. package/public/his/editor/vender/date97/skin/default/datepicker.css +328 -328
  47. package/public/his/editor/vender/date97/skin/ext/datepicker.css +308 -308
  48. package/public/his/editor/vender/date97/skin/whyGreen/datepicker.css +255 -255
  49. package/public/his/editor/vender/diff.js +1627 -1627
  50. package/public/his/editor/vender/editor.js +1 -1
  51. package/public/his/editor/vender/fabric.js +31187 -31187
  52. package/public/his/editor/vender/jquery/jquery.base64.js +190 -190
  53. package/public/his/editor/vender/jquery/jquery.js +10872 -10872
  54. package/public/his/editor/vender/jquery/jquery.print.js +255 -255
  55. package/public/his/editor/vender/jquery/zTreeStyle/zTreeStyle.css +96 -96
  56. package/public/his/editor/vender/mui/mui.min.css +4 -4
  57. package/public/his/editor/vender/mui/mui.min.js +5 -5
  58. package/public/his/editor/vender/mui/mui.picker.min.css +6 -6
  59. package/public/his/editor/vender/mui/mui.picker.min.js +6 -6
  60. package/public/his/editor/vender/qrcode.js +7 -7
  61. package/public/his/editor/vender/requirejs/require.js +2145 -2145
  62. package/public/his/editor/vender/signature/jSignature.CompressorSVG.js +518 -518
  63. package/public/his/editor/vender/signature/jSignature.UndoButton.js +164 -164
  64. package/public/his/editor/vender/signature/jSignature.js +1486 -1486
  65. package/public/his/editor/vender/validator.js +5094 -5094
  66. package/public/his/editor/vender/weui/weui.css +5659 -5659
  67. package/public/his/editor/vender/weui/weui.min.css +4 -4
  68. package/public/his/editor/vender/weui/weui.min.js +11 -11
  69. package/public/index.html +27 -27
  70. package/src/App.vue +196 -196
  71. package/src/ReportView.js +13 -13
  72. package/src/assets/img/querySlotDemo.svg +15 -15
  73. package/src/assets/svg/badtwo.svg +1 -1
  74. package/src/assets/svg/goodtwo.svg +1 -1
  75. package/src/base-client/components/AI/AskAiBtn.vue +136 -136
  76. package/src/base-client/components/AI/demo.vue +31 -31
  77. package/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox.vue +532 -532
  78. package/src/base-client/components/common/AddressSearchCombobox/IcMapIcon.vue +16 -16
  79. package/src/base-client/components/common/AddressSearchCombobox/demo.vue +36 -36
  80. package/src/base-client/components/common/AddressSearchCombobox/ic_map.svg +6 -6
  81. package/src/base-client/components/common/AddressSearchCombobox/index.js +3 -3
  82. package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
  83. package/src/base-client/components/common/AmapMarker/index.js +3 -3
  84. package/src/base-client/components/common/CitySelect/CitySelect.vue +376 -376
  85. package/src/base-client/components/common/CitySelect/demo.vue +43 -43
  86. package/src/base-client/components/common/CitySelect/index.js +3 -3
  87. package/src/base-client/components/common/CitySelect/index.md +109 -109
  88. package/src/base-client/components/common/ColorPickerCombobox/ColorPickerCombobox.vue +99 -99
  89. package/src/base-client/components/common/ColorPickerCombobox/demo.vue +34 -34
  90. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +669 -669
  91. package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +1014 -1014
  92. package/src/base-client/components/common/CreateQuery/index.js +3 -3
  93. package/src/base-client/components/common/CreateQuery/index.md +42 -42
  94. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +452 -452
  95. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQueryItem.vue +511 -511
  96. package/src/base-client/components/common/CreateSimpleFormQuery/index.js +3 -3
  97. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
  98. package/src/base-client/components/common/FormGroupEdit/FormGroupEdit.vue +146 -146
  99. package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
  100. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  101. package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +166 -166
  102. package/src/base-client/components/common/FormGroupQuery/index.js +3 -3
  103. package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
  104. package/src/base-client/components/common/JSONToTree/index.js +3 -3
  105. package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
  106. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorModal.vue +108 -108
  107. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorPanel.vue +413 -413
  108. package/src/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue +502 -502
  109. package/src/base-client/components/common/LowCodeComponent/LowCodeRender.vue +728 -728
  110. package/src/base-client/components/common/LowCodeComponent/LowCodeRenderEnter.vue +29 -29
  111. package/src/base-client/components/common/LowCodeComponent/LowCodeUIStore.vue +219 -219
  112. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeAddPageModal.vue +117 -117
  113. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeCustomJSModal.vue +80 -80
  114. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeEventEditorModal.vue +398 -398
  115. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLifeCycleModal.vue +65 -65
  116. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicCallbackModal.vue +64 -64
  117. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicParamModal.vue +73 -73
  118. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeRunFunctionParamModal.vue +76 -76
  119. package/src/base-client/components/common/PersonSetting/PersonSetting.vue +208 -208
  120. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  121. package/src/base-client/components/common/Recording/Recording.vue +243 -243
  122. package/src/base-client/components/common/Recording/index.js +3 -3
  123. package/src/base-client/components/common/Tree/Tree.vue +149 -149
  124. package/src/base-client/components/common/Tree/index.js +2 -2
  125. package/src/base-client/components/common/Upload/Upload.vue +323 -323
  126. package/src/base-client/components/common/Upload/index.js +3 -3
  127. package/src/base-client/components/common/XAddForm/XAddForm.vue +113 -113
  128. package/src/base-client/components/common/XAddForm/index.js +3 -3
  129. package/src/base-client/components/common/XAddForm/index.md +61 -61
  130. package/src/base-client/components/common/XAddNativeForm/XAddNativeForm.vue +1169 -1169
  131. package/src/base-client/components/common/XAddNativeForm/demo.vue +54 -54
  132. package/src/base-client/components/common/XAddNativeForm/index.js +3 -3
  133. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  134. package/src/base-client/components/common/XAddNativeFormOA/XAddNativeFormOA.vue +303 -303
  135. package/src/base-client/components/common/XAddNativeFormOA/index.js +3 -3
  136. package/src/base-client/components/common/XAddNativeFormOA/index.md +146 -146
  137. package/src/base-client/components/common/XAddReport/XAddReport.vue +212 -212
  138. package/src/base-client/components/common/XAddReport/index.js +3 -3
  139. package/src/base-client/components/common/XAddReport/index.md +56 -56
  140. package/src/base-client/components/common/XBadge/XBadge.vue +94 -94
  141. package/src/base-client/components/common/XBadge/index.js +3 -3
  142. package/src/base-client/components/common/XBadge/index.md +39 -39
  143. package/src/base-client/components/common/XButtons/XButtonDemo.vue +28 -28
  144. package/src/base-client/components/common/XButtons/XButtons.vue +284 -284
  145. package/src/base-client/components/common/XButtons/index.js +3 -3
  146. package/src/base-client/components/common/XButtons/index.md +61 -61
  147. package/src/base-client/components/common/XCalendar/XCalendar.vue +369 -369
  148. package/src/base-client/components/common/XCalendar/index.md +284 -284
  149. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  150. package/src/base-client/components/common/XCard/index.js +3 -3
  151. package/src/base-client/components/common/XCard/index.md +43 -43
  152. package/src/base-client/components/common/XCardSet/XCardSet.vue +300 -300
  153. package/src/base-client/components/common/XCheckList/XCheckList.vue +106 -106
  154. package/src/base-client/components/common/XCheckList/XCheckListDemo.vue +41 -41
  155. package/src/base-client/components/common/XCollapse/XCollapse.vue +355 -355
  156. package/src/base-client/components/common/XConversation/XConversation.vue +576 -576
  157. package/src/base-client/components/common/XConversation/XConversationDemo.vue +28 -28
  158. package/src/base-client/components/common/XDataCard/XDataCard.vue +629 -629
  159. package/src/base-client/components/common/XDataCard/index.js +3 -3
  160. package/src/base-client/components/common/XDataCard/index.md +1 -1
  161. package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
  162. package/src/base-client/components/common/XDataDrawer/index.js +3 -3
  163. package/src/base-client/components/common/XDataDrawer/index.md +41 -41
  164. package/src/base-client/components/common/XDatePicker/demo.vue +153 -153
  165. package/src/base-client/components/common/XDatePicker/index.vue +276 -276
  166. package/src/base-client/components/common/XDescriptions/XDescriptions.vue +174 -174
  167. package/src/base-client/components/common/XDescriptions/XDescriptionsGroup.vue +314 -314
  168. package/src/base-client/components/common/XDescriptions/demo.vue +51 -51
  169. package/src/base-client/components/common/XDescriptions/index.js +3 -3
  170. package/src/base-client/components/common/XDescriptions/index.md +83 -83
  171. package/src/base-client/components/common/XDetailsView/XDetailsView.vue +238 -238
  172. package/src/base-client/components/common/XDetailsView/index.js +3 -3
  173. package/src/base-client/components/common/XForm/XForm.vue +426 -426
  174. package/src/base-client/components/common/XForm/XFormItem.vue +1479 -1497
  175. package/src/base-client/components/common/XForm/XStatusButton.vue +54 -54
  176. package/src/base-client/components/common/XForm/XTreeSelect.vue +276 -276
  177. package/src/base-client/components/common/XForm/demo.vue +105 -105
  178. package/src/base-client/components/common/XForm/index.js +3 -3
  179. package/src/base-client/components/common/XForm/index.md +178 -178
  180. package/src/base-client/components/common/XForm/itemComponent/XClickChangeBtn/index.vue +49 -49
  181. package/src/base-client/components/common/XFormCol/XFormCol.vue +157 -157
  182. package/src/base-client/components/common/XFormCol/index.js +3 -3
  183. package/src/base-client/components/common/XFormCol/index.md +35 -35
  184. package/src/base-client/components/common/XFormGroup/XFormGroup.vue +301 -301
  185. package/src/base-client/components/common/XFormGroup/demo.vue +41 -41
  186. package/src/base-client/components/common/XFormGroup/index.js +3 -3
  187. package/src/base-client/components/common/XFormGroup/index.md +38 -38
  188. package/src/base-client/components/common/XFormGroupDetails/XFormGroupDetails.vue +72 -72
  189. package/src/base-client/components/common/XFormGroupDetails/index.js +3 -3
  190. package/src/base-client/components/common/XFormTable/XFormTable.vue +939 -939
  191. package/src/base-client/components/common/XFormTable/demo.vue +87 -87
  192. package/src/base-client/components/common/XFormTable/index.js +3 -3
  193. package/src/base-client/components/common/XFormTable/index.md +92 -92
  194. package/src/base-client/components/common/XImportExcel/XImportExcel.vue +174 -174
  195. package/src/base-client/components/common/XImportExcel/index.js +3 -3
  196. package/src/base-client/components/common/XImportExcel/index.md +38 -38
  197. package/src/base-client/components/common/XInput/XInput.vue +128 -128
  198. package/src/base-client/components/common/XInput/index.js +3 -3
  199. package/src/base-client/components/common/XInput/index.md +97 -97
  200. package/src/base-client/components/common/XIntervalPicker/XIntervalPicker.vue +121 -121
  201. package/src/base-client/components/common/XLabelSelect/XLabelSelect.vue +110 -110
  202. package/src/base-client/components/common/XLabelSelect/XLabelSelectDemo.vue +35 -35
  203. package/src/base-client/components/common/XLicensePlate/XLicensePlate.vue +193 -193
  204. package/src/base-client/components/common/XLicensePlate/XLicensePlateDemo.vue +48 -48
  205. package/src/base-client/components/common/XLicensePlate/index.js +3 -3
  206. package/src/base-client/components/common/XLicensePlate/index.md +38 -38
  207. package/src/base-client/components/common/XPrint/Demo.vue +41 -41
  208. package/src/base-client/components/common/XPrint/OpenInvoice.vue +21 -21
  209. package/src/base-client/components/common/XPrint/PrintBill.vue +308 -308
  210. package/src/base-client/components/common/XPrint/PrintHtml.js +98 -98
  211. package/src/base-client/components/common/XPrint/css/hiPrintCss.js +359 -359
  212. package/src/base-client/components/common/XPrint/css/lodopCss.js +26 -26
  213. package/src/base-client/components/common/XPrint/css/print-lock.css +351 -351
  214. package/src/base-client/components/common/XPrint/index.vue +97 -97
  215. package/src/base-client/components/common/XRate/demo.vue +102 -102
  216. package/src/base-client/components/common/XRate/index.vue +149 -149
  217. package/src/base-client/components/common/XReport/XReport.vue +963 -963
  218. package/src/base-client/components/common/XReport/XReportDemo.vue +70 -70
  219. package/src/base-client/components/common/XReport/XReportDesign.vue +463 -463
  220. package/src/base-client/components/common/XReport/XReportJsonRender.vue +381 -381
  221. package/src/base-client/components/common/XReport/XReportTrGroup.vue +1005 -1005
  222. package/src/base-client/components/common/XReport/index.js +3 -3
  223. package/src/base-client/components/common/XReport/index.md +103 -103
  224. package/src/base-client/components/common/XReport/print.js +186 -186
  225. package/src/base-client/components/common/XReportDrawer/XReportDrawer.vue +201 -201
  226. package/src/base-client/components/common/XReportDrawer/index.js +3 -3
  227. package/src/base-client/components/common/XReportGrid/XReport.vue +1075 -1075
  228. package/src/base-client/components/common/XReportGrid/XReportDemo.vue +44 -44
  229. package/src/base-client/components/common/XReportGrid/XReportDesign.vue +620 -620
  230. package/src/base-client/components/common/XReportGrid/XReportTrGroup.vue +724 -724
  231. package/src/base-client/components/common/XReportGrid/index.js +3 -3
  232. package/src/base-client/components/common/XReportGrid/index.md +44 -44
  233. package/src/base-client/components/common/XReportGrid/print.js +184 -184
  234. package/src/base-client/components/common/XReportSlot/XReportSlot.vue +110 -110
  235. package/src/base-client/components/common/XReportSlot/index.js +3 -3
  236. package/src/base-client/components/common/XReportSlot/index.md +48 -48
  237. package/src/base-client/components/common/XSimpleDescriptions/XSimpleDescriptions.vue +166 -166
  238. package/src/base-client/components/common/XSimpleDescriptions/index.js +3 -3
  239. package/src/base-client/components/common/XSimpleDescriptions/index.md +7 -7
  240. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  241. package/src/base-client/components/common/XStepView/index.js +3 -3
  242. package/src/base-client/components/common/XStepView/index.md +31 -31
  243. package/src/base-client/components/common/XTab/XTab.vue +299 -299
  244. package/src/base-client/components/common/XTab/XTabDemo.vue +22 -22
  245. package/src/base-client/components/common/XTab/index.js +3 -3
  246. package/src/base-client/components/common/XTable/CustomFuncCel.vue +51 -51
  247. package/src/base-client/components/common/XTable/ExportExcel.vue +283 -283
  248. package/src/base-client/components/common/XTable/TableCellRenderer.vue +161 -161
  249. package/src/base-client/components/common/XTable/XTable.vue +1599 -1599
  250. package/src/base-client/components/common/XTable/XTableWrapper.vue +597 -597
  251. package/src/base-client/components/common/XTable/index.js +3 -3
  252. package/src/base-client/components/common/XTable/index.md +255 -255
  253. package/src/base-client/components/common/XTagGroup/index.vue +52 -52
  254. package/src/base-client/components/common/XTimeline/XTimeline.vue +358 -358
  255. package/src/base-client/components/common/XTimeline/index.md +191 -191
  256. package/src/base-client/components/common/XTree/XTree.vue +424 -424
  257. package/src/base-client/components/common/XTree/XTreePro.vue +452 -452
  258. package/src/base-client/components/common/XTree/index.js +3 -3
  259. package/src/base-client/components/common/XTree/index.md +36 -36
  260. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +113 -113
  261. package/src/base-client/components/common/XTreeOne/XTreeOnePro.vue +128 -128
  262. package/src/base-client/components/common/XTreeOne/index.js +3 -3
  263. package/src/base-client/components/common/XUploadFilesView/index.vue +485 -485
  264. package/src/base-client/components/common/richTextModal/index.vue +56 -56
  265. package/src/base-client/components/common/richTextModal/richDemo.vue +48 -48
  266. package/src/base-client/components/his/XCharge/XCharge.vue +238 -238
  267. package/src/base-client/components/his/XCheckbox/XCheckbox.vue +105 -105
  268. package/src/base-client/components/his/XCheckbox/index.md +253 -253
  269. package/src/base-client/components/his/XHDescriptions/XHDescriptions.vue +430 -430
  270. package/src/base-client/components/his/XHDescriptions/index.md +217 -217
  271. package/src/base-client/components/his/XHisEditor/XHisEditor.vue +629 -678
  272. package/src/base-client/components/his/XHisEditor/diagnosisAutocomplete.js +263 -263
  273. package/src/base-client/components/his/XHisEditor/index.js +3 -3
  274. package/src/base-client/components/his/XImportExcelButton/XFrontImportExcel.vue +218 -218
  275. package/src/base-client/components/his/XImportExcelButton/XFrontImportExcelDemo.vue +21 -21
  276. package/src/base-client/components/his/XImportExcelButton/XImportExcelButton.vue +103 -103
  277. package/src/base-client/components/his/XList/XList.vue +495 -495
  278. package/src/base-client/components/his/XQuestionnaire/XQuestionnaire.json +3 -3
  279. package/src/base-client/components/his/XQuestionnaire/XQuestionnaire.vue +106 -106
  280. package/src/base-client/components/his/XQuestionnaire/XQuestionnaireDemo.vue +51 -51
  281. package/src/base-client/components/his/XQuestionnaire/XQuestionnaireItem.vue +269 -269
  282. package/src/base-client/components/his/XRadio/XRadio.vue +125 -125
  283. package/src/base-client/components/his/XRadio/index.md +234 -234
  284. package/src/base-client/components/his/XSelect/XSelect.vue +72 -72
  285. package/src/base-client/components/his/XShiftSchedule/XShiftSchedule.vue +339 -341
  286. package/src/base-client/components/his/XShiftSchedule/dome.vue +29 -29
  287. package/src/base-client/components/his/XSidebar/XSidebar.vue +240 -240
  288. package/src/base-client/components/his/XSimpleTable/XSimpleTable.vue +119 -119
  289. package/src/base-client/components/his/XTimeSelect/XTimeSelect.vue +162 -162
  290. package/src/base-client/components/his/XTimeSelect/XTimeSelectDemo.vue +23 -23
  291. package/src/base-client/components/his/XTitle/README.md +113 -113
  292. package/src/base-client/components/his/XTitle/XTitle.vue +123 -123
  293. package/src/base-client/components/his/XTreeRows/TreeNode.vue +107 -107
  294. package/src/base-client/components/his/XTreeRows/XTreeRows.vue +307 -307
  295. package/src/base-client/components/his/threeTestOrders/dome.vue +68 -68
  296. package/src/base-client/components/his/threeTestOrders/textBox.vue +457 -457
  297. package/src/base-client/components/his/threeTestOrders/threeTestOrders.vue +475 -475
  298. package/src/base-client/components/index.js +51 -51
  299. package/src/base-client/components/layout/XPageView/RenderRow.vue +88 -88
  300. package/src/base-client/components/layout/XPageView/XErrorView.vue +22 -22
  301. package/src/base-client/components/layout/XPageView/XPageRowTemplate.vue +37 -37
  302. package/src/base-client/components/layout/XPageView/XPageView.vue +223 -223
  303. package/src/base-client/components/layout/XPageView/XTab/XTab.vue +96 -96
  304. package/src/base-client/components/layout/XPageView/XTab/index.js +3 -3
  305. package/src/base-client/components/layout/XPageView/componentTypes.js +22 -22
  306. package/src/base-client/components/layout/XPageView/index.js +2 -2
  307. package/src/base-client/components/layout/XPageView/index.md +96 -96
  308. package/src/base-client/components/layout/XTreeView/XTreeView.vue +130 -130
  309. package/src/base-client/components/layout/XTreeView/index.js +3 -3
  310. package/src/base-client/components/layout/XTreeView/index.md +46 -46
  311. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  312. package/src/base-client/components/system/DictionaryDetailsView/index.js +3 -3
  313. package/src/base-client/components/system/DictionaryDetailsView/index.md +41 -41
  314. package/src/base-client/components/system/LogDetailsView/LogDetailsView.vue +376 -376
  315. package/src/base-client/components/system/LogDetailsView/index.js +3 -3
  316. package/src/base-client/components/system/LogDetailsView/index.md +41 -41
  317. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -281
  318. package/src/base-client/components/system/QueryParamsDetailsView/index.js +3 -3
  319. package/src/base-client/components/ticket/TicketDetailsView/TicketDetailsView.vue +807 -807
  320. package/src/base-client/components/ticket/TicketDetailsView/index.js +3 -3
  321. package/src/base-client/components/ticket/TicketDetailsView/index.md +29 -29
  322. package/src/base-client/components/ticket/TicketDetailsView/part/TicketDetailsFlow.vue +260 -260
  323. package/src/base-client/components/ticket/TicketDetailsView/part/index.js +3 -3
  324. package/src/base-client/components/ticket/TicketSubmitSuccessView/TicketSubmitSuccessView.vue +532 -532
  325. package/src/base-client/components/ticket/TicketSubmitSuccessView/index.js +3 -3
  326. package/src/base-client/components/ticket/TicketSubmitSuccessView/index.md +29 -29
  327. package/src/base-client/plugins/AppData.js +126 -126
  328. package/src/base-client/plugins/Config.js +19 -19
  329. package/src/base-client/plugins/GetLoginInfoService.js +183 -183
  330. package/src/base-client/plugins/PagedList.js +177 -177
  331. package/src/base-client/plugins/Recording.js +258 -258
  332. package/src/base-client/plugins/__tests__/selectValueTypeHelper.test.js +154 -154
  333. package/src/base-client/plugins/authority-plugin.js +167 -167
  334. package/src/base-client/plugins/compatible/LoginServiceOA.js +20 -20
  335. package/src/base-client/plugins/i18n-extend.js +32 -32
  336. package/src/base-client/plugins/index.js +23 -23
  337. package/src/base-client/plugins/moment.js +8 -8
  338. package/src/base-client/plugins/selectValueTypeHelper.js +281 -281
  339. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  340. package/src/bootstrap.js +51 -51
  341. package/src/components/Charts/Bar.vue +62 -62
  342. package/src/components/Charts/ChartCard.vue +134 -134
  343. package/src/components/Charts/Liquid.vue +67 -67
  344. package/src/components/Charts/MiniArea.vue +39 -39
  345. package/src/components/Charts/MiniBar.vue +39 -39
  346. package/src/components/Charts/MiniProgress.vue +75 -75
  347. package/src/components/Charts/MiniSmoothArea.vue +40 -40
  348. package/src/components/Charts/Radar.vue +68 -68
  349. package/src/components/Charts/RankList.vue +77 -77
  350. package/src/components/Charts/TagCloud.vue +113 -113
  351. package/src/components/Charts/TransferBar.vue +64 -64
  352. package/src/components/Charts/Trend.vue +82 -82
  353. package/src/components/Charts/chart.less +12 -12
  354. package/src/components/Charts/smooth.area.less +13 -13
  355. package/src/components/CodeMirror/inedx.vue +118 -118
  356. package/src/components/CodeMirror/setting.js +40 -40
  357. package/src/components/Ellipsis/Ellipsis.vue +65 -65
  358. package/src/components/Ellipsis/index.js +3 -3
  359. package/src/components/Ellipsis/index.md +38 -38
  360. package/src/components/FileImageItem/FileItem.vue +320 -320
  361. package/src/components/FileImageItem/FileItemGroup.vue +197 -197
  362. package/src/components/FileImageItem/ImageItem.vue +107 -107
  363. package/src/components/FileImageItem/index.js +4 -4
  364. package/src/components/FilePreview/FilePreview.vue +181 -181
  365. package/src/components/FilePreview/FilePreviewDemo.vue +30 -30
  366. package/src/components/FilePreview/index.js +3 -3
  367. package/src/components/HeightScanner/index.vue +615 -615
  368. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  369. package/src/components/NumberInfo/index.js +3 -3
  370. package/src/components/NumberInfo/index.less +54 -54
  371. package/src/components/NumberInfo/index.md +43 -43
  372. package/src/components/STable/README.md +341 -341
  373. package/src/components/STable/index.js +558 -558
  374. package/src/components/TableSetting/TableSetting.vue +143 -143
  375. package/src/components/TableSetting/index.js +3 -3
  376. package/src/components/Trend/Trend.vue +41 -41
  377. package/src/components/Trend/index.js +3 -3
  378. package/src/components/Trend/index.less +41 -41
  379. package/src/components/Trend/index.md +45 -45
  380. package/src/components/_util/util.js +46 -46
  381. package/src/components/cache/AKeepAlive.js +179 -179
  382. package/src/components/card/ChartCard.vue +79 -79
  383. package/src/components/chart/Bar.vue +60 -60
  384. package/src/components/chart/MiniArea.vue +67 -67
  385. package/src/components/chart/MiniBar.vue +59 -59
  386. package/src/components/chart/MiniProgress.vue +57 -57
  387. package/src/components/chart/Radar.vue +80 -80
  388. package/src/components/chart/RankingList.vue +60 -60
  389. package/src/components/chart/Trend.vue +79 -79
  390. package/src/components/chart/index.less +9 -9
  391. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  392. package/src/components/checkbox/ImgCheckbox.vue +117 -117
  393. package/src/components/checkbox/ImgCheckboxGroup.vue +76 -76
  394. package/src/components/checkbox/index.js +9 -9
  395. package/src/components/exception/ExceptionPage.vue +70 -70
  396. package/src/components/exception/typeConfig.js +19 -19
  397. package/src/components/form/FormRow.vue +52 -52
  398. package/src/components/g2Charts/constants.js +202 -202
  399. package/src/components/g2Charts/demo.vue +808 -808
  400. package/src/components/g2Charts/designer.vue +228 -228
  401. package/src/components/g2Charts/designerBaseConfig.vue +61 -61
  402. package/src/components/g2Charts/designerDataConfig.vue +259 -259
  403. package/src/components/g2Charts/designerStyleConfig.vue +16 -16
  404. package/src/components/g2Charts/index.vue +397 -397
  405. package/src/components/index.js +36 -36
  406. package/src/components/index.less +5 -5
  407. package/src/components/input/IInput.vue +66 -66
  408. package/src/components/menu/Contextmenu.vue +84 -84
  409. package/src/components/menu/SideMenu.vue +75 -75
  410. package/src/components/menu/index.less +38 -38
  411. package/src/components/menu/menu.js +273 -273
  412. package/src/components/page/header/PageHeader.vue +64 -64
  413. package/src/components/page/header/index.less +40 -40
  414. package/src/components/result/Result.vue +77 -77
  415. package/src/components/setting/Setting.vue +234 -234
  416. package/src/components/setting/SettingItem.vue +26 -26
  417. package/src/components/setting/i18n.js +117 -117
  418. package/src/components/table/StandardTable.vue +141 -141
  419. package/src/components/table/advance/ActionColumns.vue +158 -158
  420. package/src/components/table/advance/ActionSize.vue +45 -45
  421. package/src/components/table/advance/AdvanceTable.vue +275 -275
  422. package/src/components/table/advance/SearchArea.vue +355 -355
  423. package/src/components/table/advance/index.js +2 -2
  424. package/src/components/table/api/ApiTable.vue +50 -50
  425. package/src/components/task/TaskGroup.vue +80 -80
  426. package/src/components/task/TaskItem.vue +26 -26
  427. package/src/components/tool/AStepItem.vue +60 -60
  428. package/src/components/tool/AvatarList.vue +68 -68
  429. package/src/components/tool/DetailList.vue +157 -157
  430. package/src/components/tool/Drawer.vue +142 -142
  431. package/src/components/tool/FooterToolBar.vue +30 -30
  432. package/src/components/tool/HeadInfo.vue +35 -35
  433. package/src/components/tool/TagSelect.vue +83 -83
  434. package/src/components/tool/TagSelectOption.vue +33 -33
  435. package/src/components/transition/PageToggleTransition.vue +97 -97
  436. package/src/config/CreateQueryConfig.js +325 -325
  437. package/src/config/default/admin.config.js +18 -18
  438. package/src/config/default/animate.config.js +21 -21
  439. package/src/config/default/antd.config.js +89 -89
  440. package/src/config/default/index.js +6 -6
  441. package/src/config/default/setting.config.js +55 -55
  442. package/src/config/index.js +3 -3
  443. package/src/config/replacer/index.js +10 -10
  444. package/src/config/replacer/resolve.config.js +67 -67
  445. package/src/expression/ExpressionRunner.js +26 -26
  446. package/src/expression/TestExpression.js +509 -509
  447. package/src/expression/core/Delegate.js +115 -115
  448. package/src/expression/core/Expression.js +1358 -1358
  449. package/src/expression/core/Program.js +932 -932
  450. package/src/expression/core/Token.js +27 -27
  451. package/src/expression/enums/ExpressionType.js +81 -81
  452. package/src/expression/enums/TokenType.js +11 -11
  453. package/src/expression/exception/BreakWayException.js +2 -2
  454. package/src/expression/exception/ContinueWayException.js +2 -2
  455. package/src/expression/exception/ExpressionException.js +28 -28
  456. package/src/expression/exception/ReturnWayException.js +14 -14
  457. package/src/expression/exception/ServiceException.js +22 -22
  458. package/src/expression/instances/LogicConsole.js +44 -44
  459. package/src/expression/ts/ExpressionRunner.ts +28 -28
  460. package/src/expression/ts/TestExpression.ts +509 -509
  461. package/src/expression/ts/core/Delegate.ts +114 -114
  462. package/src/expression/ts/core/Expression.ts +1309 -1309
  463. package/src/expression/ts/core/Program.ts +950 -950
  464. package/src/expression/ts/core/Token.ts +29 -29
  465. package/src/expression/ts/enums/ExpressionType.ts +81 -81
  466. package/src/expression/ts/enums/TokenType.ts +13 -13
  467. package/src/expression/ts/exception/BreakWayException.ts +2 -2
  468. package/src/expression/ts/exception/ContinueWayException.ts +2 -2
  469. package/src/expression/ts/exception/ExpressionException.ts +28 -28
  470. package/src/expression/ts/exception/ReturnWayException.ts +14 -14
  471. package/src/expression/ts/exception/ServiceException.ts +22 -22
  472. package/src/expression/ts/instances/JSONArray.ts +48 -48
  473. package/src/expression/ts/instances/JSONObject.ts +109 -109
  474. package/src/expression/ts/instances/LogicConsole.ts +32 -32
  475. package/src/font-style/font.css +4 -4
  476. package/src/layouts/AdminLayout.vue +176 -176
  477. package/src/layouts/BlankView.vue +81 -81
  478. package/src/layouts/CommonLayout.vue +56 -56
  479. package/src/layouts/ComponentLayoutOne.vue +47 -47
  480. package/src/layouts/GridView.vue +43 -43
  481. package/src/layouts/PageLayout.vue +151 -151
  482. package/src/layouts/PageView.vue +55 -55
  483. package/src/layouts/SinglePageView.vue +136 -136
  484. package/src/layouts/footer/PageFooter.vue +49 -49
  485. package/src/layouts/header/AdminHeader.vue +132 -132
  486. package/src/layouts/header/HeaderAvatar.vue +64 -64
  487. package/src/layouts/header/HeaderNotice.vue +177 -177
  488. package/src/layouts/header/HeaderSearch.vue +67 -67
  489. package/src/layouts/header/InstitutionDetail.vue +181 -181
  490. package/src/layouts/header/index.less +92 -92
  491. package/src/layouts/tabs/TabsHead.vue +189 -189
  492. package/src/layouts/tabs/TabsView.vue +383 -383
  493. package/src/layouts/tabs/i18n.js +25 -25
  494. package/src/layouts/tabs/index.js +2 -2
  495. package/src/lib.js +1 -1
  496. package/src/logic/LogicRunner.js +62 -62
  497. package/src/logic/TestLogic.js +13 -13
  498. package/src/logic/plugins/common/DateTools.js +35 -35
  499. package/src/logic/plugins/common/VueTools.js +30 -30
  500. package/src/logic/plugins/index.js +7 -7
  501. package/src/logic/ts/LogicRunner.ts +67 -67
  502. package/src/logic/ts/TestLogic.ts +13 -13
  503. package/src/main.js +33 -33
  504. package/src/mixins/formValidationMixin.js +46 -46
  505. package/src/mock/common/activityData.js +32 -32
  506. package/src/mock/common/index.js +89 -89
  507. package/src/mock/common/reportData.js +20 -20
  508. package/src/mock/common/tableData.js +118 -118
  509. package/src/mock/extend/index.js +84 -84
  510. package/src/mock/goods/index.js +108 -108
  511. package/src/mock/index.js +12 -12
  512. package/src/mock/project/index.js +17 -17
  513. package/src/mock/user/current.js +13 -13
  514. package/src/mock/user/login.js +39 -39
  515. package/src/mock/user/routes.js +61 -61
  516. package/src/mock/workplace/index.js +15 -15
  517. package/src/pages/DefaultExample/index.vue +77 -77
  518. package/src/pages/DynamicStatistics/ChartSelector.vue +331 -331
  519. package/src/pages/DynamicStatistics/DataTabs.vue +83 -83
  520. package/src/pages/DynamicStatistics/DynamicTable.vue +128 -128
  521. package/src/pages/DynamicStatistics/EvaluationArea.vue +69 -69
  522. package/src/pages/DynamicStatistics/FavoriteList.vue +50 -50
  523. package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +591 -591
  524. package/src/pages/DynamicStatistics/SearchBar.vue +192 -192
  525. package/src/pages/DynamicStatistics/index.vue +282 -282
  526. package/src/pages/Example/childIndex.vue +15 -15
  527. package/src/pages/Example/index.vue +30 -30
  528. package/src/pages/LogicCallExample/index.vue +46 -46
  529. package/src/pages/NewDynamicStatistics/ChartSelector.vue +331 -331
  530. package/src/pages/NewDynamicStatistics/DataTabs.vue +122 -122
  531. package/src/pages/NewDynamicStatistics/DynamicTable.vue +128 -128
  532. package/src/pages/NewDynamicStatistics/EvaluationArea.vue +69 -69
  533. package/src/pages/NewDynamicStatistics/FavoriteList.vue +50 -50
  534. package/src/pages/NewDynamicStatistics/QuestionHistoryAndFavorites.vue +289 -289
  535. package/src/pages/NewDynamicStatistics/SearchBar.vue +193 -193
  536. package/src/pages/NewDynamicStatistics/index.vue +258 -258
  537. package/src/pages/Recording/index.vue +77 -77
  538. package/src/pages/ReportGrid/index.vue +76 -76
  539. package/src/pages/ReportView.vue +50 -50
  540. package/src/pages/ServiceReview/index.vue +284 -284
  541. package/src/pages/SubExample/index.vue +26 -26
  542. package/src/pages/WorkflowDetail/WorkFlowDemo.vue +47 -47
  543. package/src/pages/WorkflowDetail/WorkFlowDemo2.vue +204 -204
  544. package/src/pages/WorkflowDetail/WorkFlowDemo3.vue +203 -203
  545. package/src/pages/WorkflowDetail/WorkflowDetail.vue +397 -397
  546. package/src/pages/WorkflowDetail/WorkflowPageDetail/LeaveMessage.vue +388 -388
  547. package/src/pages/WorkflowDetail/WorkflowPageDetail/TrimTextTail.vue +23 -23
  548. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowBaseInformation.vue +415 -415
  549. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowBaseInformationDetails.vue +276 -276
  550. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandle.vue +1766 -1766
  551. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandleReso.vue +975 -975
  552. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowPreview.vue +125 -125
  553. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowTimeline.vue +929 -929
  554. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkOrderParentDetails.vue +218 -218
  555. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowDetailResso.vue +243 -243
  556. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowListResolution.vue +248 -248
  557. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowLog.vue +188 -188
  558. package/src/pages/WorkflowDetail/WorkflowPageDetail/components/WorkflowPersonSelector.vue +109 -109
  559. package/src/pages/WorkflowDetail/WorkflowPageDetail/worklog.vue +97 -97
  560. package/src/pages/XPageViewExample/index.vue +149 -149
  561. package/src/pages/XReportView/index.vue +64 -64
  562. package/src/pages/XTreeOneProExample/index.vue +67 -67
  563. package/src/pages/addressSelect/addressDemo.vue +24 -24
  564. package/src/pages/addressSelect/index.vue +270 -270
  565. package/src/pages/dashboard/workplace/WorkPlace.vue +141 -141
  566. package/src/pages/dashboard/workplace/i18n.js +40 -40
  567. package/src/pages/dashboard/workplace/index.js +2 -2
  568. package/src/pages/dashboard/workplace/index.less +59 -59
  569. package/src/pages/exception/403.vue +21 -21
  570. package/src/pages/exception/404.vue +24 -24
  571. package/src/pages/exception/500.vue +21 -21
  572. package/src/pages/login/Login.vue +380 -380
  573. package/src/pages/login/LoginV3.vue +389 -389
  574. package/src/pages/login/index.js +2 -2
  575. package/src/pages/lowCode/lowCodeEditor.vue +1219 -1219
  576. package/src/pages/lowCode/lowCodeRenderPage.vue +43 -43
  577. package/src/pages/report/ReportTable.js +124 -124
  578. package/src/pages/report/ReportTableHome.vue +28 -28
  579. package/src/pages/resourceManage/depListManage.vue +23 -23
  580. package/src/pages/resourceManage/funListManage.vue +23 -23
  581. package/src/pages/resourceManage/index.js +15 -15
  582. package/src/pages/resourceManage/orgListManage.vue +98 -98
  583. package/src/pages/resourceManage/resourceManageMain.vue +57 -57
  584. package/src/pages/resourceManage/roleListManage.vue +23 -23
  585. package/src/pages/resourceManage/staffListManage.vue +23 -23
  586. package/src/pages/system/dictionary/index.vue +44 -44
  587. package/src/pages/system/file/Info.vue +56 -56
  588. package/src/pages/system/file/index.vue +317 -317
  589. package/src/pages/system/monitor/loginInfor/index.vue +37 -37
  590. package/src/pages/system/monitor/operLog/index.vue +37 -37
  591. package/src/pages/system/settings/index.vue +126 -126
  592. package/src/pages/system/settings/modifyPassword.vue +117 -117
  593. package/src/pages/system/ticket/index.vue +480 -480
  594. package/src/pages/system/ticket/submitTicketSuccess.vue +484 -484
  595. package/src/pages/userInfoDetailManage/ChangeMeterRecordQuery/index.vue +64 -64
  596. package/src/pages/userInfoDetailManage/FillCardRecordQuery/index.vue +77 -77
  597. package/src/pages/userInfoDetailManage/FillGasRecordQuery/index.vue +75 -75
  598. package/src/pages/userInfoDetailManage/InfoChangeRecordQuery/index.vue +64 -64
  599. package/src/pages/userInfoDetailManage/InstructRecordQuery/index.vue +64 -64
  600. package/src/pages/userInfoDetailManage/InsuranceDetailQuery/index.vue +64 -64
  601. package/src/pages/userInfoDetailManage/MachineRecordQuery/index.vue +75 -75
  602. package/src/pages/userInfoDetailManage/MeterParamRecordQuery/index.vue +64 -64
  603. package/src/pages/userInfoDetailManage/OtherChargeRecordQuery/index.vue +75 -75
  604. package/src/pages/userInfoDetailManage/PriceAdjustments/index.vue +64 -64
  605. package/src/pages/userInfoDetailManage/TransferRecordQuery/index.vue +66 -66
  606. package/src/pages/userInfoDetailManage/UserChargeRecordQuery/index.vue +94 -94
  607. package/src/pages/userInfoDetailManage/UserException/index.vue +64 -64
  608. package/src/pages/userInfoDetailManage/UserHandRecordQuery/index.vue +87 -87
  609. package/src/pages/userInfoDetailManage/UserRecordQuery/index.vue +74 -74
  610. package/src/pages/userInfoDetailManage/WatchCollectionRecordQuery/index.vue +64 -64
  611. package/src/pages/userInfoDetailManage/index.vue +290 -290
  612. package/src/pages/userInfoDetailManage/uploadFilesHistory/ImagePreview.vue +101 -101
  613. package/src/pages/userInfoDetailManage/uploadFilesHistory/index.vue +129 -129
  614. package/src/pages/userInfoDetailManage/userInfoDetailQueryTabs.vue +144 -144
  615. package/src/plugins/EventLogPlugin.js +33 -33
  616. package/src/plugins/FindParentsData.js +17 -17
  617. package/src/plugins/HiPrintPlugin.js +164 -164
  618. package/src/router/async/config.async.js +35 -35
  619. package/src/router/async/router.map.js +127 -127
  620. package/src/router/guards.js +262 -262
  621. package/src/router/i18n.js +57 -57
  622. package/src/router/index.js +27 -27
  623. package/src/router.js +17 -17
  624. package/src/services/DataModel.js +30 -30
  625. package/src/services/LodopFuncs.js +137 -137
  626. package/src/services/api/DictionaryDetailsViewApi.js +6 -6
  627. package/src/services/api/LogDetailsViewApi.js +10 -10
  628. package/src/services/api/QueryParamsDetailsViewApi.js +6 -6
  629. package/src/services/api/TicketDetailsViewApi.js +46 -46
  630. package/src/services/api/cas.js +79 -79
  631. package/src/services/api/common.js +346 -346
  632. package/src/services/api/entity.js +18 -18
  633. package/src/services/api/index.js +17 -17
  634. package/src/services/api/logininfor/index.js +6 -6
  635. package/src/services/api/manage.js +8 -8
  636. package/src/services/api/restTools.js +215 -215
  637. package/src/services/api/workFlow.js +57 -57
  638. package/src/services/apiService.js +16 -16
  639. package/src/services/dataSource.js +12 -12
  640. package/src/services/index.js +7 -7
  641. package/src/services/user.js +92 -92
  642. package/src/services/v3Api.js +116 -116
  643. package/src/store/index.js +5 -5
  644. package/src/store/modules/account.js +115 -115
  645. package/src/store/modules/index.js +5 -5
  646. package/src/store/modules/lowCode.js +33 -33
  647. package/src/store/modules/setting.js +119 -119
  648. package/src/store/mutation-types.js +4 -4
  649. package/src/theme/antd/ant-menu.less +2 -2
  650. package/src/theme/antd/ant-message.less +3 -3
  651. package/src/theme/antd/ant-table.less +22 -22
  652. package/src/theme/antd/ant-time-picker.less +3 -3
  653. package/src/theme/antd/index.less +3 -3
  654. package/src/theme/default/color.less +43 -43
  655. package/src/theme/default/index.less +3 -3
  656. package/src/theme/default/nprogress.less +76 -76
  657. package/src/theme/default/style.less +58 -58
  658. package/src/theme/global.less +279 -279
  659. package/src/theme/index.less +5 -5
  660. package/src/theme/reportTable.less +58 -58
  661. package/src/theme/theme.less +1 -1
  662. package/src/utils/EncryptUtil.js +162 -162
  663. package/src/utils/Objects.js +25 -25
  664. package/src/utils/authority-utils.js +85 -85
  665. package/src/utils/axios-interceptors.js +100 -100
  666. package/src/utils/colors.js +107 -107
  667. package/src/utils/common.js +10 -10
  668. package/src/utils/errorCode.js +6 -6
  669. package/src/utils/excel/Blob.js +180 -180
  670. package/src/utils/excel/Export2Excel.js +184 -184
  671. package/src/utils/filter.js +21 -21
  672. package/src/utils/formatter.js +74 -74
  673. package/src/utils/htmlToPDF.js +108 -108
  674. package/src/utils/htmlToPDFApi.js +5 -5
  675. package/src/utils/i18n.js +80 -80
  676. package/src/utils/indexedDB.js +549 -549
  677. package/src/utils/login.js +188 -188
  678. package/src/utils/lowcode/lowcodeComponentMixin.js +120 -120
  679. package/src/utils/lowcode/lowcodeLog.js +29 -29
  680. package/src/utils/lowcode/lowcodeUtils.js +373 -373
  681. package/src/utils/lowcode/registerComponentForEditor.js +1 -1
  682. package/src/utils/lowcode/registerComponentForRender.js +11 -11
  683. package/src/utils/map-utils.js +47 -47
  684. package/src/utils/microAppUtils.js +49 -49
  685. package/src/utils/reg.js +95 -95
  686. package/src/utils/request.js +395 -395
  687. package/src/utils/routerUtil.js +567 -567
  688. package/src/utils/runEvalFunction.js +14 -14
  689. package/src/utils/theme-color-replacer-extend.js +92 -92
  690. package/src/utils/themeUtil.js +100 -100
  691. package/src/utils/util.js +329 -329
  692. package/src/utils/waterMark.js +31 -31
  693. package/test/Tree.spec.js +168 -168
  694. package/test/myDialog.spec.js +47 -47
  695. package/test/request.test.js +17 -17
  696. package/test/util.test.js +53 -53
  697. package/test/v3Api.test.js +1984 -1984
  698. package/tests/unit/ReportTable.spec.js +16 -16
  699. package/vue.config.js +222 -222
  700. package//350/277/201/347/247/273/346/227/245/345/277/227.md +15 -15
  701. package/.history/public/his/editor/editor_20250606134713.html +0 -51
  702. package/.history/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox_20250527173925.vue +0 -509
  703. package/.history/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox_20250527174316.vue +0 -524
  704. package/.history/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox_20250527174419.vue +0 -524
  705. package/.history/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox_20250527174422.vue +0 -524
  706. package/.history/src/base-client/components/common/XAddReport/XAddReport_20250611172825.vue +0 -207
  707. package/.history/src/base-client/components/common/XAddReport/XAddReport_20250611172945.vue +0 -211
  708. package/.history/src/base-client/components/common/XAddReport/XAddReport_20250611172949.vue +0 -212
  709. package/.history/src/base-client/components/common/XAddReport/XAddReport_20250611173010.vue +0 -212
  710. package/.history/src/base-client/components/common/XForm/XFormItem_20250508134122.vue +0 -1320
  711. package/.history/src/base-client/components/common/XForm/XFormItem_20250527171604.vue +0 -1332
  712. package/.history/src/base-client/components/common/XForm/XFormItem_20250527171613.vue +0 -1331
  713. package/.history/src/base-client/components/common/XForm/XFormItem_20250527171703.vue +0 -1331
  714. package/.history/src/base-client/components/common/XForm/XFormItem_20250527171720.vue +0 -1331
  715. package/.history/src/base-client/components/common/XForm/XFormItem_20250527174327.vue +0 -1339
  716. package/.history/src/base-client/components/common/XReportGrid/XReportTrGroup_20250612092804.vue +0 -731
  717. package/.history/src/base-client/components/common/XReportGrid/XReportTrGroup_20250612112546.vue +0 -748
  718. package/.history/src/base-client/components/common/XReportGrid/XReportTrGroup_20250612113808.vue +0 -748
  719. package/.history/src/base-client/components/common/XReportGrid/XReport_20250612115237.vue +0 -1071
  720. package/.history/src/base-client/components/common/XReportGrid/XReport_20250612115346.vue +0 -1078
  721. package/.history/src/base-client/components/common/XReportGrid/XReport_20250612115350.vue +0 -1077
  722. package/.history/src/base-client/components/common/XReportGrid/XReport_20250612115415.vue +0 -1077
  723. package/.history/src/base-client/components/common/XReportGrid/XReport_20250612115429.vue +0 -1077
  724. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611091619.vue +0 -442
  725. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611092547.vue +0 -442
  726. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611092552.vue +0 -442
  727. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611092744.vue +0 -475
  728. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611092955.vue +0 -475
  729. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611092957.vue +0 -475
  730. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611095652.vue +0 -477
  731. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611095701.vue +0 -477
  732. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611095704.vue +0 -477
  733. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100005.vue +0 -473
  734. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100011.vue +0 -473
  735. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100014.vue +0 -473
  736. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100833.vue +0 -473
  737. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100853.vue +0 -473
  738. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100940.vue +0 -473
  739. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101011.vue +0 -473
  740. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101013.vue +0 -473
  741. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101014.vue +0 -473
  742. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101159.vue +0 -473
  743. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101238.vue +0 -474
  744. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101240.vue +0 -474
  745. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101242.vue +0 -474
  746. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101404.vue +0 -472
  747. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101410.vue +0 -472
  748. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101459.vue +0 -472
  749. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101500.vue +0 -472
  750. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101502.vue +0 -472
  751. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101504.vue +0 -472
  752. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101610.vue +0 -501
  753. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101700.vue +0 -501
  754. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101702.vue +0 -501
  755. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101741.vue +0 -504
  756. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101749.vue +0 -504
  757. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101759.vue +0 -504
  758. package/.history/src/base-client/components/his/XHisEditor/dome_20250611091349.vue +0 -131
  759. package/.history/src/base-client/components/his/XHisEditor/dome_20250611105854.vue +0 -160
  760. package/.history/src/base-client/components/his/XHisEditor/dome_20250611105902.vue +0 -160
  761. package/.history/src/base-client/components/his/XHisEditor/dome_20250611105924.vue +0 -160
  762. package/.history/src/base-client/components/his/XHisEditor/dome_20250611105932.vue +0 -158
  763. package/.history/src/base-client/components/his/XList/XList_20250609135848.vue +0 -173
  764. package/.history/src/base-client/components/his/XList/XList_20250609141026.vue +0 -222
  765. package/.history/src/base-client/components/his/XList/XList_20250609141035.vue +0 -229
  766. package/.history/src/base-client/components/his/XList/XList_20250609141103.vue +0 -229
  767. package/.history/src/base-client/components/his/XList/XList_20250609141105.vue +0 -229
  768. package/.history/src/base-client/components/his/XList/XList_20250609141334.vue +0 -241
  769. package/.history/src/base-client/components/his/XList/XList_20250609141404.vue +0 -241
  770. package/.history/src/base-client/components/his/XList/XList_20250609141406.vue +0 -241
  771. package/.history/src/base-client/components/his/XList/XList_20250609141801.vue +0 -245
  772. package/.history/src/base-client/components/his/XList/XList_20250609142033.vue +0 -245
  773. package/.history/src/base-client/components/his/XList/XList_20250609142038.vue +0 -245
  774. package/.history/src/base-client/components/his/XList/XList_20250609142435.vue +0 -255
  775. package/.history/src/base-client/components/his/XList/XList_20250609142503.vue +0 -255
  776. package/.history/src/base-client/components/his/XList/XList_20250609142504.vue +0 -255
  777. package/.history/src/base-client/components/his/XList/XList_20250609143012.vue +0 -270
  778. package/.history/src/base-client/components/his/XList/XList_20250609143044.vue +0 -270
  779. package/.history/src/base-client/components/his/XList/XList_20250609143046.vue +0 -270
  780. package/.history/src/base-client/components/his/XList/XList_20250609143210.vue +0 -270
  781. package/.history/src/base-client/components/his/XList/XList_20250609144339.vue +0 -294
  782. package/.history/src/base-client/components/his/XList/XList_20250609144410.vue +0 -294
  783. package/.history/src/base-client/components/his/XList/XList_20250609144412.vue +0 -294
  784. package/.history/src/base-client/components/his/XList/XList_20250609144647.vue +0 -303
  785. package/.history/src/base-client/components/his/XList/XList_20250609144716.vue +0 -303
  786. package/.history/src/base-client/components/his/XList/XList_20250609144729.vue +0 -303
  787. package/.history/src/base-client/components/his/XList/XList_20250609151232.vue +0 -288
  788. package/.history/src/base-client/components/his/XList/XList_20250609151247.vue +0 -288
  789. package/.history/src/base-client/components/his/XList/XList_20250609151252.vue +0 -288
  790. package/.history/src/base-client/components/his/XList/XList_20250609161220.vue +0 -317
  791. package/.history/src/base-client/components/his/XList/XList_20250609161258.vue +0 -306
  792. package/.history/src/base-client/components/his/XList/XList_20250609161319.vue +0 -306
  793. package/.history/src/base-client/components/his/XList/XList_20250609161320.vue +0 -306
  794. package/.history/src/base-client/components/his/XList/XList_20250704142024.vue +0 -495
  795. package/.history/src/base-client/components/his/XList/XList_20250704142033.vue +0 -495
  796. package/.history/src/base-client/components/his/XList/XList_20250704142040.vue +0 -494
  797. package/.history/src/base-client/components/his/XList/XList_20250704142211.vue +0 -494
  798. package/.history/src/base-client/components/his/XList/XList_20250704142214.vue +0 -494
  799. package/.history/src/base-client/components/his/XList/XList_20250704143010.vue +0 -495
  800. package/.history/src/base-client/components/his/XList/XList_20250704143203.vue +0 -495
  801. package/.history/src/base-client/components/his/XList/XList_20250707095101.vue +0 -492
  802. package/.history/src/base-client/components/his/XList/XList_20250707100152.vue +0 -492
  803. package/.history/src/base-client/components/his/XList/XList_20250707100200.vue +0 -485
  804. package/.history/src/base-client/components/his/XList/XList_20250707100208.vue +0 -485
  805. package/.history/src/base-client/components/his/XList/XList_20250707100259.vue +0 -488
  806. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807134604.vue +0 -263
  807. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807134615.vue +0 -302
  808. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807134621.vue +0 -301
  809. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807134634.vue +0 -311
  810. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807134644.vue +0 -330
  811. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807134653.vue +0 -330
  812. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807134836.vue +0 -330
  813. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807135247.vue +0 -330
  814. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807135303.vue +0 -354
  815. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807135316.vue +0 -363
  816. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807135323.vue +0 -363
  817. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807135334.vue +0 -366
  818. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807135342.vue +0 -364
  819. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807135349.vue +0 -364
  820. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807135351.vue +0 -346
  821. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807135354.vue +0 -346
  822. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807135401.vue +0 -346
  823. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807135406.vue +0 -346
  824. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807135424.vue +0 -346
  825. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807143043.vue +0 -254
  826. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807155506.vue +0 -329
  827. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807155535.vue +0 -330
  828. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807155543.vue +0 -330
  829. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807155926.vue +0 -304
  830. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807155928.vue +0 -304
  831. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807172548.vue +0 -298
  832. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807172609.vue +0 -298
  833. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807172623.vue +0 -298
  834. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807172631.vue +0 -298
  835. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807172701.vue +0 -298
  836. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807172704.vue +0 -298
  837. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807175937.vue +0 -290
  838. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807175942.vue +0 -290
  839. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807180210.vue +0 -290
  840. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807180424.vue +0 -290
  841. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807180448.vue +0 -290
  842. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807180915.vue +0 -262
  843. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250807180917.vue +0 -262
  844. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250808101106.vue +0 -283
  845. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250808101112.vue +0 -289
  846. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250808101118.vue +0 -289
  847. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250808101129.vue +0 -294
  848. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250808101137.vue +0 -318
  849. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250808101145.vue +0 -320
  850. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250808101154.vue +0 -320
  851. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250808101211.vue +0 -320
  852. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250808101236.vue +0 -320
  853. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250808101239.vue +0 -320
  854. package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807103845.vue +0 -142
  855. package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807103852.vue +0 -142
  856. package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807103857.vue +0 -142
  857. package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807103859.vue +0 -142
  858. package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807103907.vue +0 -142
  859. package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807103910.vue +0 -142
  860. package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807103911.vue +0 -142
  861. package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807103913.vue +0 -142
  862. package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807103916.vue +0 -142
  863. package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807103931.vue +0 -142
  864. package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807145127.vue +0 -85
  865. package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807145136.vue +0 -81
  866. package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807145142.vue +0 -81
  867. package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807145145.vue +0 -81
  868. package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807145148.vue +0 -81
  869. package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807145151.vue +0 -81
  870. package/.history/src/base-client/components/his/XShiftSchedule/dome_20250807145155.vue +0 -81
  871. package/Users/objecrt/af-vue2-client/src/base-client/components/his/XShiftSchedule/XShiftSchedule.vue +0 -213
  872. package/src/base-client/components/TreeList/TreeList.vue +0 -91
  873. package/src/base-client/components/TreeList/TreeNode.vue +0 -81
  874. package/src/base-client/components/common/XCardSet/XTiltle.vue +0 -191
  875. package/src/base-client/components/his/XHisEditor/dome.vue +0 -144
@@ -1,1486 +1,1486 @@
1
- /** @preserve
2
- jSignature v2 "${buildDate}" "${commitID}"
3
- Copyright (c) 2012 Willow Systems Corp http://willow-systems.com
4
- Copyright (c) 2010 Brinley Ang http://www.unbolt.net
5
- MIT License <http://www.opensource.org/licenses/mit-license.php>
6
-
7
- */
8
- ;(function() {
9
-
10
- var apinamespace = 'jSignature'
11
-
12
- /**
13
- Allows one to delay certain eventual action by setting up a timer for it and allowing one to delay it
14
- by "kick"ing it. Sorta like "kick the can down the road"
15
-
16
- @public
17
- @class
18
- @param
19
- @returns {Type}
20
- */
21
- var KickTimerClass = function(time, callback) {
22
- var timer;
23
- this.kick = function() {
24
- clearTimeout(timer);
25
- timer = setTimeout(
26
- callback
27
- , time
28
- );
29
- }
30
- this.clear = function() {
31
- clearTimeout(timer);
32
- }
33
- return this;
34
- }
35
-
36
- var PubSubClass = function(context){
37
- 'use strict'
38
- /* @preserve
39
- -----------------------------------------------------------------------------------------------
40
- JavaScript PubSub library
41
- 2012 (c) Willow Systems Corp (www.willow-systems.com)
42
- based on Peter Higgins (dante@dojotoolkit.org)
43
- Loosely based on Dojo publish/subscribe API, limited in scope. Rewritten blindly.
44
- Original is (c) Dojo Foundation 2004-2010. Released under either AFL or new BSD, see:
45
- http://dojofoundation.org/license for more information.
46
- -----------------------------------------------------------------------------------------------
47
- */
48
- this.topics = {};
49
- // here we choose what will be "this" for the called events.
50
- // if context is defined, it's context. Else, 'this' is this instance of PubSub
51
- this.context = context ? context : this;
52
- /**
53
- * Allows caller to emit an event and pass arguments to event listeners.
54
- * @public
55
- * @function
56
- * @param topic {String} Name of the channel on which to voice this event
57
- * @param **arguments Any number of arguments you want to pass to the listeners of this event.
58
- */
59
- this.publish = function(topic, arg1, arg2, etc) {
60
- 'use strict'
61
- if (this.topics[topic]) {
62
- var currentTopic = this.topics[topic]
63
- , args = Array.prototype.slice.call(arguments, 1)
64
- , toremove = []
65
- , torun = []
66
- , fn
67
- , i, l
68
- , pair;
69
-
70
- for (i = 0, l = currentTopic.length; i < l; i++) {
71
- pair = currentTopic[i]; // this is a [function, once_flag] array
72
- fn = pair[0];
73
- if (pair[1] /* 'run once' flag set */){
74
- pair[0] = function(){};
75
- toremove.push(i);
76
- }
77
- /* don't call the callback right now, it might decide to add or
78
- * remove subscribers which will wreak havoc on our index-based
79
- * iteration */
80
- torun.push(fn);
81
- }
82
- for (i = 0, l = toremove.length; i < l; i++) {
83
- currentTopic.splice(toremove[i], 1);
84
- }
85
- for (i = 0, l = torun.length; i < l; i++) {
86
- torun[i].apply(this.context, args);
87
- }
88
- }
89
- }
90
- /**
91
- * Allows listener code to subscribe to channel and be called when data is available
92
- * @public
93
- * @function
94
- * @param topic {String} Name of the channel on which to voice this event
95
- * @param callback {Function} Executable (function pointer) that will be ran when event is voiced on this channel.
96
- * @param once {Boolean} (optional. False by default) Flag indicating if the function is to be triggered only once.
97
- * @returns {Object} A token object that cen be used for unsubscribing.
98
- */
99
- this.subscribe = function(topic, callback, once) {
100
- 'use strict'
101
- if (!this.topics[topic]) {
102
- this.topics[topic] = [[callback, once]];
103
- } else {
104
- this.topics[topic].push([callback,once]);
105
- }
106
- return {
107
- "topic": topic,
108
- "callback": callback
109
- };
110
- };
111
- /**
112
- * Allows listener code to unsubscribe from a channel
113
- * @public
114
- * @function
115
- * @param token {Object} A token object that was returned by `subscribe` method
116
- */
117
- this.unsubscribe = function(token) {
118
- if (this.topics[token.topic]) {
119
- var currentTopic = this.topics[token.topic];
120
-
121
- for (var i = 0, l = currentTopic.length; i < l; i++) {
122
- if (currentTopic[i] && currentTopic[i][0] === token.callback) {
123
- currentTopic.splice(i, 1);
124
- }
125
- }
126
- }
127
- }
128
- }
129
-
130
- /// Returns front, back and "decor" colors derived from element (as jQuery obj)
131
- function getColors($e){
132
- var tmp
133
- , undef
134
- , frontcolor = $e.css('color')
135
- , backcolor
136
- , e = $e[0];
137
-
138
- var toOfDOM = false;
139
- while(e && !backcolor && !toOfDOM){
140
- try{
141
- tmp = $(e).css('background-color');
142
- } catch (ex) {
143
- tmp = 'transparent';
144
- }
145
- if (tmp !== 'transparent' && tmp !== 'rgba(0, 0, 0, 0)'){
146
- backcolor = tmp;
147
- }
148
- toOfDOM = e.body;
149
- e = e.parentNode;
150
- }
151
-
152
- var rgbaregex = /rgb[a]*\((\d+),\s*(\d+),\s*(\d+)/ // modern browsers
153
- , hexregex = /#([AaBbCcDdEeFf\d]{2})([AaBbCcDdEeFf\d]{2})([AaBbCcDdEeFf\d]{2})/ // IE 8 and less.
154
- , frontcolorcomponents;
155
-
156
- // Decomposing Front color into R, G, B ints
157
- tmp = undef;
158
- tmp = frontcolor.match(rgbaregex);
159
- if (tmp){
160
- frontcolorcomponents = {'r':parseInt(tmp[1],10),'g':parseInt(tmp[2],10),'b':parseInt(tmp[3],10)};
161
- } else {
162
- tmp = frontcolor.match(hexregex);
163
- if (tmp) {
164
- frontcolorcomponents = {'r':parseInt(tmp[1],16),'g':parseInt(tmp[2],16),'b':parseInt(tmp[3],16)};
165
- }
166
- }
167
- // if(!frontcolorcomponents){
168
- // frontcolorcomponents = {'r':255,'g':255,'b':255}
169
- // }
170
-
171
- var backcolorcomponents
172
- // Decomposing back color into R, G, B ints
173
- if(!backcolor){
174
- // HIghly unlikely since this means that no background styling was applied to any element from here to top of dom.
175
- // we'll pick up back color from front color
176
- if(frontcolorcomponents){
177
- if (Math.max.apply(null, [frontcolorcomponents.r, frontcolorcomponents.g, frontcolorcomponents.b]) > 127){
178
- backcolorcomponents = {'r':0,'g':0,'b':0};
179
- } else {
180
- backcolorcomponents = {'r':255,'g':255,'b':255};
181
- }
182
- } else {
183
- // arg!!! front color is in format we don't understand (hsl, named colors)
184
- // Let's just go with white background.
185
- backcolorcomponents = {'r':255,'g':255,'b':255};
186
- }
187
- } else {
188
- tmp = undef;
189
- tmp = backcolor.match(rgbaregex);
190
- if (tmp){
191
- backcolorcomponents = {'r':parseInt(tmp[1],10),'g':parseInt(tmp[2],10),'b':parseInt(tmp[3],10)};
192
- } else {
193
- tmp = backcolor.match(hexregex);
194
- if (tmp) {
195
- backcolorcomponents = {'r':parseInt(tmp[1],16),'g':parseInt(tmp[2],16),'b':parseInt(tmp[3],16)};
196
- }
197
- }
198
- // if(!backcolorcomponents){
199
- // backcolorcomponents = {'r':0,'g':0,'b':0}
200
- // }
201
- }
202
-
203
- // Deriving Decor color
204
- // THis is LAZY!!!! Better way would be to use HSL and adjust luminocity. However, that could be an overkill.
205
-
206
- var toRGBfn = function(o){return 'rgb(' + [o.r, o.g, o.b].join(', ') + ')'}
207
- , decorcolorcomponents
208
- , frontcolorbrightness
209
- , adjusted;
210
-
211
- if (frontcolorcomponents && backcolorcomponents){
212
- var backcolorbrightness = Math.max.apply(null, [frontcolorcomponents.r, frontcolorcomponents.g, frontcolorcomponents.b]);
213
-
214
- frontcolorbrightness = Math.max.apply(null, [backcolorcomponents.r, backcolorcomponents.g, backcolorcomponents.b]);
215
- adjusted = Math.round(frontcolorbrightness + (-1 * (frontcolorbrightness - backcolorbrightness) * 0.75)); // "dimming" the difference between pen and back.
216
- decorcolorcomponents = {'r':adjusted,'g':adjusted,'b':adjusted}; // always shade of gray
217
- } else if (frontcolorcomponents) {
218
- frontcolorbrightness = Math.max.apply(null, [frontcolorcomponents.r, frontcolorcomponents.g, frontcolorcomponents.b]);
219
- var polarity = +1;
220
- if (frontcolorbrightness > 127){
221
- polarity = -1;
222
- }
223
- // shifting by 25% (64 points on RGB scale)
224
- adjusted = Math.round(frontcolorbrightness + (polarity * 96)); // "dimming" the pen's color by 75% to get decor color.
225
- decorcolorcomponents = {'r':adjusted,'g':adjusted,'b':adjusted}; // always shade of gray
226
- } else {
227
- decorcolorcomponents = {'r':191,'g':191,'b':191}; // always shade of gray
228
- }
229
-
230
- return {
231
- 'color': frontcolor
232
- , 'background-color': backcolorcomponents? toRGBfn(backcolorcomponents) : backcolor
233
- , 'decor-color': toRGBfn(decorcolorcomponents)
234
- };
235
- }
236
-
237
- function Vector(x,y){
238
- this.x = x;
239
- this.y = y;
240
- this.reverse = function(){
241
- return new this.constructor(
242
- this.x * -1
243
- , this.y * -1
244
- );
245
- };
246
- this._length = null;
247
- this.getLength = function(){
248
- if (!this._length){
249
- this._length = Math.sqrt( Math.pow(this.x, 2) + Math.pow(this.y, 2) );
250
- }
251
- return this._length;
252
- };
253
-
254
- var polarity = function (e){
255
- return Math.round(e / Math.abs(e));
256
- };
257
- this.resizeTo = function(length){
258
- // proportionally changes x,y such that the hypotenuse (vector length) is = new length
259
- if (this.x === 0 && this.y === 0){
260
- this._length = 0;
261
- } else if (this.x === 0){
262
- this._length = length;
263
- this.y = length * polarity(this.y);
264
- } else if(this.y === 0){
265
- this._length = length;
266
- this.x = length * polarity(this.x);
267
- } else {
268
- var proportion = Math.abs(this.y / this.x)
269
- , x = Math.sqrt(Math.pow(length, 2) / (1 + Math.pow(proportion, 2)))
270
- , y = proportion * x;
271
- this._length = length;
272
- this.x = x * polarity(this.x);
273
- this.y = y * polarity(this.y);
274
- }
275
- return this;
276
- };
277
-
278
- /**
279
- * Calculates the angle between 'this' vector and another.
280
- * @public
281
- * @function
282
- * @returns {Number} The angle between the two vectors as measured in PI.
283
- */
284
- this.angleTo = function(vectorB) {
285
- var divisor = this.getLength() * vectorB.getLength();
286
- if (divisor === 0) {
287
- return 0;
288
- } else {
289
- // JavaScript floating point math is screwed up.
290
- // because of it, the core of the formula can, on occasion, have values
291
- // over 1.0 and below -1.0.
292
- return Math.acos(
293
- Math.min(
294
- Math.max(
295
- ( this.x * vectorB.x + this.y * vectorB.y ) / divisor
296
- , -1.0
297
- )
298
- , 1.0
299
- )
300
- ) / Math.PI;
301
- }
302
- };
303
- }
304
-
305
- function Point(x,y){
306
- this.x = x;
307
- this.y = y;
308
-
309
- this.getVectorToCoordinates = function (x, y) {
310
- return new Vector(x - this.x, y - this.y);
311
- };
312
- this.getVectorFromCoordinates = function (x, y) {
313
- return this.getVectorToCoordinates(x, y).reverse();
314
- };
315
- this.getVectorToPoint = function (point) {
316
- return new Vector(point.x - this.x, point.y - this.y);
317
- };
318
- this.getVectorFromPoint = function (point) {
319
- return this.getVectorToPoint(point).reverse();
320
- };
321
- }
322
-
323
- /*
324
- * About data structure:
325
- * We don't store / deal with "pictures" this signature capture code captures "vectors"
326
- *
327
- * We don't store bitmaps. We store "strokes" as arrays of arrays. (Actually, arrays of objects containing arrays of coordinates.
328
- *
329
- * Stroke = mousedown + mousemoved * n (+ mouseup but we don't record that as that was the "end / lack of movement" indicator)
330
- *
331
- * Vectors = not classical vectors where numbers indicated shift relative last position. Our vectors are actually coordinates against top left of canvas.
332
- * we could calc the classical vectors, but keeping the the actual coordinates allows us (through Math.max / min)
333
- * to calc the size of resulting drawing very quickly. If we want classical vectors later, we can always get them in backend code.
334
- *
335
- * So, the data structure:
336
- *
337
- * var data = [
338
- * { // stroke starts
339
- * x : [101, 98, 57, 43] // x points
340
- * , y : [1, 23, 65, 87] // y points
341
- * } // stroke ends
342
- * , { // stroke starts
343
- * x : [55, 56, 57, 58] // x points
344
- * , y : [101, 97, 54, 4] // y points
345
- * } // stroke ends
346
- * , { // stroke consisting of just a dot
347
- * x : [53] // x points
348
- * , y : [151] // y points
349
- * } // stroke ends
350
- * ]
351
- *
352
- * we don't care or store stroke width (it's canvas-size-relative), color, shadow values. These can be added / changed on whim post-capture.
353
- *
354
- */
355
- function DataEngine(storageObject, context, startStrokeFn, addToStrokeFn, endStrokeFn){
356
- this.data = storageObject; // we expect this to be an instance of Array
357
- this.context = context;
358
-
359
- if (storageObject.length){
360
- // we have data to render
361
- var numofstrokes = storageObject.length
362
- , stroke
363
- , numofpoints;
364
-
365
- for (var i = 0; i < numofstrokes; i++){
366
- stroke = storageObject[i];
367
- numofpoints = stroke.x.length;
368
- startStrokeFn.call(context, stroke);
369
- for(var j = 1; j < numofpoints; j++){
370
- addToStrokeFn.call(context, stroke, j);
371
- }
372
- endStrokeFn.call(context, stroke);
373
- }
374
- }
375
-
376
- this.changed = function(){};
377
-
378
- this.startStrokeFn = startStrokeFn;
379
- this.addToStrokeFn = addToStrokeFn;
380
- this.endStrokeFn = endStrokeFn;
381
-
382
- this.inStroke = false;
383
-
384
- this._lastPoint = null;
385
- this._stroke = null;
386
- this.startStroke = function(point){
387
- if(point && typeof(point.x) == "number" && typeof(point.y) == "number"){
388
- this._stroke = {'x':[point.x], 'y':[point.y]};
389
- this.data.push(this._stroke);
390
- this._lastPoint = point;
391
- this.inStroke = true;
392
- // 'this' does not work same inside setTimeout(
393
- var stroke = this._stroke
394
- , fn = this.startStrokeFn
395
- , context = this.context;
396
- setTimeout(
397
- // some IE's don't support passing args per setTimeout API. Have to create closure every time instead.
398
- function() {fn.call(context, stroke)}
399
- , 3
400
- );
401
- return point;
402
- } else {
403
- return null;
404
- }
405
- };
406
- // that "5" at the very end of this if is important to explain.
407
- // we do NOT render links between two captured points (in the middle of the stroke) if the distance is shorter than that number.
408
- // not only do we NOT render it, we also do NOT capture (add) these intermediate points to storage.
409
- // when clustering of these is too tight, it produces noise on the line, which, because of smoothing, makes lines too curvy.
410
- // maybe, later, we can expose this as a configurable setting of some sort.
411
- this.addToStroke = function(point){
412
- if (this.inStroke &&
413
- typeof(point.x) === "number" &&
414
- typeof(point.y) === "number" &&
415
- // calculates absolute shift in diagonal pixels away from original point
416
- (Math.abs(point.x - this._lastPoint.x) + Math.abs(point.y - this._lastPoint.y)) > 4
417
- ){
418
- var positionInStroke = this._stroke.x.length;
419
- this._stroke.x.push(point.x);
420
- this._stroke.y.push(point.y);
421
- this._lastPoint = point;
422
-
423
- var stroke = this._stroke
424
- , fn = this.addToStrokeFn
425
- , context = this.context;
426
- setTimeout(
427
- // some IE's don't support passing args per setTimeout API. Have to create closure every time instead.
428
- function() {fn.call(context, stroke, positionInStroke)}
429
- , 3
430
- );
431
- return point;
432
- } else {
433
- return null;
434
- }
435
- };
436
- this.endStroke = function(){
437
- var c = this.inStroke;
438
- this.inStroke = false;
439
- this._lastPoint = null;
440
- if (c){
441
- var stroke = this._stroke
442
- , fn = this.endStrokeFn // 'this' does not work same inside setTimeout(
443
- , context = this.context
444
- , changedfn = this.changed;
445
- setTimeout(
446
- // some IE's don't support passing args per setTimeout API. Have to create closure every time instead.
447
- function(){
448
- fn.call(context, stroke);
449
- changedfn.call(context);
450
- }
451
- , 3
452
- );
453
- return true;
454
- } else {
455
- return null;
456
- }
457
- };
458
- }
459
-
460
- var basicDot = function(ctx, x, y, size){
461
- var fillStyle = ctx.fillStyle;
462
- ctx.fillStyle = ctx.strokeStyle;
463
- ctx.fillRect(x + size / -2 , y + size / -2, size, size);
464
- ctx.fillStyle = fillStyle;
465
- }
466
- , basicLine = function(ctx, startx, starty, endx, endy){
467
- ctx.beginPath();
468
- ctx.moveTo(startx, starty);
469
- ctx.lineTo(endx, endy);
470
- ctx.closePath();
471
- ctx.stroke();
472
- }
473
- , basicCurve = function(ctx, startx, starty, endx, endy, cp1x, cp1y, cp2x, cp2y){
474
- ctx.beginPath();
475
- ctx.moveTo(startx, starty);
476
- ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, endx, endy);
477
- ctx.closePath();
478
- ctx.stroke();
479
- }
480
- , strokeStartCallback = function(stroke) {
481
- // this = jSignatureClass instance
482
- basicDot(this.canvasContext, stroke.x[0], stroke.y[0], this.settings.lineWidth);
483
- }
484
- , strokeAddCallback = function(stroke, positionInStroke){
485
- // this = jSignatureClass instance
486
-
487
- // Because we are funky this way, here we draw TWO curves.
488
- // 1. POSSIBLY "this line" - spanning from point right before us, to this latest point.
489
- // 2. POSSIBLY "prior curve" - spanning from "latest point" to the one before it.
490
-
491
- // Why you ask?
492
- // long lines (ones with many pixels between them) do not look good when they are part of a large curvy stroke.
493
- // You know, the jaggedy crocodile spine instead of a pretty, smooth curve. Yuck!
494
- // We want to approximate pretty curves in-place of those ugly lines.
495
- // To approximate a very nice curve we need to know the direction of line before and after.
496
- // Hence, on long lines we actually wait for another point beyond it to come back from
497
- // mousemoved before we draw this curve.
498
-
499
- // So for "prior curve" to be calc'ed we need 4 points
500
- // A, B, C, D (we are on D now, A is 3 points in the past.)
501
- // and 3 lines:
502
- // pre-line (from points A to B),
503
- // this line (from points B to C), (we call it "this" because if it was not yet, it's the only one we can draw for sure.)
504
- // post-line (from points C to D) (even through D point is 'current' we don't know how we can draw it yet)
505
- //
506
- // Well, actually, we don't need to *know* the point A, just the vector A->B
507
- var Cpoint = new Point(stroke.x[positionInStroke-1], stroke.y[positionInStroke-1])
508
- , Dpoint = new Point(stroke.x[positionInStroke], stroke.y[positionInStroke])
509
- , CDvector = Cpoint.getVectorToPoint(Dpoint);
510
-
511
- // Again, we have a chance here to draw TWO things:
512
- // BC Curve (only if it's long, because if it was short, it was drawn by previous callback) and
513
- // CD Line (only if it's short)
514
-
515
- // So, let's start with BC curve.
516
- // if there is only 2 points in stroke array, we don't have "history" long enough to have point B, let alone point A.
517
- // Falling through to drawing line CD is proper, as that's the only line we have points for.
518
- if(positionInStroke > 1) {
519
- // we are here when there are at least 3 points in stroke array.
520
- var Bpoint = new Point(stroke.x[positionInStroke-2], stroke.y[positionInStroke-2])
521
- , BCvector = Bpoint.getVectorToPoint(Cpoint)
522
- , ABvector;
523
- if(BCvector.getLength() > this.lineCurveThreshold){
524
- // Yey! Pretty curves, here we come!
525
- if(positionInStroke > 2) {
526
- // we are here when at least 4 points in stroke array.
527
- ABvector = (new Point(stroke.x[positionInStroke-3], stroke.y[positionInStroke-3])).getVectorToPoint(Bpoint);
528
- } else {
529
- ABvector = new Vector(0,0);
530
- }
531
-
532
- var minlenfraction = 0.05
533
- , maxlen = BCvector.getLength() * 0.35
534
- , ABCangle = BCvector.angleTo(ABvector.reverse())
535
- , BCDangle = CDvector.angleTo(BCvector.reverse())
536
- , BCP1vector = new Vector(ABvector.x + BCvector.x, ABvector.y + BCvector.y).resizeTo(
537
- Math.max(minlenfraction, ABCangle) * maxlen
538
- )
539
- , CCP2vector = (new Vector(BCvector.x + CDvector.x, BCvector.y + CDvector.y)).reverse().resizeTo(
540
- Math.max(minlenfraction, BCDangle) * maxlen
541
- );
542
-
543
- basicCurve(
544
- this.canvasContext
545
- , Bpoint.x
546
- , Bpoint.y
547
- , Cpoint.x
548
- , Cpoint.y
549
- , Bpoint.x + BCP1vector.x
550
- , Bpoint.y + BCP1vector.y
551
- , Cpoint.x + CCP2vector.x
552
- , Cpoint.y + CCP2vector.y
553
- );
554
- }
555
- }
556
- if(CDvector.getLength() <= this.lineCurveThreshold){
557
- basicLine(
558
- this.canvasContext
559
- , Cpoint.x
560
- , Cpoint.y
561
- , Dpoint.x
562
- , Dpoint.y
563
- );
564
- }
565
- }
566
- , strokeEndCallback = function(stroke){
567
- // this = jSignatureClass instance
568
-
569
- // Here we tidy up things left unfinished in last strokeAddCallback run.
570
-
571
- // What's POTENTIALLY left unfinished there is the curve between the last points
572
- // in the stroke, if the len of that line is more than lineCurveThreshold
573
- // If the last line was shorter than lineCurveThreshold, it was drawn there, and there
574
- // is nothing for us here to do.
575
- // We can also be called when there is only one point in the stroke (meaning, the
576
- // stroke was just a dot), in which case, again, there is nothing for us to do.
577
-
578
- // So for "this curve" to be calc'ed we need 3 points
579
- // A, B, C
580
- // and 2 lines:
581
- // pre-line (from points A to B),
582
- // this line (from points B to C)
583
- // Well, actually, we don't need to *know* the point A, just the vector A->B
584
- // so, we really need points B, C and AB vector.
585
- var positionInStroke = stroke.x.length - 1;
586
-
587
- if (positionInStroke > 0){
588
- // there are at least 2 points in the stroke.we are in business.
589
- var Cpoint = new Point(stroke.x[positionInStroke], stroke.y[positionInStroke])
590
- , Bpoint = new Point(stroke.x[positionInStroke-1], stroke.y[positionInStroke-1])
591
- , BCvector = Bpoint.getVectorToPoint(Cpoint)
592
- , ABvector;
593
- if (BCvector.getLength() > this.lineCurveThreshold){
594
- // yep. This one was left undrawn in prior callback. Have to draw it now.
595
- if (positionInStroke > 1){
596
- // we have at least 3 elems in stroke
597
- ABvector = (new Point(stroke.x[positionInStroke-2], stroke.y[positionInStroke-2])).getVectorToPoint(Bpoint);
598
- var BCP1vector = new Vector(ABvector.x + BCvector.x, ABvector.y + BCvector.y).resizeTo(BCvector.getLength() / 2);
599
- basicCurve(
600
- this.canvasContext
601
- , Bpoint.x
602
- , Bpoint.y
603
- , Cpoint.x
604
- , Cpoint.y
605
- , Bpoint.x + BCP1vector.x
606
- , Bpoint.y + BCP1vector.y
607
- , Cpoint.x
608
- , Cpoint.y
609
- );
610
- } else {
611
- // Since there is no AB leg, there is no curve to draw. This line is still "long" but no curve.
612
- basicLine(
613
- this.canvasContext
614
- , Bpoint.x
615
- , Bpoint.y
616
- , Cpoint.x
617
- , Cpoint.y
618
- );
619
- }
620
- }
621
- }
622
- }
623
-
624
-
625
- /*
626
- var getDataStats = function(){
627
- var strokecnt = strokes.length
628
- , stroke
629
- , pointid
630
- , pointcnt
631
- , x, y
632
- , maxX = Number.NEGATIVE_INFINITY
633
- , maxY = Number.NEGATIVE_INFINITY
634
- , minX = Number.POSITIVE_INFINITY
635
- , minY = Number.POSITIVE_INFINITY
636
- for(strokeid = 0; strokeid < strokecnt; strokeid++){
637
- stroke = strokes[strokeid]
638
- pointcnt = stroke.length
639
- for(pointid = 0; pointid < pointcnt; pointid++){
640
- x = stroke.x[pointid]
641
- y = stroke.y[pointid]
642
- if (x > maxX){
643
- maxX = x
644
- } else if (x < minX) {
645
- minX = x
646
- }
647
- if (y > maxY){
648
- maxY = y
649
- } else if (y < minY) {
650
- minY = y
651
- }
652
- }
653
- }
654
- return {'maxX': maxX, 'minX': minX, 'maxY': maxY, 'minY': minY}
655
- }
656
- */
657
-
658
- function conditionallyLinkCanvasResizeToWindowResize(jSignatureInstance, settingsWidth, apinamespace, globalEvents){
659
- 'use strict'
660
- if ( settingsWidth === 'ratio' || settingsWidth.split('')[settingsWidth.length - 1] === '%' ) {
661
-
662
- this.eventTokens[apinamespace + '.parentresized'] = globalEvents.subscribe(
663
- apinamespace + '.parentresized'
664
- , (function(eventTokens, $parent, originalParentWidth, sizeRatio){
665
- 'use strict'
666
-
667
- return function(){
668
- 'use strict'
669
-
670
- var w = $parent.width();
671
- if (w !== originalParentWidth) {
672
-
673
- // UNsubscribing this particular instance of signature pad only.
674
- // there is a separate `eventTokens` per each instance of signature pad
675
- for (var key in eventTokens){
676
- if (eventTokens.hasOwnProperty(key)) {
677
- globalEvents.unsubscribe(eventTokens[key]);
678
- delete eventTokens[key];
679
- }
680
- }
681
-
682
- var settings = jSignatureInstance.settings;
683
- jSignatureInstance.$parent.children().remove();
684
- for (var key in jSignatureInstance){
685
- if (jSignatureInstance.hasOwnProperty(key)) {
686
- delete jSignatureInstance[key];
687
- }
688
- }
689
-
690
- // scale data to new signature pad size
691
- settings.data = (function(data, scale){
692
- var newData = [];
693
- var o, i, l, j, m, stroke;
694
- for ( i = 0, l = data.length; i < l; i++) {
695
- stroke = data[i];
696
-
697
- o = {'x':[],'y':[]};
698
-
699
- for ( j = 0, m = stroke.x.length; j < m; j++) {
700
- o.x.push(stroke.x[j] * scale);
701
- o.y.push(stroke.y[j] * scale);
702
- }
703
-
704
- newData.push(o);
705
- }
706
- return newData;
707
- })(
708
- settings.data
709
- , w * 1.0 / originalParentWidth
710
- )
711
-
712
- $parent[apinamespace](settings);
713
- }
714
- }
715
- })(
716
- this.eventTokens
717
- , this.$parent
718
- , this.$parent.width()
719
- , this.canvas.width * 1.0 / this.canvas.height
720
- )
721
- )
722
- }
723
- };
724
-
725
-
726
- function jSignatureClass(parent, options, instanceExtensions) {
727
-
728
- var $parent = this.$parent = $(parent)
729
- , eventTokens = this.eventTokens = {}
730
- , events = this.events = new PubSubClass(this)
731
- , globalEvents = $.fn[apinamespace]('globalEvents')
732
- , settings = {
733
- 'width' : 'ratio'
734
- ,'height' : 'ratio'
735
- ,'sizeRatio': 4 // only used when height = 'ratio'
736
- ,'color' : '#000'
737
- ,'background-color': '#fff'
738
- ,'decor-color': '#eee'
739
- ,'lineWidth' : 0
740
- ,'minFatFingerCompensation' : -10
741
- ,'showUndoButton': false
742
- ,'readOnly': false
743
- ,'data': []
744
- ,'signatureLine': false
745
- };
746
-
747
- $.extend(settings, getColors($parent));
748
- if (options) {
749
- $.extend(settings, options);
750
- }
751
- this.settings = settings;
752
-
753
- for (var extensionName in instanceExtensions){
754
- if (instanceExtensions.hasOwnProperty(extensionName)) {
755
- instanceExtensions[extensionName].call(this, extensionName);
756
- }
757
- }
758
-
759
- this.events.publish(apinamespace+'.initializing');
760
-
761
- // these, when enabled, will hover above the sig area. Hence we append them to DOM before canvas.
762
- this.$controlbarUpper = (function(){
763
- var controlbarstyle = 'padding:0 !important; margin:0 !important;'+
764
- 'width: 100% !important; height: 0 !important; -ms-touch-action: none; touch-action: none;'+
765
- 'margin-top:-1em !important; margin-bottom:1em !important;';
766
- return $('<div style="'+controlbarstyle+'"></div>').appendTo($parent);
767
- })();
768
-
769
- this.isCanvasEmulator = false; // will be flipped by initializer when needed.
770
- var canvas = this.canvas = this.initializeCanvas(settings)
771
- , $canvas = $(canvas);
772
-
773
- this.$controlbarLower = (function(){
774
- var controlbarstyle = 'padding:0 !important; margin:0 !important;'+
775
- 'width: 100% !important; height: 0 !important; -ms-touch-action: none; touch-action: none;'+
776
- 'margin-top:-1.5em !important; margin-bottom:1.5em !important; position: relative;';
777
- return $('<div style="'+controlbarstyle+'"></div>').appendTo($parent);
778
- })();
779
-
780
- this.canvasContext = canvas.getContext("2d");
781
-
782
- // Most of our exposed API will be looking for this:
783
- $canvas.data(apinamespace + '.this', this);
784
-
785
- settings.lineWidth = (function(defaultLineWidth, canvasWidth){
786
- if (!defaultLineWidth){
787
- return Math.max(
788
- Math.round(canvasWidth / 400) /*+1 pixel for every extra 300px of width.*/
789
- , 2 /* minimum line width */
790
- );
791
- } else {
792
- return defaultLineWidth;
793
- }
794
- })(settings.lineWidth, canvas.width);
795
-
796
- this.lineCurveThreshold = settings.lineWidth * 3;
797
-
798
- // Add custom class if defined
799
- if(settings.cssclass && $.trim(settings.cssclass) != "") {
800
- $canvas.addClass(settings.cssclass);
801
- }
802
-
803
- // used for shifting the drawing point up on touch devices, so one can see the drawing above the finger.
804
- this.fatFingerCompensation = 0;
805
-
806
- var movementHandlers = (function(jSignatureInstance) {
807
-
808
- //================================
809
- // mouse down, move, up handlers:
810
-
811
- // shifts - adjustment values in viewport pixels drived from position of canvas on the page
812
- var shiftX
813
- , shiftY
814
- , setStartValues = function(){
815
- var tos = $(jSignatureInstance.canvas).offset()
816
- shiftX = tos.left * -1
817
- shiftY = tos.top * -1
818
- }
819
- , getPointFromEvent = function(e) {
820
- var firstEvent = (e.changedTouches && e.changedTouches.length > 0 ? e.changedTouches[0] : e);
821
- // All devices i tried report correct coordinates in pageX,Y
822
- // Android Chrome 2.3.x, 3.1, 3.2., Opera Mobile, safari iOS 4.x,
823
- // Windows: Chrome, FF, IE9, Safari
824
- // None of that scroll shift calc vs screenXY other sigs do is needed.
825
- // ... oh, yeah, the "fatFinger.." is for tablets so that people see what they draw.
826
- return new Point(
827
- Math.round(firstEvent.pageX + shiftX)
828
- , Math.round(firstEvent.pageY + shiftY) + jSignatureInstance.fatFingerCompensation
829
- );
830
- }
831
- , timer = new KickTimerClass(
832
- 750
833
- , function() { jSignatureInstance.dataEngine.endStroke(); }
834
- );
835
-
836
- this.drawEndHandler = function(e) {
837
- if (!jSignatureInstance.settings.readOnly) {
838
- try { e.preventDefault(); } catch (ex) {}
839
- timer.clear();
840
- jSignatureInstance.dataEngine.endStroke();
841
- }
842
- };
843
- this.drawStartHandler = function(e) {
844
- if (!jSignatureInstance.settings.readOnly) {
845
- e.preventDefault();
846
- // for performance we cache the offsets
847
- // we recalc these only at the beginning the stroke
848
- setStartValues();
849
- jSignatureInstance.dataEngine.startStroke( getPointFromEvent(e) );
850
- timer.kick();
851
- }
852
- };
853
- this.drawMoveHandler = function(e) {
854
- if (!jSignatureInstance.settings.readOnly) {
855
- e.preventDefault();
856
- if (!jSignatureInstance.dataEngine.inStroke){
857
- return;
858
- }
859
- jSignatureInstance.dataEngine.addToStroke( getPointFromEvent(e) );
860
- timer.kick();
861
- }
862
- };
863
-
864
- return this;
865
-
866
- }).call( {}, this )
867
-
868
- //
869
- //================================
870
-
871
- ;(function(drawEndHandler, drawStartHandler, drawMoveHandler) {
872
- var canvas = this.canvas
873
- , $canvas = $(canvas)
874
- , undef;
875
- if (this.isCanvasEmulator){
876
- $canvas.bind('mousemove.'+apinamespace, drawMoveHandler);
877
- $canvas.bind('mouseup.'+apinamespace, drawEndHandler);
878
- $canvas.bind('mousedown.'+apinamespace, drawStartHandler);
879
- } else {
880
- var hasEventListener = typeof canvas.addEventListener === 'function';
881
- this.ontouchstart = function(e) {
882
- canvas.onmousedown = canvas.onmouseup = canvas.onmousemove = undef;
883
-
884
- this.fatFingerCompensation = (
885
- settings.minFatFingerCompensation &&
886
- settings.lineWidth * -3 > settings.minFatFingerCompensation
887
- ) ? settings.lineWidth * -3 : settings.minFatFingerCompensation;
888
-
889
- drawStartHandler(e);
890
-
891
- if (hasEventListener) {
892
- canvas.addEventListener('touchend', drawEndHandler);
893
- canvas.addEventListener('touchstart', drawStartHandler);
894
- canvas.addEventListener('touchmove', drawMoveHandler);
895
- } else {
896
- canvas.ontouchend = drawEndHandler;
897
- canvas.ontouchstart = drawStartHandler;
898
- canvas.ontouchmove = drawMoveHandler;
899
- }
900
- };
901
-
902
- if (hasEventListener) {
903
- canvas.addEventListener('touchstart', this.ontouchstart);
904
- } else {
905
- canvas.ontouchstart = ontouchstart;
906
- }
907
-
908
- canvas.onmousedown = function(e) {
909
- if (hasEventListener) {
910
- canvas.removeEventListener('touchstart', this.ontouchstart);
911
- } else {
912
- canvas.ontouchstart = canvas.ontouchend = canvas.ontouchmove = undef;
913
- }
914
-
915
- drawStartHandler(e);
916
-
917
- canvas.onmousedown = drawStartHandler;
918
- canvas.onmouseup = drawEndHandler;
919
- canvas.onmousemove = drawMoveHandler;
920
- }
921
- if (window.navigator.msPointerEnabled) {
922
- canvas.onmspointerdown = drawStartHandler;
923
- canvas.onmspointerup = drawEndHandler;
924
- canvas.onmspointermove = drawMoveHandler;
925
- }
926
- }
927
- }).call(
928
- this
929
- , movementHandlers.drawEndHandler
930
- , movementHandlers.drawStartHandler
931
- , movementHandlers.drawMoveHandler
932
- )
933
-
934
- //=========================================
935
- // various event handlers
936
-
937
- // on mouseout + mouseup canvas did not know that mouseUP fired. Continued to draw despite mouse UP.
938
- // it is bettr than
939
- // $canvas.bind('mouseout', drawEndHandler)
940
- // because we don't want to break the stroke where user accidentally gets ouside and wants to get back in quickly.
941
- eventTokens[apinamespace + '.windowmouseup'] = globalEvents.subscribe(
942
- apinamespace + '.windowmouseup'
943
- , movementHandlers.drawEndHandler
944
- );
945
-
946
- this.events.publish(apinamespace+'.attachingEventHandlers');
947
-
948
- // If we have proportional width, we sign up to events broadcasting "window resized" and checking if
949
- // parent's width changed. If so, we (1) extract settings + data from current signature pad,
950
- // (2) remove signature pad from parent, and (3) reinit new signature pad at new size with same settings, (rescaled) data.
951
- conditionallyLinkCanvasResizeToWindowResize.call(
952
- this
953
- , this
954
- , settings.width.toString(10)
955
- , apinamespace, globalEvents
956
- );
957
-
958
- // end of event handlers.
959
- // ===============================
960
-
961
- this.resetCanvas(settings.data);
962
-
963
- // resetCanvas renders the data on the screen and fires ONE "change" event
964
- // if there is data. If you have controls that rely on "change" firing
965
- // attach them to something that runs before this.resetCanvas, like
966
- // apinamespace+'.attachingEventHandlers' that fires a bit higher.
967
- this.events.publish(apinamespace+'.initialized');
968
-
969
- return this;
970
- } // end of initBase
971
-
972
- //=========================================================================
973
- // jSignatureClass's methods and supporting fn's
974
-
975
- jSignatureClass.prototype.resetCanvas = function(data, dontClear){
976
- var canvas = this.canvas
977
- , settings = this.settings
978
- , ctx = this.canvasContext
979
- , isCanvasEmulator = this.isCanvasEmulator
980
- , cw = canvas.width
981
- , ch = canvas.height;
982
-
983
- // preparing colors, drawing area
984
- if (!dontClear){
985
- ctx.clearRect(0, 0, cw + 30, ch + 30);
986
- }
987
-
988
- ctx.shadowColor = ctx.fillStyle = settings['background-color']
989
- if (isCanvasEmulator){
990
- // FLashCanvas fills with Black by default, covering up the parent div's background
991
- // hence we refill
992
- ctx.fillRect(0,0,cw + 30, ch + 30);
993
- }
994
-
995
- ctx.lineWidth = Math.ceil(parseInt(settings.lineWidth, 10));
996
- ctx.lineCap = ctx.lineJoin = "round";
997
-
998
- // signature line
999
- if(settings.signatureLine) {
1000
- if (null != settings['decor-color']) {
1001
- ctx.strokeStyle = settings['decor-color'];
1002
- ctx.shadowOffsetX = 0;
1003
- ctx.shadowOffsetY = 0;
1004
- var lineoffset = Math.round( ch / 5 );
1005
- basicLine(ctx, lineoffset * 1.5, ch - lineoffset, cw - (lineoffset * 1.5), ch - lineoffset);
1006
- }
1007
-
1008
- if (!isCanvasEmulator){
1009
- ctx.shadowColor = ctx.strokeStyle;
1010
- ctx.shadowOffsetX = ctx.lineWidth * 0.5;
1011
- ctx.shadowOffsetY = ctx.lineWidth * -0.6;
1012
- ctx.shadowBlur = 0;
1013
- }
1014
- }
1015
-
1016
- ctx.strokeStyle = settings.color;
1017
-
1018
- // setting up new dataEngine
1019
-
1020
- if (!data) { data = []; }
1021
-
1022
- var dataEngine = this.dataEngine = new DataEngine(
1023
- data
1024
- , this
1025
- , strokeStartCallback
1026
- , strokeAddCallback
1027
- , strokeEndCallback
1028
- );
1029
-
1030
- settings.data = data; // onwindowresize handler uses it, i think.
1031
- $(canvas).data(apinamespace+'.data', data)
1032
- .data(apinamespace+'.settings', settings);
1033
-
1034
- // we fire "change" event on every change in data.
1035
- // setting this up:
1036
- dataEngine.changed = (function(target, events, apinamespace) {
1037
- 'use strict'
1038
- return function() {
1039
- events.publish(apinamespace+'.change');
1040
- target.trigger('change');
1041
- }
1042
- })(this.$parent, this.events, apinamespace);
1043
- // let's trigger change on all data reloads
1044
- dataEngine.changed();
1045
-
1046
- // import filters will be passing this back as indication of "we rendered"
1047
- return true;
1048
- };
1049
-
1050
- function initializeCanvasEmulator(canvas){
1051
- if (canvas.getContext){
1052
- return false;
1053
- } else {
1054
- // for cases when jSignature, FlashCanvas is inserted
1055
- // from one window into another (child iframe)
1056
- // 'window' and 'FlashCanvas' may be stuck behind
1057
- // in that other parent window.
1058
- // we need to find it
1059
- var window = canvas.ownerDocument.parentWindow;
1060
- var FC = window.FlashCanvas ?
1061
- canvas.ownerDocument.parentWindow.FlashCanvas :
1062
- (
1063
- typeof FlashCanvas === "undefined" ?
1064
- undefined :
1065
- FlashCanvas
1066
- );
1067
-
1068
- if (FC) {
1069
- canvas = FC.initElement(canvas);
1070
-
1071
- var zoom = 1;
1072
- // FlashCanvas uses flash which has this annoying habit of NOT scaling with page zoom.
1073
- // It matches pixel-to-pixel to screen instead.
1074
- // Since we are targeting ONLY IE 7, 8 with FlashCanvas, we will test the zoom only the IE8, IE7 way
1075
- if (window && window.screen && window.screen.deviceXDPI && window.screen.logicalXDPI){
1076
- zoom = window.screen.deviceXDPI * 1.0 / window.screen.logicalXDPI;
1077
- }
1078
- if (zoom !== 1){
1079
- try {
1080
- // We effectively abuse the brokenness of FlashCanvas and force the flash rendering surface to
1081
- // occupy larger pixel dimensions than the wrapping, scaled up DIV and Canvas elems.
1082
- $(canvas).children('object').get(0).resize(Math.ceil(canvas.width * zoom), Math.ceil(canvas.height * zoom));
1083
- // And by applying "scale" transformation we can talk "browser pixels" to FlashCanvas
1084
- // and have it translate the "browser pixels" to "screen pixels"
1085
- canvas.getContext('2d').scale(zoom, zoom);
1086
- // Note to self: don't reuse Canvas element. Repeated "scale" are cumulative.
1087
- } catch (ex) {}
1088
- }
1089
- return true;
1090
- } else {
1091
- throw new Error("Canvas element does not support 2d context. jSignature cannot proceed.");
1092
- }
1093
- }
1094
-
1095
- }
1096
-
1097
- jSignatureClass.prototype.initializeCanvas = function(settings) {
1098
- // ===========
1099
- // Init + Sizing code
1100
-
1101
- var canvas = document.createElement('canvas')
1102
- , $canvas = $(canvas);
1103
-
1104
- // We cannot work with circular dependency
1105
- if (settings.width === settings.height && settings.height === 'ratio') {
1106
- settings.width = '100%';
1107
- }
1108
-
1109
- $canvas.css(
1110
- {
1111
- 'margin': 0,
1112
- 'padding': 0,
1113
- 'border': 'none',
1114
- 'height': settings.height === 'ratio' || !settings.height ? 1 : settings.height.toString(10),
1115
- 'width': settings.width === 'ratio' || !settings.width ? 1 : settings.width.toString(10),
1116
- '-ms-touch-action': 'none',
1117
- 'touch-action': 'none',
1118
- 'background-color': settings['background-color']
1119
- }
1120
- );
1121
-
1122
- $canvas.appendTo(this.$parent);
1123
-
1124
- // we could not do this until canvas is rendered (appended to DOM)
1125
- if (settings.height === 'ratio') {
1126
- $canvas.css(
1127
- 'height'
1128
- , Math.round( $canvas.width() / settings.sizeRatio )
1129
- );
1130
- } else if (settings.width === 'ratio') {
1131
- $canvas.css(
1132
- 'width'
1133
- , Math.round( $canvas.height() * settings.sizeRatio )
1134
- );
1135
- }
1136
-
1137
- $canvas.addClass(apinamespace);
1138
-
1139
- // canvas's drawing area resolution is independent from canvas's size.
1140
- // pixels are just scaled up or down when internal resolution does not
1141
- // match external size. So...
1142
-
1143
- canvas.width = $canvas.width();
1144
- canvas.height = $canvas.height();
1145
-
1146
- // Special case Sizing code
1147
-
1148
- this.isCanvasEmulator = initializeCanvasEmulator(canvas);
1149
-
1150
- // End of Sizing Code
1151
- // ===========
1152
-
1153
- // normally select preventer would be short, but
1154
- // Canvas emulator on IE does NOT provide value for Event. Hence this convoluted line.
1155
- canvas.onselectstart = function(e){if(e && e.preventDefault){e.preventDefault()}; if(e && e.stopPropagation){e.stopPropagation()}; return false;};
1156
-
1157
- return canvas;
1158
- }
1159
-
1160
-
1161
- var GlobalJSignatureObjectInitializer = function(window){
1162
-
1163
- var globalEvents = new PubSubClass();
1164
-
1165
- // common "window resized" event listener.
1166
- // jSignature instances will subscribe to this chanel.
1167
- // to resize themselves when needed.
1168
- ;(function(globalEvents, apinamespace, $, window){
1169
- 'use strict'
1170
-
1171
- var resizetimer
1172
- , runner = function(){
1173
- globalEvents.publish(
1174
- apinamespace + '.parentresized'
1175
- )
1176
- };
1177
-
1178
- // jSignature knows how to resize its content when its parent is resized
1179
- // window resize is the only way we can catch resize events though...
1180
- $(window).bind('resize.'+apinamespace, function(){
1181
- if (resizetimer) {
1182
- clearTimeout(resizetimer);
1183
- }
1184
- resizetimer = setTimeout(
1185
- runner
1186
- , 500
1187
- );
1188
- })
1189
- // when mouse exists canvas element and "up"s outside, we cannot catch it with
1190
- // callbacks attached to canvas. This catches it outside.
1191
- .bind('mouseup.'+apinamespace, function(e){
1192
- globalEvents.publish(
1193
- apinamespace + '.windowmouseup'
1194
- )
1195
- });
1196
-
1197
- })(globalEvents, apinamespace, $, window)
1198
-
1199
- var jSignatureInstanceExtensions = {
1200
- /*
1201
- 'exampleExtension':function(extensionName){
1202
- // we are called very early in instance's life.
1203
- // right after the settings are resolved and
1204
- // jSignatureInstance.events is created
1205
- // and right before first ("jSignature.initializing") event is called.
1206
- // You don't really need to manupilate
1207
- // jSignatureInstance directly, just attach
1208
- // a bunch of events to jSignatureInstance.events
1209
- // (look at the source of jSignatureClass to see when these fire)
1210
- // and your special pieces of code will attach by themselves.
1211
-
1212
- // this function runs every time a new instance is set up.
1213
- // this means every var you create will live only for one instance
1214
- // unless you attach it to something outside, like "window."
1215
- // and pick it up later from there.
1216
-
1217
- // when globalEvents' events fire, 'this' is globalEvents object
1218
- // when jSignatureInstance's events fire, 'this' is jSignatureInstance
1219
-
1220
- // Here,
1221
- // this = is new jSignatureClass's instance.
1222
-
1223
- // The way you COULD approch setting this up is:
1224
- // if you have multistep set up, attach event to "jSignature.initializing"
1225
- // that attaches other events to be fired further lower the init stream.
1226
- // Or, if you know for sure you rely on only one jSignatureInstance's event,
1227
- // just attach to it directly
1228
-
1229
- this.events.subscribe(
1230
- // name of the event
1231
- apinamespace + '.initializing'
1232
- // event handlers, can pass args too, but in majority of cases,
1233
- // 'this' which is jSignatureClass object instance pointer is enough to get by.
1234
- , function(){
1235
- if (this.settings.hasOwnProperty('non-existent setting category?')) {
1236
- console.log(extensionName + ' is here')
1237
- }
1238
- }
1239
- )
1240
- }
1241
- */
1242
- };
1243
-
1244
- var exportplugins = {
1245
- 'default':function(data){return this.toDataURL()}
1246
- , 'native':function(data){return data}
1247
- , 'image':function(data){
1248
- /*this = canvas elem */
1249
- var imagestring = this.toDataURL();
1250
-
1251
- if (typeof imagestring === 'string' &&
1252
- imagestring.length > 4 &&
1253
- imagestring.slice(0,5) === 'data:' &&
1254
- imagestring.indexOf(',') !== -1){
1255
-
1256
- var splitterpos = imagestring.indexOf(',');
1257
-
1258
- return [
1259
- imagestring.slice(5, splitterpos)
1260
- , imagestring.substr(splitterpos + 1)
1261
- ];
1262
- }
1263
- return [];
1264
- }
1265
- };
1266
-
1267
- // will be part of "importplugins"
1268
- function _renderImageOnCanvas( data, formattype, rerendercallable ) {
1269
- 'use strict'
1270
- // #1. Do NOT rely on this. No worky on IE
1271
- // (url max len + lack of base64 decoder + possibly other issues)
1272
- // #2. This does NOT affect what is captured as "signature" as far as vector data is
1273
- // concerned. This is treated same as "signature line" - i.e. completely ignored
1274
- // the only time you see imported image data exported is if you export as image.
1275
-
1276
- // we do NOT call rerendercallable here (unlike in other import plugins)
1277
- // because importing image does absolutely nothing to the underlying vector data storage
1278
- // This could be a way to "import" old signatures stored as images
1279
- // This could also be a way to import extra decor into signature area.
1280
-
1281
- var img = new Image()
1282
- // this = Canvas DOM elem. Not jQuery object. Not Canvas's parent div.
1283
- , c = this;
1284
-
1285
- img.onload = function () {
1286
- var ctx = c.getContext("2d");
1287
- var oldShadowColor = ctx.shadowColor;
1288
- ctx.shadowColor = "transparent";
1289
- ctx.drawImage(
1290
- img, 0, 0
1291
- , ( img.width < c.width) ? img.width : c.width
1292
- , ( img.height < c.height) ? img.height : c.height
1293
- );
1294
- ctx.shadowColor = oldShadowColor;
1295
- };
1296
-
1297
- img.src = 'data:' + formattype + ',' + data;
1298
- }
1299
-
1300
- var importplugins = {
1301
- 'native':function(data, formattype, rerendercallable){
1302
- // we expect data as Array of objects of arrays here - whatever 'default' EXPORT plugin spits out.
1303
- // returning Truthy to indicate we are good, all updated.
1304
- rerendercallable( data );
1305
- }
1306
- , 'image': _renderImageOnCanvas
1307
- , 'image/png;base64': _renderImageOnCanvas
1308
- , 'image/jpeg;base64': _renderImageOnCanvas
1309
- , 'image/jpg;base64': _renderImageOnCanvas
1310
- };
1311
-
1312
- function _clearDrawingArea( data, dontClear ) {
1313
- this.find('canvas.'+apinamespace)
1314
- .add(this.filter('canvas.'+apinamespace))
1315
- .data(apinamespace+'.this').resetCanvas( data, dontClear );
1316
- return this;
1317
- }
1318
-
1319
- function _setDrawingData( data, formattype ) {
1320
- var undef;
1321
-
1322
- if (formattype === undef && typeof data === 'string' && data.substr(0,5) === 'data:') {
1323
- formattype = data.slice(5).split(',')[0];
1324
- // 5 chars of "data:" + mimetype len + 1 "," char = all skipped.
1325
- data = data.slice(6 + formattype.length);
1326
- if (formattype === data) {
1327
- return;
1328
- }
1329
- }
1330
-
1331
- var $canvas = this.find('canvas.'+apinamespace).add(this.filter('canvas.'+apinamespace));
1332
-
1333
- if (!importplugins.hasOwnProperty(formattype)) {
1334
- throw new Error(apinamespace + " is unable to find import plugin with for format '"+ String(formattype) +"'");
1335
- } else if ($canvas.length !== 0) {
1336
- importplugins[formattype].call(
1337
- $canvas[0]
1338
- , data
1339
- , formattype
1340
- , (function(jSignatureInstance){
1341
- return function(){ return jSignatureInstance.resetCanvas.apply(jSignatureInstance, arguments) }
1342
- })($canvas.data(apinamespace+'.this'))
1343
- );
1344
- }
1345
-
1346
- return this;
1347
- }
1348
-
1349
- var elementIsOrphan = function(e){
1350
- var topOfDOM = false;
1351
- e = e.parentNode;
1352
- while (e && !topOfDOM){
1353
- topOfDOM = e.body;
1354
- e = e.parentNode;
1355
- }
1356
- return !topOfDOM;
1357
- }
1358
-
1359
- //These are exposed as methods under $obj.jSignature('methodname', *args)
1360
- var plugins = {'export':exportplugins, 'import':importplugins, 'instance': jSignatureInstanceExtensions}
1361
- , methods = {
1362
- 'init' : function( options ) {
1363
- return this.each( function() {
1364
- if (!elementIsOrphan(this)) {
1365
- new jSignatureClass(this, options, jSignatureInstanceExtensions);
1366
- }
1367
- })
1368
- }
1369
- , 'destroy': function() {
1370
- return this.each(function() {
1371
- if(!elementIsOrphan(this)) {
1372
- var sig = $(this).find('canvas').data(apinamespace + '.this');
1373
- if(sig) {
1374
- sig.$controlbarLower.remove();
1375
- sig.$controlbarUpper.remove();
1376
- $(sig.canvas).remove();
1377
- for (var e in sig.eventTokens){
1378
- if (sig.eventTokens.hasOwnProperty(e)){
1379
- globalEvents.unsubscribe(sig.eventTokens[e]);
1380
- }
1381
- }
1382
- }
1383
- }
1384
- });
1385
- }
1386
- , 'getSettings' : function() {
1387
- return this.find('canvas.'+apinamespace)
1388
- .add(this.filter('canvas.'+apinamespace))
1389
- .data(apinamespace+'.this').settings;
1390
- }
1391
- , 'isModified' : function() {
1392
- return this.find('canvas.'+apinamespace)
1393
- .add(this.filter('canvas.'+apinamespace))
1394
- .data(apinamespace+'.this')
1395
- .dataEngine
1396
- ._stroke !== null;
1397
- }
1398
- , 'updateSetting' : function(param, val, forFuture) {
1399
- var $canvas = this.find('canvas.'+apinamespace)
1400
- .add(this.filter('canvas.'+apinamespace))
1401
- .data(apinamespace+'.this');
1402
- $canvas.settings[param] = val;
1403
- $canvas.resetCanvas(( forFuture ? null : $canvas.settings.data ), true);
1404
- return $canvas.settings[param];
1405
- }
1406
- // around since v1
1407
- , 'clear' : _clearDrawingArea
1408
- // was mistakenly introduced instead of 'clear' in v2
1409
- , 'reset' : _clearDrawingArea
1410
- , 'addPlugin' : function(pluginType, pluginName, callable){
1411
- if (plugins.hasOwnProperty(pluginType)){
1412
- plugins[pluginType][pluginName] = callable;
1413
- }
1414
- return this;
1415
- }
1416
- , 'listPlugins' : function(pluginType){
1417
- var answer = [];
1418
- if (plugins.hasOwnProperty(pluginType)){
1419
- var o = plugins[pluginType];
1420
- for (var k in o){
1421
- if (o.hasOwnProperty(k)){
1422
- answer.push(k);
1423
- }
1424
- }
1425
- }
1426
- return answer;
1427
- }
1428
- , 'getData' : function( formattype ) {
1429
- var undef, $canvas=this.find('canvas.'+apinamespace).add(this.filter('canvas.'+apinamespace));
1430
- if (formattype === undef) {
1431
- formattype = 'default';
1432
- }
1433
- if ($canvas.length !== 0 && exportplugins.hasOwnProperty(formattype)){
1434
- return exportplugins[formattype].call(
1435
- $canvas.get(0) // canvas dom elem
1436
- , $canvas.data(apinamespace+'.data') // raw signature data as array of objects of arrays
1437
- , $canvas.data(apinamespace+'.settings')
1438
- );
1439
- }
1440
- }
1441
- // around since v1. Took only one arg - data-url-formatted string with (likely png of) signature image
1442
- , 'importData' : _setDrawingData
1443
- // was mistakenly introduced instead of 'importData' in v2
1444
- , 'setData' : _setDrawingData
1445
- // this is one and same instance for all jSignature.
1446
- , 'globalEvents' : function(){return globalEvents}
1447
- , 'disable' : function() {
1448
- this.find("input").attr("disabled", 1);
1449
- this.find('canvas.'+apinamespace)
1450
- .addClass("disabled")
1451
- .data(apinamespace+'.this')
1452
- .settings
1453
- .readOnly=true;
1454
- }
1455
- , 'enable' : function() {
1456
- this.find("input").removeAttr("disabled");
1457
- this.find('canvas.'+apinamespace)
1458
- .removeClass("disabled")
1459
- .data(apinamespace+'.this')
1460
- .settings
1461
- .readOnly=false;
1462
- }
1463
- // there will be a separate one for each jSignature instance.
1464
- , 'events' : function() {
1465
- return this.find('canvas.'+apinamespace)
1466
- .add(this.filter('canvas.'+apinamespace))
1467
- .data(apinamespace+'.this').events;
1468
- }
1469
- } // end of methods declaration.
1470
-
1471
- $.fn[apinamespace] = function(method) {
1472
- 'use strict'
1473
- if ( !method || typeof method === 'object' ) {
1474
- return methods.init.apply( this, arguments );
1475
- } else if ( typeof method === 'string' && methods[method] ) {
1476
- return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
1477
- } else {
1478
- $.error( 'Method ' + String(method) + ' does not exist on jQuery.' + apinamespace );
1479
- }
1480
- }
1481
-
1482
- } // end of GlobalJSignatureObjectInitializer
1483
-
1484
- GlobalJSignatureObjectInitializer(window)
1485
-
1486
- })();
1
+ /** @preserve
2
+ jSignature v2 "${buildDate}" "${commitID}"
3
+ Copyright (c) 2012 Willow Systems Corp http://willow-systems.com
4
+ Copyright (c) 2010 Brinley Ang http://www.unbolt.net
5
+ MIT License <http://www.opensource.org/licenses/mit-license.php>
6
+
7
+ */
8
+ ;(function() {
9
+
10
+ var apinamespace = 'jSignature'
11
+
12
+ /**
13
+ Allows one to delay certain eventual action by setting up a timer for it and allowing one to delay it
14
+ by "kick"ing it. Sorta like "kick the can down the road"
15
+
16
+ @public
17
+ @class
18
+ @param
19
+ @returns {Type}
20
+ */
21
+ var KickTimerClass = function(time, callback) {
22
+ var timer;
23
+ this.kick = function() {
24
+ clearTimeout(timer);
25
+ timer = setTimeout(
26
+ callback
27
+ , time
28
+ );
29
+ }
30
+ this.clear = function() {
31
+ clearTimeout(timer);
32
+ }
33
+ return this;
34
+ }
35
+
36
+ var PubSubClass = function(context){
37
+ 'use strict'
38
+ /* @preserve
39
+ -----------------------------------------------------------------------------------------------
40
+ JavaScript PubSub library
41
+ 2012 (c) Willow Systems Corp (www.willow-systems.com)
42
+ based on Peter Higgins (dante@dojotoolkit.org)
43
+ Loosely based on Dojo publish/subscribe API, limited in scope. Rewritten blindly.
44
+ Original is (c) Dojo Foundation 2004-2010. Released under either AFL or new BSD, see:
45
+ http://dojofoundation.org/license for more information.
46
+ -----------------------------------------------------------------------------------------------
47
+ */
48
+ this.topics = {};
49
+ // here we choose what will be "this" for the called events.
50
+ // if context is defined, it's context. Else, 'this' is this instance of PubSub
51
+ this.context = context ? context : this;
52
+ /**
53
+ * Allows caller to emit an event and pass arguments to event listeners.
54
+ * @public
55
+ * @function
56
+ * @param topic {String} Name of the channel on which to voice this event
57
+ * @param **arguments Any number of arguments you want to pass to the listeners of this event.
58
+ */
59
+ this.publish = function(topic, arg1, arg2, etc) {
60
+ 'use strict'
61
+ if (this.topics[topic]) {
62
+ var currentTopic = this.topics[topic]
63
+ , args = Array.prototype.slice.call(arguments, 1)
64
+ , toremove = []
65
+ , torun = []
66
+ , fn
67
+ , i, l
68
+ , pair;
69
+
70
+ for (i = 0, l = currentTopic.length; i < l; i++) {
71
+ pair = currentTopic[i]; // this is a [function, once_flag] array
72
+ fn = pair[0];
73
+ if (pair[1] /* 'run once' flag set */){
74
+ pair[0] = function(){};
75
+ toremove.push(i);
76
+ }
77
+ /* don't call the callback right now, it might decide to add or
78
+ * remove subscribers which will wreak havoc on our index-based
79
+ * iteration */
80
+ torun.push(fn);
81
+ }
82
+ for (i = 0, l = toremove.length; i < l; i++) {
83
+ currentTopic.splice(toremove[i], 1);
84
+ }
85
+ for (i = 0, l = torun.length; i < l; i++) {
86
+ torun[i].apply(this.context, args);
87
+ }
88
+ }
89
+ }
90
+ /**
91
+ * Allows listener code to subscribe to channel and be called when data is available
92
+ * @public
93
+ * @function
94
+ * @param topic {String} Name of the channel on which to voice this event
95
+ * @param callback {Function} Executable (function pointer) that will be ran when event is voiced on this channel.
96
+ * @param once {Boolean} (optional. False by default) Flag indicating if the function is to be triggered only once.
97
+ * @returns {Object} A token object that cen be used for unsubscribing.
98
+ */
99
+ this.subscribe = function(topic, callback, once) {
100
+ 'use strict'
101
+ if (!this.topics[topic]) {
102
+ this.topics[topic] = [[callback, once]];
103
+ } else {
104
+ this.topics[topic].push([callback,once]);
105
+ }
106
+ return {
107
+ "topic": topic,
108
+ "callback": callback
109
+ };
110
+ };
111
+ /**
112
+ * Allows listener code to unsubscribe from a channel
113
+ * @public
114
+ * @function
115
+ * @param token {Object} A token object that was returned by `subscribe` method
116
+ */
117
+ this.unsubscribe = function(token) {
118
+ if (this.topics[token.topic]) {
119
+ var currentTopic = this.topics[token.topic];
120
+
121
+ for (var i = 0, l = currentTopic.length; i < l; i++) {
122
+ if (currentTopic[i] && currentTopic[i][0] === token.callback) {
123
+ currentTopic.splice(i, 1);
124
+ }
125
+ }
126
+ }
127
+ }
128
+ }
129
+
130
+ /// Returns front, back and "decor" colors derived from element (as jQuery obj)
131
+ function getColors($e){
132
+ var tmp
133
+ , undef
134
+ , frontcolor = $e.css('color')
135
+ , backcolor
136
+ , e = $e[0];
137
+
138
+ var toOfDOM = false;
139
+ while(e && !backcolor && !toOfDOM){
140
+ try{
141
+ tmp = $(e).css('background-color');
142
+ } catch (ex) {
143
+ tmp = 'transparent';
144
+ }
145
+ if (tmp !== 'transparent' && tmp !== 'rgba(0, 0, 0, 0)'){
146
+ backcolor = tmp;
147
+ }
148
+ toOfDOM = e.body;
149
+ e = e.parentNode;
150
+ }
151
+
152
+ var rgbaregex = /rgb[a]*\((\d+),\s*(\d+),\s*(\d+)/ // modern browsers
153
+ , hexregex = /#([AaBbCcDdEeFf\d]{2})([AaBbCcDdEeFf\d]{2})([AaBbCcDdEeFf\d]{2})/ // IE 8 and less.
154
+ , frontcolorcomponents;
155
+
156
+ // Decomposing Front color into R, G, B ints
157
+ tmp = undef;
158
+ tmp = frontcolor.match(rgbaregex);
159
+ if (tmp){
160
+ frontcolorcomponents = {'r':parseInt(tmp[1],10),'g':parseInt(tmp[2],10),'b':parseInt(tmp[3],10)};
161
+ } else {
162
+ tmp = frontcolor.match(hexregex);
163
+ if (tmp) {
164
+ frontcolorcomponents = {'r':parseInt(tmp[1],16),'g':parseInt(tmp[2],16),'b':parseInt(tmp[3],16)};
165
+ }
166
+ }
167
+ // if(!frontcolorcomponents){
168
+ // frontcolorcomponents = {'r':255,'g':255,'b':255}
169
+ // }
170
+
171
+ var backcolorcomponents
172
+ // Decomposing back color into R, G, B ints
173
+ if(!backcolor){
174
+ // HIghly unlikely since this means that no background styling was applied to any element from here to top of dom.
175
+ // we'll pick up back color from front color
176
+ if(frontcolorcomponents){
177
+ if (Math.max.apply(null, [frontcolorcomponents.r, frontcolorcomponents.g, frontcolorcomponents.b]) > 127){
178
+ backcolorcomponents = {'r':0,'g':0,'b':0};
179
+ } else {
180
+ backcolorcomponents = {'r':255,'g':255,'b':255};
181
+ }
182
+ } else {
183
+ // arg!!! front color is in format we don't understand (hsl, named colors)
184
+ // Let's just go with white background.
185
+ backcolorcomponents = {'r':255,'g':255,'b':255};
186
+ }
187
+ } else {
188
+ tmp = undef;
189
+ tmp = backcolor.match(rgbaregex);
190
+ if (tmp){
191
+ backcolorcomponents = {'r':parseInt(tmp[1],10),'g':parseInt(tmp[2],10),'b':parseInt(tmp[3],10)};
192
+ } else {
193
+ tmp = backcolor.match(hexregex);
194
+ if (tmp) {
195
+ backcolorcomponents = {'r':parseInt(tmp[1],16),'g':parseInt(tmp[2],16),'b':parseInt(tmp[3],16)};
196
+ }
197
+ }
198
+ // if(!backcolorcomponents){
199
+ // backcolorcomponents = {'r':0,'g':0,'b':0}
200
+ // }
201
+ }
202
+
203
+ // Deriving Decor color
204
+ // THis is LAZY!!!! Better way would be to use HSL and adjust luminocity. However, that could be an overkill.
205
+
206
+ var toRGBfn = function(o){return 'rgb(' + [o.r, o.g, o.b].join(', ') + ')'}
207
+ , decorcolorcomponents
208
+ , frontcolorbrightness
209
+ , adjusted;
210
+
211
+ if (frontcolorcomponents && backcolorcomponents){
212
+ var backcolorbrightness = Math.max.apply(null, [frontcolorcomponents.r, frontcolorcomponents.g, frontcolorcomponents.b]);
213
+
214
+ frontcolorbrightness = Math.max.apply(null, [backcolorcomponents.r, backcolorcomponents.g, backcolorcomponents.b]);
215
+ adjusted = Math.round(frontcolorbrightness + (-1 * (frontcolorbrightness - backcolorbrightness) * 0.75)); // "dimming" the difference between pen and back.
216
+ decorcolorcomponents = {'r':adjusted,'g':adjusted,'b':adjusted}; // always shade of gray
217
+ } else if (frontcolorcomponents) {
218
+ frontcolorbrightness = Math.max.apply(null, [frontcolorcomponents.r, frontcolorcomponents.g, frontcolorcomponents.b]);
219
+ var polarity = +1;
220
+ if (frontcolorbrightness > 127){
221
+ polarity = -1;
222
+ }
223
+ // shifting by 25% (64 points on RGB scale)
224
+ adjusted = Math.round(frontcolorbrightness + (polarity * 96)); // "dimming" the pen's color by 75% to get decor color.
225
+ decorcolorcomponents = {'r':adjusted,'g':adjusted,'b':adjusted}; // always shade of gray
226
+ } else {
227
+ decorcolorcomponents = {'r':191,'g':191,'b':191}; // always shade of gray
228
+ }
229
+
230
+ return {
231
+ 'color': frontcolor
232
+ , 'background-color': backcolorcomponents? toRGBfn(backcolorcomponents) : backcolor
233
+ , 'decor-color': toRGBfn(decorcolorcomponents)
234
+ };
235
+ }
236
+
237
+ function Vector(x,y){
238
+ this.x = x;
239
+ this.y = y;
240
+ this.reverse = function(){
241
+ return new this.constructor(
242
+ this.x * -1
243
+ , this.y * -1
244
+ );
245
+ };
246
+ this._length = null;
247
+ this.getLength = function(){
248
+ if (!this._length){
249
+ this._length = Math.sqrt( Math.pow(this.x, 2) + Math.pow(this.y, 2) );
250
+ }
251
+ return this._length;
252
+ };
253
+
254
+ var polarity = function (e){
255
+ return Math.round(e / Math.abs(e));
256
+ };
257
+ this.resizeTo = function(length){
258
+ // proportionally changes x,y such that the hypotenuse (vector length) is = new length
259
+ if (this.x === 0 && this.y === 0){
260
+ this._length = 0;
261
+ } else if (this.x === 0){
262
+ this._length = length;
263
+ this.y = length * polarity(this.y);
264
+ } else if(this.y === 0){
265
+ this._length = length;
266
+ this.x = length * polarity(this.x);
267
+ } else {
268
+ var proportion = Math.abs(this.y / this.x)
269
+ , x = Math.sqrt(Math.pow(length, 2) / (1 + Math.pow(proportion, 2)))
270
+ , y = proportion * x;
271
+ this._length = length;
272
+ this.x = x * polarity(this.x);
273
+ this.y = y * polarity(this.y);
274
+ }
275
+ return this;
276
+ };
277
+
278
+ /**
279
+ * Calculates the angle between 'this' vector and another.
280
+ * @public
281
+ * @function
282
+ * @returns {Number} The angle between the two vectors as measured in PI.
283
+ */
284
+ this.angleTo = function(vectorB) {
285
+ var divisor = this.getLength() * vectorB.getLength();
286
+ if (divisor === 0) {
287
+ return 0;
288
+ } else {
289
+ // JavaScript floating point math is screwed up.
290
+ // because of it, the core of the formula can, on occasion, have values
291
+ // over 1.0 and below -1.0.
292
+ return Math.acos(
293
+ Math.min(
294
+ Math.max(
295
+ ( this.x * vectorB.x + this.y * vectorB.y ) / divisor
296
+ , -1.0
297
+ )
298
+ , 1.0
299
+ )
300
+ ) / Math.PI;
301
+ }
302
+ };
303
+ }
304
+
305
+ function Point(x,y){
306
+ this.x = x;
307
+ this.y = y;
308
+
309
+ this.getVectorToCoordinates = function (x, y) {
310
+ return new Vector(x - this.x, y - this.y);
311
+ };
312
+ this.getVectorFromCoordinates = function (x, y) {
313
+ return this.getVectorToCoordinates(x, y).reverse();
314
+ };
315
+ this.getVectorToPoint = function (point) {
316
+ return new Vector(point.x - this.x, point.y - this.y);
317
+ };
318
+ this.getVectorFromPoint = function (point) {
319
+ return this.getVectorToPoint(point).reverse();
320
+ };
321
+ }
322
+
323
+ /*
324
+ * About data structure:
325
+ * We don't store / deal with "pictures" this signature capture code captures "vectors"
326
+ *
327
+ * We don't store bitmaps. We store "strokes" as arrays of arrays. (Actually, arrays of objects containing arrays of coordinates.
328
+ *
329
+ * Stroke = mousedown + mousemoved * n (+ mouseup but we don't record that as that was the "end / lack of movement" indicator)
330
+ *
331
+ * Vectors = not classical vectors where numbers indicated shift relative last position. Our vectors are actually coordinates against top left of canvas.
332
+ * we could calc the classical vectors, but keeping the the actual coordinates allows us (through Math.max / min)
333
+ * to calc the size of resulting drawing very quickly. If we want classical vectors later, we can always get them in backend code.
334
+ *
335
+ * So, the data structure:
336
+ *
337
+ * var data = [
338
+ * { // stroke starts
339
+ * x : [101, 98, 57, 43] // x points
340
+ * , y : [1, 23, 65, 87] // y points
341
+ * } // stroke ends
342
+ * , { // stroke starts
343
+ * x : [55, 56, 57, 58] // x points
344
+ * , y : [101, 97, 54, 4] // y points
345
+ * } // stroke ends
346
+ * , { // stroke consisting of just a dot
347
+ * x : [53] // x points
348
+ * , y : [151] // y points
349
+ * } // stroke ends
350
+ * ]
351
+ *
352
+ * we don't care or store stroke width (it's canvas-size-relative), color, shadow values. These can be added / changed on whim post-capture.
353
+ *
354
+ */
355
+ function DataEngine(storageObject, context, startStrokeFn, addToStrokeFn, endStrokeFn){
356
+ this.data = storageObject; // we expect this to be an instance of Array
357
+ this.context = context;
358
+
359
+ if (storageObject.length){
360
+ // we have data to render
361
+ var numofstrokes = storageObject.length
362
+ , stroke
363
+ , numofpoints;
364
+
365
+ for (var i = 0; i < numofstrokes; i++){
366
+ stroke = storageObject[i];
367
+ numofpoints = stroke.x.length;
368
+ startStrokeFn.call(context, stroke);
369
+ for(var j = 1; j < numofpoints; j++){
370
+ addToStrokeFn.call(context, stroke, j);
371
+ }
372
+ endStrokeFn.call(context, stroke);
373
+ }
374
+ }
375
+
376
+ this.changed = function(){};
377
+
378
+ this.startStrokeFn = startStrokeFn;
379
+ this.addToStrokeFn = addToStrokeFn;
380
+ this.endStrokeFn = endStrokeFn;
381
+
382
+ this.inStroke = false;
383
+
384
+ this._lastPoint = null;
385
+ this._stroke = null;
386
+ this.startStroke = function(point){
387
+ if(point && typeof(point.x) == "number" && typeof(point.y) == "number"){
388
+ this._stroke = {'x':[point.x], 'y':[point.y]};
389
+ this.data.push(this._stroke);
390
+ this._lastPoint = point;
391
+ this.inStroke = true;
392
+ // 'this' does not work same inside setTimeout(
393
+ var stroke = this._stroke
394
+ , fn = this.startStrokeFn
395
+ , context = this.context;
396
+ setTimeout(
397
+ // some IE's don't support passing args per setTimeout API. Have to create closure every time instead.
398
+ function() {fn.call(context, stroke)}
399
+ , 3
400
+ );
401
+ return point;
402
+ } else {
403
+ return null;
404
+ }
405
+ };
406
+ // that "5" at the very end of this if is important to explain.
407
+ // we do NOT render links between two captured points (in the middle of the stroke) if the distance is shorter than that number.
408
+ // not only do we NOT render it, we also do NOT capture (add) these intermediate points to storage.
409
+ // when clustering of these is too tight, it produces noise on the line, which, because of smoothing, makes lines too curvy.
410
+ // maybe, later, we can expose this as a configurable setting of some sort.
411
+ this.addToStroke = function(point){
412
+ if (this.inStroke &&
413
+ typeof(point.x) === "number" &&
414
+ typeof(point.y) === "number" &&
415
+ // calculates absolute shift in diagonal pixels away from original point
416
+ (Math.abs(point.x - this._lastPoint.x) + Math.abs(point.y - this._lastPoint.y)) > 4
417
+ ){
418
+ var positionInStroke = this._stroke.x.length;
419
+ this._stroke.x.push(point.x);
420
+ this._stroke.y.push(point.y);
421
+ this._lastPoint = point;
422
+
423
+ var stroke = this._stroke
424
+ , fn = this.addToStrokeFn
425
+ , context = this.context;
426
+ setTimeout(
427
+ // some IE's don't support passing args per setTimeout API. Have to create closure every time instead.
428
+ function() {fn.call(context, stroke, positionInStroke)}
429
+ , 3
430
+ );
431
+ return point;
432
+ } else {
433
+ return null;
434
+ }
435
+ };
436
+ this.endStroke = function(){
437
+ var c = this.inStroke;
438
+ this.inStroke = false;
439
+ this._lastPoint = null;
440
+ if (c){
441
+ var stroke = this._stroke
442
+ , fn = this.endStrokeFn // 'this' does not work same inside setTimeout(
443
+ , context = this.context
444
+ , changedfn = this.changed;
445
+ setTimeout(
446
+ // some IE's don't support passing args per setTimeout API. Have to create closure every time instead.
447
+ function(){
448
+ fn.call(context, stroke);
449
+ changedfn.call(context);
450
+ }
451
+ , 3
452
+ );
453
+ return true;
454
+ } else {
455
+ return null;
456
+ }
457
+ };
458
+ }
459
+
460
+ var basicDot = function(ctx, x, y, size){
461
+ var fillStyle = ctx.fillStyle;
462
+ ctx.fillStyle = ctx.strokeStyle;
463
+ ctx.fillRect(x + size / -2 , y + size / -2, size, size);
464
+ ctx.fillStyle = fillStyle;
465
+ }
466
+ , basicLine = function(ctx, startx, starty, endx, endy){
467
+ ctx.beginPath();
468
+ ctx.moveTo(startx, starty);
469
+ ctx.lineTo(endx, endy);
470
+ ctx.closePath();
471
+ ctx.stroke();
472
+ }
473
+ , basicCurve = function(ctx, startx, starty, endx, endy, cp1x, cp1y, cp2x, cp2y){
474
+ ctx.beginPath();
475
+ ctx.moveTo(startx, starty);
476
+ ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, endx, endy);
477
+ ctx.closePath();
478
+ ctx.stroke();
479
+ }
480
+ , strokeStartCallback = function(stroke) {
481
+ // this = jSignatureClass instance
482
+ basicDot(this.canvasContext, stroke.x[0], stroke.y[0], this.settings.lineWidth);
483
+ }
484
+ , strokeAddCallback = function(stroke, positionInStroke){
485
+ // this = jSignatureClass instance
486
+
487
+ // Because we are funky this way, here we draw TWO curves.
488
+ // 1. POSSIBLY "this line" - spanning from point right before us, to this latest point.
489
+ // 2. POSSIBLY "prior curve" - spanning from "latest point" to the one before it.
490
+
491
+ // Why you ask?
492
+ // long lines (ones with many pixels between them) do not look good when they are part of a large curvy stroke.
493
+ // You know, the jaggedy crocodile spine instead of a pretty, smooth curve. Yuck!
494
+ // We want to approximate pretty curves in-place of those ugly lines.
495
+ // To approximate a very nice curve we need to know the direction of line before and after.
496
+ // Hence, on long lines we actually wait for another point beyond it to come back from
497
+ // mousemoved before we draw this curve.
498
+
499
+ // So for "prior curve" to be calc'ed we need 4 points
500
+ // A, B, C, D (we are on D now, A is 3 points in the past.)
501
+ // and 3 lines:
502
+ // pre-line (from points A to B),
503
+ // this line (from points B to C), (we call it "this" because if it was not yet, it's the only one we can draw for sure.)
504
+ // post-line (from points C to D) (even through D point is 'current' we don't know how we can draw it yet)
505
+ //
506
+ // Well, actually, we don't need to *know* the point A, just the vector A->B
507
+ var Cpoint = new Point(stroke.x[positionInStroke-1], stroke.y[positionInStroke-1])
508
+ , Dpoint = new Point(stroke.x[positionInStroke], stroke.y[positionInStroke])
509
+ , CDvector = Cpoint.getVectorToPoint(Dpoint);
510
+
511
+ // Again, we have a chance here to draw TWO things:
512
+ // BC Curve (only if it's long, because if it was short, it was drawn by previous callback) and
513
+ // CD Line (only if it's short)
514
+
515
+ // So, let's start with BC curve.
516
+ // if there is only 2 points in stroke array, we don't have "history" long enough to have point B, let alone point A.
517
+ // Falling through to drawing line CD is proper, as that's the only line we have points for.
518
+ if(positionInStroke > 1) {
519
+ // we are here when there are at least 3 points in stroke array.
520
+ var Bpoint = new Point(stroke.x[positionInStroke-2], stroke.y[positionInStroke-2])
521
+ , BCvector = Bpoint.getVectorToPoint(Cpoint)
522
+ , ABvector;
523
+ if(BCvector.getLength() > this.lineCurveThreshold){
524
+ // Yey! Pretty curves, here we come!
525
+ if(positionInStroke > 2) {
526
+ // we are here when at least 4 points in stroke array.
527
+ ABvector = (new Point(stroke.x[positionInStroke-3], stroke.y[positionInStroke-3])).getVectorToPoint(Bpoint);
528
+ } else {
529
+ ABvector = new Vector(0,0);
530
+ }
531
+
532
+ var minlenfraction = 0.05
533
+ , maxlen = BCvector.getLength() * 0.35
534
+ , ABCangle = BCvector.angleTo(ABvector.reverse())
535
+ , BCDangle = CDvector.angleTo(BCvector.reverse())
536
+ , BCP1vector = new Vector(ABvector.x + BCvector.x, ABvector.y + BCvector.y).resizeTo(
537
+ Math.max(minlenfraction, ABCangle) * maxlen
538
+ )
539
+ , CCP2vector = (new Vector(BCvector.x + CDvector.x, BCvector.y + CDvector.y)).reverse().resizeTo(
540
+ Math.max(minlenfraction, BCDangle) * maxlen
541
+ );
542
+
543
+ basicCurve(
544
+ this.canvasContext
545
+ , Bpoint.x
546
+ , Bpoint.y
547
+ , Cpoint.x
548
+ , Cpoint.y
549
+ , Bpoint.x + BCP1vector.x
550
+ , Bpoint.y + BCP1vector.y
551
+ , Cpoint.x + CCP2vector.x
552
+ , Cpoint.y + CCP2vector.y
553
+ );
554
+ }
555
+ }
556
+ if(CDvector.getLength() <= this.lineCurveThreshold){
557
+ basicLine(
558
+ this.canvasContext
559
+ , Cpoint.x
560
+ , Cpoint.y
561
+ , Dpoint.x
562
+ , Dpoint.y
563
+ );
564
+ }
565
+ }
566
+ , strokeEndCallback = function(stroke){
567
+ // this = jSignatureClass instance
568
+
569
+ // Here we tidy up things left unfinished in last strokeAddCallback run.
570
+
571
+ // What's POTENTIALLY left unfinished there is the curve between the last points
572
+ // in the stroke, if the len of that line is more than lineCurveThreshold
573
+ // If the last line was shorter than lineCurveThreshold, it was drawn there, and there
574
+ // is nothing for us here to do.
575
+ // We can also be called when there is only one point in the stroke (meaning, the
576
+ // stroke was just a dot), in which case, again, there is nothing for us to do.
577
+
578
+ // So for "this curve" to be calc'ed we need 3 points
579
+ // A, B, C
580
+ // and 2 lines:
581
+ // pre-line (from points A to B),
582
+ // this line (from points B to C)
583
+ // Well, actually, we don't need to *know* the point A, just the vector A->B
584
+ // so, we really need points B, C and AB vector.
585
+ var positionInStroke = stroke.x.length - 1;
586
+
587
+ if (positionInStroke > 0){
588
+ // there are at least 2 points in the stroke.we are in business.
589
+ var Cpoint = new Point(stroke.x[positionInStroke], stroke.y[positionInStroke])
590
+ , Bpoint = new Point(stroke.x[positionInStroke-1], stroke.y[positionInStroke-1])
591
+ , BCvector = Bpoint.getVectorToPoint(Cpoint)
592
+ , ABvector;
593
+ if (BCvector.getLength() > this.lineCurveThreshold){
594
+ // yep. This one was left undrawn in prior callback. Have to draw it now.
595
+ if (positionInStroke > 1){
596
+ // we have at least 3 elems in stroke
597
+ ABvector = (new Point(stroke.x[positionInStroke-2], stroke.y[positionInStroke-2])).getVectorToPoint(Bpoint);
598
+ var BCP1vector = new Vector(ABvector.x + BCvector.x, ABvector.y + BCvector.y).resizeTo(BCvector.getLength() / 2);
599
+ basicCurve(
600
+ this.canvasContext
601
+ , Bpoint.x
602
+ , Bpoint.y
603
+ , Cpoint.x
604
+ , Cpoint.y
605
+ , Bpoint.x + BCP1vector.x
606
+ , Bpoint.y + BCP1vector.y
607
+ , Cpoint.x
608
+ , Cpoint.y
609
+ );
610
+ } else {
611
+ // Since there is no AB leg, there is no curve to draw. This line is still "long" but no curve.
612
+ basicLine(
613
+ this.canvasContext
614
+ , Bpoint.x
615
+ , Bpoint.y
616
+ , Cpoint.x
617
+ , Cpoint.y
618
+ );
619
+ }
620
+ }
621
+ }
622
+ }
623
+
624
+
625
+ /*
626
+ var getDataStats = function(){
627
+ var strokecnt = strokes.length
628
+ , stroke
629
+ , pointid
630
+ , pointcnt
631
+ , x, y
632
+ , maxX = Number.NEGATIVE_INFINITY
633
+ , maxY = Number.NEGATIVE_INFINITY
634
+ , minX = Number.POSITIVE_INFINITY
635
+ , minY = Number.POSITIVE_INFINITY
636
+ for(strokeid = 0; strokeid < strokecnt; strokeid++){
637
+ stroke = strokes[strokeid]
638
+ pointcnt = stroke.length
639
+ for(pointid = 0; pointid < pointcnt; pointid++){
640
+ x = stroke.x[pointid]
641
+ y = stroke.y[pointid]
642
+ if (x > maxX){
643
+ maxX = x
644
+ } else if (x < minX) {
645
+ minX = x
646
+ }
647
+ if (y > maxY){
648
+ maxY = y
649
+ } else if (y < minY) {
650
+ minY = y
651
+ }
652
+ }
653
+ }
654
+ return {'maxX': maxX, 'minX': minX, 'maxY': maxY, 'minY': minY}
655
+ }
656
+ */
657
+
658
+ function conditionallyLinkCanvasResizeToWindowResize(jSignatureInstance, settingsWidth, apinamespace, globalEvents){
659
+ 'use strict'
660
+ if ( settingsWidth === 'ratio' || settingsWidth.split('')[settingsWidth.length - 1] === '%' ) {
661
+
662
+ this.eventTokens[apinamespace + '.parentresized'] = globalEvents.subscribe(
663
+ apinamespace + '.parentresized'
664
+ , (function(eventTokens, $parent, originalParentWidth, sizeRatio){
665
+ 'use strict'
666
+
667
+ return function(){
668
+ 'use strict'
669
+
670
+ var w = $parent.width();
671
+ if (w !== originalParentWidth) {
672
+
673
+ // UNsubscribing this particular instance of signature pad only.
674
+ // there is a separate `eventTokens` per each instance of signature pad
675
+ for (var key in eventTokens){
676
+ if (eventTokens.hasOwnProperty(key)) {
677
+ globalEvents.unsubscribe(eventTokens[key]);
678
+ delete eventTokens[key];
679
+ }
680
+ }
681
+
682
+ var settings = jSignatureInstance.settings;
683
+ jSignatureInstance.$parent.children().remove();
684
+ for (var key in jSignatureInstance){
685
+ if (jSignatureInstance.hasOwnProperty(key)) {
686
+ delete jSignatureInstance[key];
687
+ }
688
+ }
689
+
690
+ // scale data to new signature pad size
691
+ settings.data = (function(data, scale){
692
+ var newData = [];
693
+ var o, i, l, j, m, stroke;
694
+ for ( i = 0, l = data.length; i < l; i++) {
695
+ stroke = data[i];
696
+
697
+ o = {'x':[],'y':[]};
698
+
699
+ for ( j = 0, m = stroke.x.length; j < m; j++) {
700
+ o.x.push(stroke.x[j] * scale);
701
+ o.y.push(stroke.y[j] * scale);
702
+ }
703
+
704
+ newData.push(o);
705
+ }
706
+ return newData;
707
+ })(
708
+ settings.data
709
+ , w * 1.0 / originalParentWidth
710
+ )
711
+
712
+ $parent[apinamespace](settings);
713
+ }
714
+ }
715
+ })(
716
+ this.eventTokens
717
+ , this.$parent
718
+ , this.$parent.width()
719
+ , this.canvas.width * 1.0 / this.canvas.height
720
+ )
721
+ )
722
+ }
723
+ };
724
+
725
+
726
+ function jSignatureClass(parent, options, instanceExtensions) {
727
+
728
+ var $parent = this.$parent = $(parent)
729
+ , eventTokens = this.eventTokens = {}
730
+ , events = this.events = new PubSubClass(this)
731
+ , globalEvents = $.fn[apinamespace]('globalEvents')
732
+ , settings = {
733
+ 'width' : 'ratio'
734
+ ,'height' : 'ratio'
735
+ ,'sizeRatio': 4 // only used when height = 'ratio'
736
+ ,'color' : '#000'
737
+ ,'background-color': '#fff'
738
+ ,'decor-color': '#eee'
739
+ ,'lineWidth' : 0
740
+ ,'minFatFingerCompensation' : -10
741
+ ,'showUndoButton': false
742
+ ,'readOnly': false
743
+ ,'data': []
744
+ ,'signatureLine': false
745
+ };
746
+
747
+ $.extend(settings, getColors($parent));
748
+ if (options) {
749
+ $.extend(settings, options);
750
+ }
751
+ this.settings = settings;
752
+
753
+ for (var extensionName in instanceExtensions){
754
+ if (instanceExtensions.hasOwnProperty(extensionName)) {
755
+ instanceExtensions[extensionName].call(this, extensionName);
756
+ }
757
+ }
758
+
759
+ this.events.publish(apinamespace+'.initializing');
760
+
761
+ // these, when enabled, will hover above the sig area. Hence we append them to DOM before canvas.
762
+ this.$controlbarUpper = (function(){
763
+ var controlbarstyle = 'padding:0 !important; margin:0 !important;'+
764
+ 'width: 100% !important; height: 0 !important; -ms-touch-action: none; touch-action: none;'+
765
+ 'margin-top:-1em !important; margin-bottom:1em !important;';
766
+ return $('<div style="'+controlbarstyle+'"></div>').appendTo($parent);
767
+ })();
768
+
769
+ this.isCanvasEmulator = false; // will be flipped by initializer when needed.
770
+ var canvas = this.canvas = this.initializeCanvas(settings)
771
+ , $canvas = $(canvas);
772
+
773
+ this.$controlbarLower = (function(){
774
+ var controlbarstyle = 'padding:0 !important; margin:0 !important;'+
775
+ 'width: 100% !important; height: 0 !important; -ms-touch-action: none; touch-action: none;'+
776
+ 'margin-top:-1.5em !important; margin-bottom:1.5em !important; position: relative;';
777
+ return $('<div style="'+controlbarstyle+'"></div>').appendTo($parent);
778
+ })();
779
+
780
+ this.canvasContext = canvas.getContext("2d");
781
+
782
+ // Most of our exposed API will be looking for this:
783
+ $canvas.data(apinamespace + '.this', this);
784
+
785
+ settings.lineWidth = (function(defaultLineWidth, canvasWidth){
786
+ if (!defaultLineWidth){
787
+ return Math.max(
788
+ Math.round(canvasWidth / 400) /*+1 pixel for every extra 300px of width.*/
789
+ , 2 /* minimum line width */
790
+ );
791
+ } else {
792
+ return defaultLineWidth;
793
+ }
794
+ })(settings.lineWidth, canvas.width);
795
+
796
+ this.lineCurveThreshold = settings.lineWidth * 3;
797
+
798
+ // Add custom class if defined
799
+ if(settings.cssclass && $.trim(settings.cssclass) != "") {
800
+ $canvas.addClass(settings.cssclass);
801
+ }
802
+
803
+ // used for shifting the drawing point up on touch devices, so one can see the drawing above the finger.
804
+ this.fatFingerCompensation = 0;
805
+
806
+ var movementHandlers = (function(jSignatureInstance) {
807
+
808
+ //================================
809
+ // mouse down, move, up handlers:
810
+
811
+ // shifts - adjustment values in viewport pixels drived from position of canvas on the page
812
+ var shiftX
813
+ , shiftY
814
+ , setStartValues = function(){
815
+ var tos = $(jSignatureInstance.canvas).offset()
816
+ shiftX = tos.left * -1
817
+ shiftY = tos.top * -1
818
+ }
819
+ , getPointFromEvent = function(e) {
820
+ var firstEvent = (e.changedTouches && e.changedTouches.length > 0 ? e.changedTouches[0] : e);
821
+ // All devices i tried report correct coordinates in pageX,Y
822
+ // Android Chrome 2.3.x, 3.1, 3.2., Opera Mobile, safari iOS 4.x,
823
+ // Windows: Chrome, FF, IE9, Safari
824
+ // None of that scroll shift calc vs screenXY other sigs do is needed.
825
+ // ... oh, yeah, the "fatFinger.." is for tablets so that people see what they draw.
826
+ return new Point(
827
+ Math.round(firstEvent.pageX + shiftX)
828
+ , Math.round(firstEvent.pageY + shiftY) + jSignatureInstance.fatFingerCompensation
829
+ );
830
+ }
831
+ , timer = new KickTimerClass(
832
+ 750
833
+ , function() { jSignatureInstance.dataEngine.endStroke(); }
834
+ );
835
+
836
+ this.drawEndHandler = function(e) {
837
+ if (!jSignatureInstance.settings.readOnly) {
838
+ try { e.preventDefault(); } catch (ex) {}
839
+ timer.clear();
840
+ jSignatureInstance.dataEngine.endStroke();
841
+ }
842
+ };
843
+ this.drawStartHandler = function(e) {
844
+ if (!jSignatureInstance.settings.readOnly) {
845
+ e.preventDefault();
846
+ // for performance we cache the offsets
847
+ // we recalc these only at the beginning the stroke
848
+ setStartValues();
849
+ jSignatureInstance.dataEngine.startStroke( getPointFromEvent(e) );
850
+ timer.kick();
851
+ }
852
+ };
853
+ this.drawMoveHandler = function(e) {
854
+ if (!jSignatureInstance.settings.readOnly) {
855
+ e.preventDefault();
856
+ if (!jSignatureInstance.dataEngine.inStroke){
857
+ return;
858
+ }
859
+ jSignatureInstance.dataEngine.addToStroke( getPointFromEvent(e) );
860
+ timer.kick();
861
+ }
862
+ };
863
+
864
+ return this;
865
+
866
+ }).call( {}, this )
867
+
868
+ //
869
+ //================================
870
+
871
+ ;(function(drawEndHandler, drawStartHandler, drawMoveHandler) {
872
+ var canvas = this.canvas
873
+ , $canvas = $(canvas)
874
+ , undef;
875
+ if (this.isCanvasEmulator){
876
+ $canvas.bind('mousemove.'+apinamespace, drawMoveHandler);
877
+ $canvas.bind('mouseup.'+apinamespace, drawEndHandler);
878
+ $canvas.bind('mousedown.'+apinamespace, drawStartHandler);
879
+ } else {
880
+ var hasEventListener = typeof canvas.addEventListener === 'function';
881
+ this.ontouchstart = function(e) {
882
+ canvas.onmousedown = canvas.onmouseup = canvas.onmousemove = undef;
883
+
884
+ this.fatFingerCompensation = (
885
+ settings.minFatFingerCompensation &&
886
+ settings.lineWidth * -3 > settings.minFatFingerCompensation
887
+ ) ? settings.lineWidth * -3 : settings.minFatFingerCompensation;
888
+
889
+ drawStartHandler(e);
890
+
891
+ if (hasEventListener) {
892
+ canvas.addEventListener('touchend', drawEndHandler);
893
+ canvas.addEventListener('touchstart', drawStartHandler);
894
+ canvas.addEventListener('touchmove', drawMoveHandler);
895
+ } else {
896
+ canvas.ontouchend = drawEndHandler;
897
+ canvas.ontouchstart = drawStartHandler;
898
+ canvas.ontouchmove = drawMoveHandler;
899
+ }
900
+ };
901
+
902
+ if (hasEventListener) {
903
+ canvas.addEventListener('touchstart', this.ontouchstart);
904
+ } else {
905
+ canvas.ontouchstart = ontouchstart;
906
+ }
907
+
908
+ canvas.onmousedown = function(e) {
909
+ if (hasEventListener) {
910
+ canvas.removeEventListener('touchstart', this.ontouchstart);
911
+ } else {
912
+ canvas.ontouchstart = canvas.ontouchend = canvas.ontouchmove = undef;
913
+ }
914
+
915
+ drawStartHandler(e);
916
+
917
+ canvas.onmousedown = drawStartHandler;
918
+ canvas.onmouseup = drawEndHandler;
919
+ canvas.onmousemove = drawMoveHandler;
920
+ }
921
+ if (window.navigator.msPointerEnabled) {
922
+ canvas.onmspointerdown = drawStartHandler;
923
+ canvas.onmspointerup = drawEndHandler;
924
+ canvas.onmspointermove = drawMoveHandler;
925
+ }
926
+ }
927
+ }).call(
928
+ this
929
+ , movementHandlers.drawEndHandler
930
+ , movementHandlers.drawStartHandler
931
+ , movementHandlers.drawMoveHandler
932
+ )
933
+
934
+ //=========================================
935
+ // various event handlers
936
+
937
+ // on mouseout + mouseup canvas did not know that mouseUP fired. Continued to draw despite mouse UP.
938
+ // it is bettr than
939
+ // $canvas.bind('mouseout', drawEndHandler)
940
+ // because we don't want to break the stroke where user accidentally gets ouside and wants to get back in quickly.
941
+ eventTokens[apinamespace + '.windowmouseup'] = globalEvents.subscribe(
942
+ apinamespace + '.windowmouseup'
943
+ , movementHandlers.drawEndHandler
944
+ );
945
+
946
+ this.events.publish(apinamespace+'.attachingEventHandlers');
947
+
948
+ // If we have proportional width, we sign up to events broadcasting "window resized" and checking if
949
+ // parent's width changed. If so, we (1) extract settings + data from current signature pad,
950
+ // (2) remove signature pad from parent, and (3) reinit new signature pad at new size with same settings, (rescaled) data.
951
+ conditionallyLinkCanvasResizeToWindowResize.call(
952
+ this
953
+ , this
954
+ , settings.width.toString(10)
955
+ , apinamespace, globalEvents
956
+ );
957
+
958
+ // end of event handlers.
959
+ // ===============================
960
+
961
+ this.resetCanvas(settings.data);
962
+
963
+ // resetCanvas renders the data on the screen and fires ONE "change" event
964
+ // if there is data. If you have controls that rely on "change" firing
965
+ // attach them to something that runs before this.resetCanvas, like
966
+ // apinamespace+'.attachingEventHandlers' that fires a bit higher.
967
+ this.events.publish(apinamespace+'.initialized');
968
+
969
+ return this;
970
+ } // end of initBase
971
+
972
+ //=========================================================================
973
+ // jSignatureClass's methods and supporting fn's
974
+
975
+ jSignatureClass.prototype.resetCanvas = function(data, dontClear){
976
+ var canvas = this.canvas
977
+ , settings = this.settings
978
+ , ctx = this.canvasContext
979
+ , isCanvasEmulator = this.isCanvasEmulator
980
+ , cw = canvas.width
981
+ , ch = canvas.height;
982
+
983
+ // preparing colors, drawing area
984
+ if (!dontClear){
985
+ ctx.clearRect(0, 0, cw + 30, ch + 30);
986
+ }
987
+
988
+ ctx.shadowColor = ctx.fillStyle = settings['background-color']
989
+ if (isCanvasEmulator){
990
+ // FLashCanvas fills with Black by default, covering up the parent div's background
991
+ // hence we refill
992
+ ctx.fillRect(0,0,cw + 30, ch + 30);
993
+ }
994
+
995
+ ctx.lineWidth = Math.ceil(parseInt(settings.lineWidth, 10));
996
+ ctx.lineCap = ctx.lineJoin = "round";
997
+
998
+ // signature line
999
+ if(settings.signatureLine) {
1000
+ if (null != settings['decor-color']) {
1001
+ ctx.strokeStyle = settings['decor-color'];
1002
+ ctx.shadowOffsetX = 0;
1003
+ ctx.shadowOffsetY = 0;
1004
+ var lineoffset = Math.round( ch / 5 );
1005
+ basicLine(ctx, lineoffset * 1.5, ch - lineoffset, cw - (lineoffset * 1.5), ch - lineoffset);
1006
+ }
1007
+
1008
+ if (!isCanvasEmulator){
1009
+ ctx.shadowColor = ctx.strokeStyle;
1010
+ ctx.shadowOffsetX = ctx.lineWidth * 0.5;
1011
+ ctx.shadowOffsetY = ctx.lineWidth * -0.6;
1012
+ ctx.shadowBlur = 0;
1013
+ }
1014
+ }
1015
+
1016
+ ctx.strokeStyle = settings.color;
1017
+
1018
+ // setting up new dataEngine
1019
+
1020
+ if (!data) { data = []; }
1021
+
1022
+ var dataEngine = this.dataEngine = new DataEngine(
1023
+ data
1024
+ , this
1025
+ , strokeStartCallback
1026
+ , strokeAddCallback
1027
+ , strokeEndCallback
1028
+ );
1029
+
1030
+ settings.data = data; // onwindowresize handler uses it, i think.
1031
+ $(canvas).data(apinamespace+'.data', data)
1032
+ .data(apinamespace+'.settings', settings);
1033
+
1034
+ // we fire "change" event on every change in data.
1035
+ // setting this up:
1036
+ dataEngine.changed = (function(target, events, apinamespace) {
1037
+ 'use strict'
1038
+ return function() {
1039
+ events.publish(apinamespace+'.change');
1040
+ target.trigger('change');
1041
+ }
1042
+ })(this.$parent, this.events, apinamespace);
1043
+ // let's trigger change on all data reloads
1044
+ dataEngine.changed();
1045
+
1046
+ // import filters will be passing this back as indication of "we rendered"
1047
+ return true;
1048
+ };
1049
+
1050
+ function initializeCanvasEmulator(canvas){
1051
+ if (canvas.getContext){
1052
+ return false;
1053
+ } else {
1054
+ // for cases when jSignature, FlashCanvas is inserted
1055
+ // from one window into another (child iframe)
1056
+ // 'window' and 'FlashCanvas' may be stuck behind
1057
+ // in that other parent window.
1058
+ // we need to find it
1059
+ var window = canvas.ownerDocument.parentWindow;
1060
+ var FC = window.FlashCanvas ?
1061
+ canvas.ownerDocument.parentWindow.FlashCanvas :
1062
+ (
1063
+ typeof FlashCanvas === "undefined" ?
1064
+ undefined :
1065
+ FlashCanvas
1066
+ );
1067
+
1068
+ if (FC) {
1069
+ canvas = FC.initElement(canvas);
1070
+
1071
+ var zoom = 1;
1072
+ // FlashCanvas uses flash which has this annoying habit of NOT scaling with page zoom.
1073
+ // It matches pixel-to-pixel to screen instead.
1074
+ // Since we are targeting ONLY IE 7, 8 with FlashCanvas, we will test the zoom only the IE8, IE7 way
1075
+ if (window && window.screen && window.screen.deviceXDPI && window.screen.logicalXDPI){
1076
+ zoom = window.screen.deviceXDPI * 1.0 / window.screen.logicalXDPI;
1077
+ }
1078
+ if (zoom !== 1){
1079
+ try {
1080
+ // We effectively abuse the brokenness of FlashCanvas and force the flash rendering surface to
1081
+ // occupy larger pixel dimensions than the wrapping, scaled up DIV and Canvas elems.
1082
+ $(canvas).children('object').get(0).resize(Math.ceil(canvas.width * zoom), Math.ceil(canvas.height * zoom));
1083
+ // And by applying "scale" transformation we can talk "browser pixels" to FlashCanvas
1084
+ // and have it translate the "browser pixels" to "screen pixels"
1085
+ canvas.getContext('2d').scale(zoom, zoom);
1086
+ // Note to self: don't reuse Canvas element. Repeated "scale" are cumulative.
1087
+ } catch (ex) {}
1088
+ }
1089
+ return true;
1090
+ } else {
1091
+ throw new Error("Canvas element does not support 2d context. jSignature cannot proceed.");
1092
+ }
1093
+ }
1094
+
1095
+ }
1096
+
1097
+ jSignatureClass.prototype.initializeCanvas = function(settings) {
1098
+ // ===========
1099
+ // Init + Sizing code
1100
+
1101
+ var canvas = document.createElement('canvas')
1102
+ , $canvas = $(canvas);
1103
+
1104
+ // We cannot work with circular dependency
1105
+ if (settings.width === settings.height && settings.height === 'ratio') {
1106
+ settings.width = '100%';
1107
+ }
1108
+
1109
+ $canvas.css(
1110
+ {
1111
+ 'margin': 0,
1112
+ 'padding': 0,
1113
+ 'border': 'none',
1114
+ 'height': settings.height === 'ratio' || !settings.height ? 1 : settings.height.toString(10),
1115
+ 'width': settings.width === 'ratio' || !settings.width ? 1 : settings.width.toString(10),
1116
+ '-ms-touch-action': 'none',
1117
+ 'touch-action': 'none',
1118
+ 'background-color': settings['background-color']
1119
+ }
1120
+ );
1121
+
1122
+ $canvas.appendTo(this.$parent);
1123
+
1124
+ // we could not do this until canvas is rendered (appended to DOM)
1125
+ if (settings.height === 'ratio') {
1126
+ $canvas.css(
1127
+ 'height'
1128
+ , Math.round( $canvas.width() / settings.sizeRatio )
1129
+ );
1130
+ } else if (settings.width === 'ratio') {
1131
+ $canvas.css(
1132
+ 'width'
1133
+ , Math.round( $canvas.height() * settings.sizeRatio )
1134
+ );
1135
+ }
1136
+
1137
+ $canvas.addClass(apinamespace);
1138
+
1139
+ // canvas's drawing area resolution is independent from canvas's size.
1140
+ // pixels are just scaled up or down when internal resolution does not
1141
+ // match external size. So...
1142
+
1143
+ canvas.width = $canvas.width();
1144
+ canvas.height = $canvas.height();
1145
+
1146
+ // Special case Sizing code
1147
+
1148
+ this.isCanvasEmulator = initializeCanvasEmulator(canvas);
1149
+
1150
+ // End of Sizing Code
1151
+ // ===========
1152
+
1153
+ // normally select preventer would be short, but
1154
+ // Canvas emulator on IE does NOT provide value for Event. Hence this convoluted line.
1155
+ canvas.onselectstart = function(e){if(e && e.preventDefault){e.preventDefault()}; if(e && e.stopPropagation){e.stopPropagation()}; return false;};
1156
+
1157
+ return canvas;
1158
+ }
1159
+
1160
+
1161
+ var GlobalJSignatureObjectInitializer = function(window){
1162
+
1163
+ var globalEvents = new PubSubClass();
1164
+
1165
+ // common "window resized" event listener.
1166
+ // jSignature instances will subscribe to this chanel.
1167
+ // to resize themselves when needed.
1168
+ ;(function(globalEvents, apinamespace, $, window){
1169
+ 'use strict'
1170
+
1171
+ var resizetimer
1172
+ , runner = function(){
1173
+ globalEvents.publish(
1174
+ apinamespace + '.parentresized'
1175
+ )
1176
+ };
1177
+
1178
+ // jSignature knows how to resize its content when its parent is resized
1179
+ // window resize is the only way we can catch resize events though...
1180
+ $(window).bind('resize.'+apinamespace, function(){
1181
+ if (resizetimer) {
1182
+ clearTimeout(resizetimer);
1183
+ }
1184
+ resizetimer = setTimeout(
1185
+ runner
1186
+ , 500
1187
+ );
1188
+ })
1189
+ // when mouse exists canvas element and "up"s outside, we cannot catch it with
1190
+ // callbacks attached to canvas. This catches it outside.
1191
+ .bind('mouseup.'+apinamespace, function(e){
1192
+ globalEvents.publish(
1193
+ apinamespace + '.windowmouseup'
1194
+ )
1195
+ });
1196
+
1197
+ })(globalEvents, apinamespace, $, window)
1198
+
1199
+ var jSignatureInstanceExtensions = {
1200
+ /*
1201
+ 'exampleExtension':function(extensionName){
1202
+ // we are called very early in instance's life.
1203
+ // right after the settings are resolved and
1204
+ // jSignatureInstance.events is created
1205
+ // and right before first ("jSignature.initializing") event is called.
1206
+ // You don't really need to manupilate
1207
+ // jSignatureInstance directly, just attach
1208
+ // a bunch of events to jSignatureInstance.events
1209
+ // (look at the source of jSignatureClass to see when these fire)
1210
+ // and your special pieces of code will attach by themselves.
1211
+
1212
+ // this function runs every time a new instance is set up.
1213
+ // this means every var you create will live only for one instance
1214
+ // unless you attach it to something outside, like "window."
1215
+ // and pick it up later from there.
1216
+
1217
+ // when globalEvents' events fire, 'this' is globalEvents object
1218
+ // when jSignatureInstance's events fire, 'this' is jSignatureInstance
1219
+
1220
+ // Here,
1221
+ // this = is new jSignatureClass's instance.
1222
+
1223
+ // The way you COULD approch setting this up is:
1224
+ // if you have multistep set up, attach event to "jSignature.initializing"
1225
+ // that attaches other events to be fired further lower the init stream.
1226
+ // Or, if you know for sure you rely on only one jSignatureInstance's event,
1227
+ // just attach to it directly
1228
+
1229
+ this.events.subscribe(
1230
+ // name of the event
1231
+ apinamespace + '.initializing'
1232
+ // event handlers, can pass args too, but in majority of cases,
1233
+ // 'this' which is jSignatureClass object instance pointer is enough to get by.
1234
+ , function(){
1235
+ if (this.settings.hasOwnProperty('non-existent setting category?')) {
1236
+ console.log(extensionName + ' is here')
1237
+ }
1238
+ }
1239
+ )
1240
+ }
1241
+ */
1242
+ };
1243
+
1244
+ var exportplugins = {
1245
+ 'default':function(data){return this.toDataURL()}
1246
+ , 'native':function(data){return data}
1247
+ , 'image':function(data){
1248
+ /*this = canvas elem */
1249
+ var imagestring = this.toDataURL();
1250
+
1251
+ if (typeof imagestring === 'string' &&
1252
+ imagestring.length > 4 &&
1253
+ imagestring.slice(0,5) === 'data:' &&
1254
+ imagestring.indexOf(',') !== -1){
1255
+
1256
+ var splitterpos = imagestring.indexOf(',');
1257
+
1258
+ return [
1259
+ imagestring.slice(5, splitterpos)
1260
+ , imagestring.substr(splitterpos + 1)
1261
+ ];
1262
+ }
1263
+ return [];
1264
+ }
1265
+ };
1266
+
1267
+ // will be part of "importplugins"
1268
+ function _renderImageOnCanvas( data, formattype, rerendercallable ) {
1269
+ 'use strict'
1270
+ // #1. Do NOT rely on this. No worky on IE
1271
+ // (url max len + lack of base64 decoder + possibly other issues)
1272
+ // #2. This does NOT affect what is captured as "signature" as far as vector data is
1273
+ // concerned. This is treated same as "signature line" - i.e. completely ignored
1274
+ // the only time you see imported image data exported is if you export as image.
1275
+
1276
+ // we do NOT call rerendercallable here (unlike in other import plugins)
1277
+ // because importing image does absolutely nothing to the underlying vector data storage
1278
+ // This could be a way to "import" old signatures stored as images
1279
+ // This could also be a way to import extra decor into signature area.
1280
+
1281
+ var img = new Image()
1282
+ // this = Canvas DOM elem. Not jQuery object. Not Canvas's parent div.
1283
+ , c = this;
1284
+
1285
+ img.onload = function () {
1286
+ var ctx = c.getContext("2d");
1287
+ var oldShadowColor = ctx.shadowColor;
1288
+ ctx.shadowColor = "transparent";
1289
+ ctx.drawImage(
1290
+ img, 0, 0
1291
+ , ( img.width < c.width) ? img.width : c.width
1292
+ , ( img.height < c.height) ? img.height : c.height
1293
+ );
1294
+ ctx.shadowColor = oldShadowColor;
1295
+ };
1296
+
1297
+ img.src = 'data:' + formattype + ',' + data;
1298
+ }
1299
+
1300
+ var importplugins = {
1301
+ 'native':function(data, formattype, rerendercallable){
1302
+ // we expect data as Array of objects of arrays here - whatever 'default' EXPORT plugin spits out.
1303
+ // returning Truthy to indicate we are good, all updated.
1304
+ rerendercallable( data );
1305
+ }
1306
+ , 'image': _renderImageOnCanvas
1307
+ , 'image/png;base64': _renderImageOnCanvas
1308
+ , 'image/jpeg;base64': _renderImageOnCanvas
1309
+ , 'image/jpg;base64': _renderImageOnCanvas
1310
+ };
1311
+
1312
+ function _clearDrawingArea( data, dontClear ) {
1313
+ this.find('canvas.'+apinamespace)
1314
+ .add(this.filter('canvas.'+apinamespace))
1315
+ .data(apinamespace+'.this').resetCanvas( data, dontClear );
1316
+ return this;
1317
+ }
1318
+
1319
+ function _setDrawingData( data, formattype ) {
1320
+ var undef;
1321
+
1322
+ if (formattype === undef && typeof data === 'string' && data.substr(0,5) === 'data:') {
1323
+ formattype = data.slice(5).split(',')[0];
1324
+ // 5 chars of "data:" + mimetype len + 1 "," char = all skipped.
1325
+ data = data.slice(6 + formattype.length);
1326
+ if (formattype === data) {
1327
+ return;
1328
+ }
1329
+ }
1330
+
1331
+ var $canvas = this.find('canvas.'+apinamespace).add(this.filter('canvas.'+apinamespace));
1332
+
1333
+ if (!importplugins.hasOwnProperty(formattype)) {
1334
+ throw new Error(apinamespace + " is unable to find import plugin with for format '"+ String(formattype) +"'");
1335
+ } else if ($canvas.length !== 0) {
1336
+ importplugins[formattype].call(
1337
+ $canvas[0]
1338
+ , data
1339
+ , formattype
1340
+ , (function(jSignatureInstance){
1341
+ return function(){ return jSignatureInstance.resetCanvas.apply(jSignatureInstance, arguments) }
1342
+ })($canvas.data(apinamespace+'.this'))
1343
+ );
1344
+ }
1345
+
1346
+ return this;
1347
+ }
1348
+
1349
+ var elementIsOrphan = function(e){
1350
+ var topOfDOM = false;
1351
+ e = e.parentNode;
1352
+ while (e && !topOfDOM){
1353
+ topOfDOM = e.body;
1354
+ e = e.parentNode;
1355
+ }
1356
+ return !topOfDOM;
1357
+ }
1358
+
1359
+ //These are exposed as methods under $obj.jSignature('methodname', *args)
1360
+ var plugins = {'export':exportplugins, 'import':importplugins, 'instance': jSignatureInstanceExtensions}
1361
+ , methods = {
1362
+ 'init' : function( options ) {
1363
+ return this.each( function() {
1364
+ if (!elementIsOrphan(this)) {
1365
+ new jSignatureClass(this, options, jSignatureInstanceExtensions);
1366
+ }
1367
+ })
1368
+ }
1369
+ , 'destroy': function() {
1370
+ return this.each(function() {
1371
+ if(!elementIsOrphan(this)) {
1372
+ var sig = $(this).find('canvas').data(apinamespace + '.this');
1373
+ if(sig) {
1374
+ sig.$controlbarLower.remove();
1375
+ sig.$controlbarUpper.remove();
1376
+ $(sig.canvas).remove();
1377
+ for (var e in sig.eventTokens){
1378
+ if (sig.eventTokens.hasOwnProperty(e)){
1379
+ globalEvents.unsubscribe(sig.eventTokens[e]);
1380
+ }
1381
+ }
1382
+ }
1383
+ }
1384
+ });
1385
+ }
1386
+ , 'getSettings' : function() {
1387
+ return this.find('canvas.'+apinamespace)
1388
+ .add(this.filter('canvas.'+apinamespace))
1389
+ .data(apinamespace+'.this').settings;
1390
+ }
1391
+ , 'isModified' : function() {
1392
+ return this.find('canvas.'+apinamespace)
1393
+ .add(this.filter('canvas.'+apinamespace))
1394
+ .data(apinamespace+'.this')
1395
+ .dataEngine
1396
+ ._stroke !== null;
1397
+ }
1398
+ , 'updateSetting' : function(param, val, forFuture) {
1399
+ var $canvas = this.find('canvas.'+apinamespace)
1400
+ .add(this.filter('canvas.'+apinamespace))
1401
+ .data(apinamespace+'.this');
1402
+ $canvas.settings[param] = val;
1403
+ $canvas.resetCanvas(( forFuture ? null : $canvas.settings.data ), true);
1404
+ return $canvas.settings[param];
1405
+ }
1406
+ // around since v1
1407
+ , 'clear' : _clearDrawingArea
1408
+ // was mistakenly introduced instead of 'clear' in v2
1409
+ , 'reset' : _clearDrawingArea
1410
+ , 'addPlugin' : function(pluginType, pluginName, callable){
1411
+ if (plugins.hasOwnProperty(pluginType)){
1412
+ plugins[pluginType][pluginName] = callable;
1413
+ }
1414
+ return this;
1415
+ }
1416
+ , 'listPlugins' : function(pluginType){
1417
+ var answer = [];
1418
+ if (plugins.hasOwnProperty(pluginType)){
1419
+ var o = plugins[pluginType];
1420
+ for (var k in o){
1421
+ if (o.hasOwnProperty(k)){
1422
+ answer.push(k);
1423
+ }
1424
+ }
1425
+ }
1426
+ return answer;
1427
+ }
1428
+ , 'getData' : function( formattype ) {
1429
+ var undef, $canvas=this.find('canvas.'+apinamespace).add(this.filter('canvas.'+apinamespace));
1430
+ if (formattype === undef) {
1431
+ formattype = 'default';
1432
+ }
1433
+ if ($canvas.length !== 0 && exportplugins.hasOwnProperty(formattype)){
1434
+ return exportplugins[formattype].call(
1435
+ $canvas.get(0) // canvas dom elem
1436
+ , $canvas.data(apinamespace+'.data') // raw signature data as array of objects of arrays
1437
+ , $canvas.data(apinamespace+'.settings')
1438
+ );
1439
+ }
1440
+ }
1441
+ // around since v1. Took only one arg - data-url-formatted string with (likely png of) signature image
1442
+ , 'importData' : _setDrawingData
1443
+ // was mistakenly introduced instead of 'importData' in v2
1444
+ , 'setData' : _setDrawingData
1445
+ // this is one and same instance for all jSignature.
1446
+ , 'globalEvents' : function(){return globalEvents}
1447
+ , 'disable' : function() {
1448
+ this.find("input").attr("disabled", 1);
1449
+ this.find('canvas.'+apinamespace)
1450
+ .addClass("disabled")
1451
+ .data(apinamespace+'.this')
1452
+ .settings
1453
+ .readOnly=true;
1454
+ }
1455
+ , 'enable' : function() {
1456
+ this.find("input").removeAttr("disabled");
1457
+ this.find('canvas.'+apinamespace)
1458
+ .removeClass("disabled")
1459
+ .data(apinamespace+'.this')
1460
+ .settings
1461
+ .readOnly=false;
1462
+ }
1463
+ // there will be a separate one for each jSignature instance.
1464
+ , 'events' : function() {
1465
+ return this.find('canvas.'+apinamespace)
1466
+ .add(this.filter('canvas.'+apinamespace))
1467
+ .data(apinamespace+'.this').events;
1468
+ }
1469
+ } // end of methods declaration.
1470
+
1471
+ $.fn[apinamespace] = function(method) {
1472
+ 'use strict'
1473
+ if ( !method || typeof method === 'object' ) {
1474
+ return methods.init.apply( this, arguments );
1475
+ } else if ( typeof method === 'string' && methods[method] ) {
1476
+ return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
1477
+ } else {
1478
+ $.error( 'Method ' + String(method) + ' does not exist on jQuery.' + apinamespace );
1479
+ }
1480
+ }
1481
+
1482
+ } // end of GlobalJSignatureObjectInitializer
1483
+
1484
+ GlobalJSignatureObjectInitializer(window)
1485
+
1486
+ })();