fomantic-ui 2.9.1-beta.2 → 2.9.1-beta.21

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 (493) hide show
  1. package/.eslintrc.js +111 -0
  2. package/.github/workflows/ci.yml +14 -4
  3. package/.stylelintrc.js +59 -0
  4. package/dist/components/accordion.css +19 -26
  5. package/dist/components/accordion.js +568 -595
  6. package/dist/components/accordion.min.css +1 -1
  7. package/dist/components/accordion.min.js +2 -2
  8. package/dist/components/ad.css +31 -41
  9. package/dist/components/ad.min.css +1 -1
  10. package/dist/components/api.js +1156 -1179
  11. package/dist/components/api.min.js +2 -2
  12. package/dist/components/breadcrumb.css +1 -1
  13. package/dist/components/breadcrumb.min.css +1 -1
  14. package/dist/components/button.css +71 -106
  15. package/dist/components/button.min.css +1 -1
  16. package/dist/components/calendar.css +18 -16
  17. package/dist/components/calendar.js +1902 -1809
  18. package/dist/components/calendar.min.css +2 -2
  19. package/dist/components/calendar.min.js +2 -2
  20. package/dist/components/card.css +83 -115
  21. package/dist/components/card.min.css +1 -1
  22. package/dist/components/checkbox.css +47 -64
  23. package/dist/components/checkbox.js +842 -841
  24. package/dist/components/checkbox.min.css +1 -1
  25. package/dist/components/checkbox.min.js +2 -2
  26. package/dist/components/comment.css +37 -51
  27. package/dist/components/comment.min.css +1 -1
  28. package/dist/components/container.css +6 -5
  29. package/dist/components/container.min.css +2 -2
  30. package/dist/components/dimmer.css +31 -41
  31. package/dist/components/dimmer.js +708 -737
  32. package/dist/components/dimmer.min.css +1 -1
  33. package/dist/components/dimmer.min.js +2 -2
  34. package/dist/components/divider.css +32 -44
  35. package/dist/components/divider.min.css +1 -1
  36. package/dist/components/dropdown.css +129 -166
  37. package/dist/components/dropdown.js +4161 -4234
  38. package/dist/components/dropdown.min.css +2 -2
  39. package/dist/components/dropdown.min.js +2 -2
  40. package/dist/components/embed.css +13 -19
  41. package/dist/components/embed.js +651 -675
  42. package/dist/components/embed.min.css +1 -1
  43. package/dist/components/embed.min.js +2 -2
  44. package/dist/components/emoji.css +7 -6
  45. package/dist/components/feed.css +24 -32
  46. package/dist/components/feed.min.css +1 -1
  47. package/dist/components/flag.css +5 -3
  48. package/dist/components/flag.min.css +1 -1
  49. package/dist/components/flyout.css +44 -58
  50. package/dist/components/flyout.js +1464 -1465
  51. package/dist/components/flyout.min.css +2 -2
  52. package/dist/components/flyout.min.js +2 -2
  53. package/dist/components/form.css +85 -111
  54. package/dist/components/form.js +1979 -2004
  55. package/dist/components/form.min.css +1 -1
  56. package/dist/components/form.min.js +2 -2
  57. package/dist/components/grid.css +70 -96
  58. package/dist/components/grid.min.css +1 -1
  59. package/dist/components/header.css +47 -65
  60. package/dist/components/header.min.css +1 -1
  61. package/dist/components/icon.css +45 -66
  62. package/dist/components/icon.min.css +2 -2
  63. package/dist/components/image.css +32 -42
  64. package/dist/components/image.min.css +1 -1
  65. package/dist/components/input.css +182 -65
  66. package/dist/components/input.min.css +2 -2
  67. package/dist/components/item.css +55 -77
  68. package/dist/components/item.min.css +1 -1
  69. package/dist/components/label.css +68 -91
  70. package/dist/components/label.min.css +2 -2
  71. package/dist/components/list.css +44 -59
  72. package/dist/components/list.min.css +1 -1
  73. package/dist/components/loader.css +16 -22
  74. package/dist/components/loader.min.css +1 -1
  75. package/dist/components/menu.css +126 -186
  76. package/dist/components/message.css +25 -35
  77. package/dist/components/message.min.css +1 -1
  78. package/dist/components/modal.css +39 -40
  79. package/dist/components/modal.js +1491 -1485
  80. package/dist/components/modal.min.css +2 -2
  81. package/dist/components/modal.min.js +2 -2
  82. package/dist/components/nag.css +21 -28
  83. package/dist/components/nag.js +518 -526
  84. package/dist/components/nag.min.css +2 -2
  85. package/dist/components/nag.min.js +2 -2
  86. package/dist/components/placeholder.css +10 -12
  87. package/dist/components/placeholder.min.css +1 -1
  88. package/dist/components/popup.css +352 -59
  89. package/dist/components/popup.js +1437 -1456
  90. package/dist/components/popup.min.css +2 -2
  91. package/dist/components/popup.min.js +2 -2
  92. package/dist/components/progress.css +29 -39
  93. package/dist/components/progress.js +969 -997
  94. package/dist/components/progress.min.css +1 -1
  95. package/dist/components/progress.min.js +2 -2
  96. package/dist/components/rail.css +15 -20
  97. package/dist/components/rail.min.css +1 -1
  98. package/dist/components/rating.css +9 -13
  99. package/dist/components/rating.js +505 -523
  100. package/dist/components/rating.min.css +1 -1
  101. package/dist/components/rating.min.js +2 -2
  102. package/dist/components/reset.css +1 -1
  103. package/dist/components/reset.min.css +1 -1
  104. package/dist/components/reveal.css +19 -26
  105. package/dist/components/reveal.min.css +1 -1
  106. package/dist/components/search.css +43 -58
  107. package/dist/components/search.js +1498 -1534
  108. package/dist/components/search.min.css +2 -2
  109. package/dist/components/search.min.js +2 -2
  110. package/dist/components/segment.css +64 -83
  111. package/dist/components/segment.min.css +2 -2
  112. package/dist/components/shape.css +10 -14
  113. package/dist/components/shape.js +792 -809
  114. package/dist/components/shape.min.css +1 -1
  115. package/dist/components/shape.min.js +2 -2
  116. package/dist/components/sidebar.css +43 -58
  117. package/dist/components/sidebar.js +1071 -1098
  118. package/dist/components/sidebar.min.css +2 -2
  119. package/dist/components/sidebar.min.js +2 -2
  120. package/dist/components/site.css +5 -5
  121. package/dist/components/site.js +462 -476
  122. package/dist/components/site.min.css +1 -1
  123. package/dist/components/site.min.js +2 -2
  124. package/dist/components/slider.css +27 -37
  125. package/dist/components/slider.js +1287 -1306
  126. package/dist/components/slider.min.js +2 -2
  127. package/dist/components/state.js +639 -657
  128. package/dist/components/state.min.js +2 -2
  129. package/dist/components/statistic.css +32 -41
  130. package/dist/components/statistic.min.css +2 -2
  131. package/dist/components/step.css +26 -35
  132. package/dist/components/step.min.css +1 -1
  133. package/dist/components/sticky.css +1 -1
  134. package/dist/components/sticky.js +857 -902
  135. package/dist/components/sticky.min.css +1 -1
  136. package/dist/components/sticky.min.js +2 -2
  137. package/dist/components/tab.css +6 -8
  138. package/dist/components/tab.js +922 -963
  139. package/dist/components/tab.min.css +1 -1
  140. package/dist/components/tab.min.js +2 -2
  141. package/dist/components/table.css +93 -119
  142. package/dist/components/table.min.css +2 -2
  143. package/dist/components/text.css +1 -1
  144. package/dist/components/text.min.css +1 -1
  145. package/dist/components/toast.css +4 -6
  146. package/dist/components/toast.js +886 -887
  147. package/dist/components/toast.min.css +1 -1
  148. package/dist/components/toast.min.js +2 -2
  149. package/dist/components/transition.css +179 -42
  150. package/dist/components/transition.js +1041 -1077
  151. package/dist/components/transition.min.css +2 -2
  152. package/dist/components/transition.min.js +2 -2
  153. package/dist/components/visibility.js +1220 -1244
  154. package/dist/components/visibility.min.js +2 -2
  155. package/dist/semantic.css +2558 -1807
  156. package/dist/semantic.js +28960 -29413
  157. package/dist/semantic.min.css +2 -2
  158. package/dist/semantic.min.js +2 -2
  159. package/dist/themes/default/assets/fonts/Lato-Bold.woff +0 -0
  160. package/dist/themes/default/assets/fonts/Lato-Bold.woff2 +0 -0
  161. package/dist/themes/default/assets/fonts/Lato-BoldItalic.woff +0 -0
  162. package/dist/themes/default/assets/fonts/Lato-BoldItalic.woff2 +0 -0
  163. package/dist/themes/default/assets/fonts/Lato-Italic.woff +0 -0
  164. package/dist/themes/default/assets/fonts/Lato-Italic.woff2 +0 -0
  165. package/dist/themes/default/assets/fonts/Lato-Regular.woff +0 -0
  166. package/dist/themes/default/assets/fonts/Lato-Regular.woff2 +0 -0
  167. package/dist/themes/default/assets/fonts/LatoLatin-Bold.woff +0 -0
  168. package/dist/themes/default/assets/fonts/LatoLatin-Bold.woff2 +0 -0
  169. package/dist/themes/default/assets/fonts/LatoLatin-BoldItalic.woff +0 -0
  170. package/dist/themes/default/assets/fonts/LatoLatin-BoldItalic.woff2 +0 -0
  171. package/dist/themes/default/assets/fonts/LatoLatin-Italic.woff +0 -0
  172. package/dist/themes/default/assets/fonts/LatoLatin-Italic.woff2 +0 -0
  173. package/dist/themes/default/assets/fonts/LatoLatin-Regular.woff +0 -0
  174. package/dist/themes/default/assets/fonts/LatoLatin-Regular.woff2 +0 -0
  175. package/examples/assets/show-examples.js +13 -13
  176. package/gulpfile.js +9 -10
  177. package/package.json +13 -8
  178. package/scripts/nightly-version.js +81 -75
  179. package/src/_site/collections/menu.overrides +1 -1
  180. package/src/_site/elements/flag.variables +2 -2
  181. package/src/_site/globals/site.variables +1 -1
  182. package/src/definitions/behaviors/api.js +1157 -1180
  183. package/src/definitions/behaviors/form.js +1978 -2003
  184. package/src/definitions/behaviors/state.js +645 -663
  185. package/src/definitions/behaviors/visibility.js +1219 -1243
  186. package/src/definitions/collections/breadcrumb.less +41 -45
  187. package/src/definitions/collections/form.less +864 -882
  188. package/src/definitions/collections/grid.less +1689 -1697
  189. package/src/definitions/collections/menu.less +1490 -1508
  190. package/src/definitions/collections/message.less +292 -295
  191. package/src/definitions/collections/table.less +1616 -1620
  192. package/src/definitions/elements/button.less +1710 -1754
  193. package/src/definitions/elements/container.less +209 -209
  194. package/src/definitions/elements/divider.less +200 -209
  195. package/src/definitions/elements/emoji.less +38 -45
  196. package/src/definitions/elements/flag.less +44 -46
  197. package/src/definitions/elements/header.less +337 -345
  198. package/src/definitions/elements/icon.less +516 -451
  199. package/src/definitions/elements/image.less +219 -225
  200. package/src/definitions/elements/input.less +657 -663
  201. package/src/definitions/elements/label.less +783 -804
  202. package/src/definitions/elements/list.less +808 -812
  203. package/src/definitions/elements/loader.less +269 -266
  204. package/src/definitions/elements/placeholder.less +171 -168
  205. package/src/definitions/elements/rail.less +91 -91
  206. package/src/definitions/elements/reveal.less +190 -196
  207. package/src/definitions/elements/segment.less +738 -747
  208. package/src/definitions/elements/step.less +424 -435
  209. package/src/definitions/elements/text.less +32 -34
  210. package/src/definitions/globals/reset.less +9 -6
  211. package/src/definitions/globals/site.js +461 -475
  212. package/src/definitions/globals/site.less +106 -108
  213. package/src/definitions/modules/accordion.js +567 -594
  214. package/src/definitions/modules/accordion.less +242 -246
  215. package/src/definitions/modules/calendar.js +1901 -1808
  216. package/src/definitions/modules/calendar.less +98 -95
  217. package/src/definitions/modules/checkbox.js +841 -840
  218. package/src/definitions/modules/checkbox.less +524 -545
  219. package/src/definitions/modules/dimmer.js +707 -736
  220. package/src/definitions/modules/dimmer.less +300 -303
  221. package/src/definitions/modules/dropdown.js +4160 -4233
  222. package/src/definitions/modules/dropdown.less +1570 -1596
  223. package/src/definitions/modules/embed.js +650 -674
  224. package/src/definitions/modules/embed.less +80 -82
  225. package/src/definitions/modules/flyout.js +1463 -1464
  226. package/src/definitions/modules/flyout.less +444 -454
  227. package/src/definitions/modules/modal.js +1490 -1484
  228. package/src/definitions/modules/modal.less +459 -465
  229. package/src/definitions/modules/nag.js +517 -525
  230. package/src/definitions/modules/nag.less +134 -147
  231. package/src/definitions/modules/popup.js +1436 -1455
  232. package/src/definitions/modules/popup.less +733 -690
  233. package/src/definitions/modules/progress.js +968 -996
  234. package/src/definitions/modules/progress.less +521 -497
  235. package/src/definitions/modules/rating.js +504 -522
  236. package/src/definitions/modules/rating.less +94 -101
  237. package/src/definitions/modules/search.js +1497 -1533
  238. package/src/definitions/modules/search.less +373 -392
  239. package/src/definitions/modules/shape.js +791 -808
  240. package/src/definitions/modules/shape.less +68 -77
  241. package/src/definitions/modules/sidebar.js +1070 -1097
  242. package/src/definitions/modules/sidebar.less +462 -474
  243. package/src/definitions/modules/slider.js +1286 -1305
  244. package/src/definitions/modules/slider.less +307 -308
  245. package/src/definitions/modules/sticky.js +873 -918
  246. package/src/definitions/modules/sticky.less +22 -23
  247. package/src/definitions/modules/tab.js +921 -962
  248. package/src/definitions/modules/tab.less +46 -52
  249. package/src/definitions/modules/toast.js +885 -886
  250. package/src/definitions/modules/toast.less +584 -586
  251. package/src/definitions/modules/transition.js +1040 -1076
  252. package/src/definitions/modules/transition.less +62 -28
  253. package/src/definitions/views/ad.less +205 -206
  254. package/src/definitions/views/card.less +963 -969
  255. package/src/definitions/views/comment.less +190 -198
  256. package/src/definitions/views/feed.less +220 -224
  257. package/src/definitions/views/item.less +435 -446
  258. package/src/definitions/views/statistic.less +271 -277
  259. package/src/theme.less +29 -32
  260. package/src/themes/amazon/elements/button.overrides +23 -24
  261. package/src/themes/amazon/elements/button.variables +11 -11
  262. package/src/themes/amazon/globals/site.variables +2 -3
  263. package/src/themes/basic/collections/table.overrides +0 -1
  264. package/src/themes/basic/collections/table.variables +3 -3
  265. package/src/themes/basic/elements/button.overrides +0 -1
  266. package/src/themes/basic/elements/button.variables +2 -2
  267. package/src/themes/basic/elements/icon.overrides +12 -13
  268. package/src/themes/basic/elements/icon.variables +13 -13
  269. package/src/themes/basic/elements/step.overrides +2 -2
  270. package/src/themes/basic/elements/step.variables +2 -2
  271. package/src/themes/basic/globals/reset.overrides +1 -1
  272. package/src/themes/basic/globals/reset.variables +1 -1
  273. package/src/themes/basic/views/card.overrides +0 -1
  274. package/src/themes/basic/views/card.variables +3 -3
  275. package/src/themes/bookish/elements/header.overrides +3 -3
  276. package/src/themes/bookish/elements/header.variables +2 -2
  277. package/src/themes/bootstrap3/elements/button.variables +7 -8
  278. package/src/themes/chubby/collections/form.overrides +9 -9
  279. package/src/themes/chubby/collections/form.variables +3 -3
  280. package/src/themes/chubby/collections/menu.variables +1 -1
  281. package/src/themes/chubby/elements/button.overrides +7 -9
  282. package/src/themes/chubby/elements/button.variables +2 -2
  283. package/src/themes/chubby/elements/header.variables +3 -3
  284. package/src/themes/chubby/modules/accordion.overrides +2 -2
  285. package/src/themes/chubby/modules/accordion.variables +3 -3
  286. package/src/themes/chubby/views/comment.overrides +5 -5
  287. package/src/themes/chubby/views/comment.variables +4 -4
  288. package/src/themes/classic/collections/table.variables +2 -2
  289. package/src/themes/classic/elements/button.variables +20 -21
  290. package/src/themes/classic/elements/header.variables +3 -3
  291. package/src/themes/classic/modules/progress.variables +1 -1
  292. package/src/themes/classic/views/card.overrides +14 -14
  293. package/src/themes/classic/views/card.variables +4 -4
  294. package/src/themes/colored/modules/checkbox.variables +1 -1
  295. package/src/themes/default/assets/fonts/Lato-Bold.woff +0 -0
  296. package/src/themes/default/assets/fonts/Lato-Bold.woff2 +0 -0
  297. package/src/themes/default/assets/fonts/Lato-BoldItalic.woff +0 -0
  298. package/src/themes/default/assets/fonts/Lato-BoldItalic.woff2 +0 -0
  299. package/src/themes/default/assets/fonts/Lato-Italic.woff +0 -0
  300. package/src/themes/default/assets/fonts/Lato-Italic.woff2 +0 -0
  301. package/src/themes/default/assets/fonts/Lato-Regular.woff +0 -0
  302. package/src/themes/default/assets/fonts/Lato-Regular.woff2 +0 -0
  303. package/src/themes/default/assets/fonts/LatoLatin-Bold.woff +0 -0
  304. package/src/themes/default/assets/fonts/LatoLatin-Bold.woff2 +0 -0
  305. package/src/themes/default/assets/fonts/LatoLatin-BoldItalic.woff +0 -0
  306. package/src/themes/default/assets/fonts/LatoLatin-BoldItalic.woff2 +0 -0
  307. package/src/themes/default/assets/fonts/LatoLatin-Italic.woff +0 -0
  308. package/src/themes/default/assets/fonts/LatoLatin-Italic.woff2 +0 -0
  309. package/src/themes/default/assets/fonts/LatoLatin-Regular.woff +0 -0
  310. package/src/themes/default/assets/fonts/LatoLatin-Regular.woff2 +0 -0
  311. package/src/themes/default/collections/breadcrumb.variables +4 -4
  312. package/src/themes/default/collections/form.variables +12 -12
  313. package/src/themes/default/collections/grid.overrides +0 -1
  314. package/src/themes/default/collections/grid.variables +14 -16
  315. package/src/themes/default/collections/menu.variables +19 -31
  316. package/src/themes/default/collections/message.variables +83 -84
  317. package/src/themes/default/collections/table.variables +16 -18
  318. package/src/themes/default/elements/button.variables +30 -31
  319. package/src/themes/default/elements/container.variables +4 -12
  320. package/src/themes/default/elements/divider.overrides +8 -9
  321. package/src/themes/default/elements/divider.variables +4 -5
  322. package/src/themes/default/elements/emoji.overrides +0 -1
  323. package/src/themes/default/elements/emoji.variables +3555 -3555
  324. package/src/themes/default/elements/flag.variables +1594 -1594
  325. package/src/themes/default/elements/header.overrides +0 -1
  326. package/src/themes/default/elements/header.variables +16 -16
  327. package/src/themes/default/elements/icon.variables +2017 -2001
  328. package/src/themes/default/elements/image.variables +6 -7
  329. package/src/themes/default/elements/input.variables +10 -10
  330. package/src/themes/default/elements/label.variables +19 -20
  331. package/src/themes/default/elements/list.variables +16 -16
  332. package/src/themes/default/elements/loader.variables +15 -16
  333. package/src/themes/default/elements/placeholder.variables +6 -7
  334. package/src/themes/default/elements/rail.variables +4 -5
  335. package/src/themes/default/elements/segment.variables +18 -29
  336. package/src/themes/default/elements/step.overrides +4 -4
  337. package/src/themes/default/elements/step.variables +14 -16
  338. package/src/themes/default/elements/text.variables +2 -3
  339. package/src/themes/default/globals/colors.less +588 -588
  340. package/src/themes/default/globals/reset.overrides +57 -57
  341. package/src/themes/default/globals/reset.variables +1 -1
  342. package/src/themes/default/globals/site.variables +869 -875
  343. package/src/themes/default/globals/variation.variables +13 -4
  344. package/src/themes/default/modules/accordion.overrides +11 -11
  345. package/src/themes/default/modules/accordion.variables +14 -15
  346. package/src/themes/default/modules/calendar.variables +2 -0
  347. package/src/themes/default/modules/chatroom.variables +1 -1
  348. package/src/themes/default/modules/checkbox.overrides +6 -7
  349. package/src/themes/default/modules/checkbox.variables +17 -22
  350. package/src/themes/default/modules/dimmer.variables +7 -8
  351. package/src/themes/default/modules/dropdown.overrides +17 -17
  352. package/src/themes/default/modules/dropdown.variables +20 -21
  353. package/src/themes/default/modules/embed.variables +9 -10
  354. package/src/themes/default/modules/flyout.variables +6 -6
  355. package/src/themes/default/modules/modal.variables +18 -18
  356. package/src/themes/default/modules/nag.variables +11 -14
  357. package/src/themes/default/modules/popup.variables +14 -13
  358. package/src/themes/default/modules/progress.variables +10 -11
  359. package/src/themes/default/modules/rating.variables +10 -11
  360. package/src/themes/default/modules/search.variables +9 -11
  361. package/src/themes/default/modules/shape.variables +6 -6
  362. package/src/themes/default/modules/sidebar.variables +4 -4
  363. package/src/themes/default/modules/slider.variables +48 -49
  364. package/src/themes/default/modules/sticky.variables +1 -1
  365. package/src/themes/default/modules/toast.variables +1 -1
  366. package/src/themes/default/modules/transition.overrides +936 -915
  367. package/src/themes/default/modules/transition.variables +8 -1
  368. package/src/themes/default/views/card.variables +20 -22
  369. package/src/themes/default/views/comment.variables +6 -8
  370. package/src/themes/default/views/feed.variables +6 -6
  371. package/src/themes/default/views/item.variables +6 -9
  372. package/src/themes/default/views/statistic.variables +8 -8
  373. package/src/themes/duo/elements/loader.variables +1 -1
  374. package/src/themes/famfamfam/elements/flag.overrides +263 -268
  375. package/src/themes/famfamfam/elements/flag.variables +3 -3
  376. package/src/themes/fixed-width/collections/grid.variables +1 -1
  377. package/src/themes/fixed-width/modules/modal.variables +3 -5
  378. package/src/themes/flat/collections/form.overrides +9 -9
  379. package/src/themes/flat/collections/form.variables +4 -5
  380. package/src/themes/flat/globals/site.variables +61 -66
  381. package/src/themes/github/collections/breadcrumb.variables +0 -1
  382. package/src/themes/github/collections/form.overrides +7 -8
  383. package/src/themes/github/collections/form.variables +12 -13
  384. package/src/themes/github/collections/grid.variables +1 -2
  385. package/src/themes/github/collections/menu.overrides +2 -2
  386. package/src/themes/github/collections/menu.variables +11 -12
  387. package/src/themes/github/collections/message.overrides +3 -3
  388. package/src/themes/github/collections/message.variables +5 -5
  389. package/src/themes/github/collections/table.variables +1 -1
  390. package/src/themes/github/elements/button.overrides +0 -1
  391. package/src/themes/github/elements/button.variables +14 -14
  392. package/src/themes/github/elements/header.variables +2 -2
  393. package/src/themes/github/elements/icon.overrides +179 -179
  394. package/src/themes/github/elements/icon.variables +10 -10
  395. package/src/themes/github/elements/image.variables +1 -1
  396. package/src/themes/github/elements/input.overrides +16 -16
  397. package/src/themes/github/elements/input.variables +3 -3
  398. package/src/themes/github/elements/label.overrides +3 -3
  399. package/src/themes/github/elements/label.variables +0 -1
  400. package/src/themes/github/elements/segment.variables +2 -3
  401. package/src/themes/github/elements/step.overrides +13 -13
  402. package/src/themes/github/elements/step.variables +2 -2
  403. package/src/themes/github/globals/site.variables +2 -2
  404. package/src/themes/github/modules/dropdown.overrides +18 -19
  405. package/src/themes/github/modules/dropdown.variables +1 -1
  406. package/src/themes/github/modules/popup.variables +0 -2
  407. package/src/themes/instagram/views/card.overrides +3 -4
  408. package/src/themes/instagram/views/card.variables +3 -4
  409. package/src/themes/joypixels/elements/emoji.overrides +0 -2
  410. package/src/themes/joypixels/elements/emoji.variables +3554 -3554
  411. package/src/themes/material/collections/menu.variables +1 -1
  412. package/src/themes/material/elements/button.overrides +6 -8
  413. package/src/themes/material/elements/button.variables +28 -28
  414. package/src/themes/material/elements/header.overrides +2 -2
  415. package/src/themes/material/elements/header.variables +2 -4
  416. package/src/themes/material/elements/icon.overrides +932 -932
  417. package/src/themes/material/elements/icon.variables +11 -11
  418. package/src/themes/material/globals/site.variables +78 -79
  419. package/src/themes/material/modules/dropdown.overrides +1 -1
  420. package/src/themes/material/modules/dropdown.variables +1 -1
  421. package/src/themes/material/modules/modal.overrides +2 -2
  422. package/src/themes/material/modules/modal.variables +1 -2
  423. package/src/themes/pulsar/elements/loader.overrides +58 -58
  424. package/src/themes/raised/elements/button.variables +8 -8
  425. package/src/themes/resetcss/globals/reset.overrides +115 -33
  426. package/src/themes/resetcss/globals/reset.variables +1 -1
  427. package/src/themes/round/elements/button.variables +11 -14
  428. package/src/themes/rtl/globals/site.variables +5 -6
  429. package/src/themes/striped/modules/progress.overrides +20 -16
  430. package/src/themes/systemfont/globals/reset.overrides +1 -1
  431. package/src/themes/systemfont/globals/site.variables +5 -5
  432. package/src/themes/timeline/views/feed.overrides +12 -12
  433. package/src/themes/timeline/views/feed.variables +4 -4
  434. package/src/themes/twitter/elements/button.overrides +4 -5
  435. package/src/themes/twitter/elements/button.variables +6 -7
  436. package/src/themes/twitter/elements/emoji.variables +3555 -3555
  437. package/tasks/admin/components/create.js +274 -276
  438. package/tasks/admin/components/init.js +123 -130
  439. package/tasks/admin/components/update.js +149 -157
  440. package/tasks/admin/distributions/create.js +184 -187
  441. package/tasks/admin/distributions/init.js +123 -130
  442. package/tasks/admin/distributions/update.js +145 -152
  443. package/tasks/admin/publish.js +5 -7
  444. package/tasks/admin/register.js +36 -38
  445. package/tasks/admin/release.js +8 -10
  446. package/tasks/build/assets.js +42 -39
  447. package/tasks/build/css.js +225 -216
  448. package/tasks/build/javascript.js +118 -113
  449. package/tasks/build.js +10 -10
  450. package/tasks/check-install.js +14 -16
  451. package/tasks/clean.js +5 -5
  452. package/tasks/collections/admin.js +34 -36
  453. package/tasks/collections/build.js +18 -20
  454. package/tasks/collections/docs.js +9 -11
  455. package/tasks/collections/install.js +9 -11
  456. package/tasks/collections/rtl.js +9 -11
  457. package/tasks/collections/various.js +8 -10
  458. package/tasks/config/admin/github.js +17 -17
  459. package/tasks/config/admin/oauth.example.js +4 -4
  460. package/tasks/config/admin/release.js +98 -98
  461. package/tasks/config/admin/templates/component-package.js +9 -10
  462. package/tasks/config/admin/templates/css-package.js +18 -20
  463. package/tasks/config/admin/templates/less-package.js +11 -13
  464. package/tasks/config/defaults.js +116 -114
  465. package/tasks/config/docs.js +23 -23
  466. package/tasks/config/npm/gulpfile.js +8 -9
  467. package/tasks/config/project/config.js +127 -134
  468. package/tasks/config/project/install.js +715 -713
  469. package/tasks/config/project/release.js +32 -38
  470. package/tasks/config/tasks.js +165 -156
  471. package/tasks/config/user.js +23 -26
  472. package/tasks/docs/build.js +97 -95
  473. package/tasks/docs/metadata.js +90 -96
  474. package/tasks/docs/serve.js +80 -81
  475. package/tasks/install.js +370 -378
  476. package/tasks/rtl/build.js +2 -2
  477. package/tasks/rtl/watch.js +2 -2
  478. package/tasks/version.js +4 -4
  479. package/tasks/watch.js +28 -30
  480. package/test/meteor/assets.js +10 -13
  481. package/test/meteor/fonts.js +12 -13
  482. package/test/modules/accordion.spec.js +6 -8
  483. package/test/modules/checkbox.spec.js +5 -7
  484. package/test/modules/dropdown.spec.js +5 -7
  485. package/test/modules/modal.spec.js +6 -8
  486. package/test/modules/module.spec.js +158 -178
  487. package/test/modules/popup.spec.js +5 -7
  488. package/test/modules/search.spec.js +5 -7
  489. package/test/modules/shape.spec.js +5 -7
  490. package/test/modules/sidebar.spec.js +5 -7
  491. package/test/modules/tab.spec.js +6 -8
  492. package/test/modules/transition.spec.js +5 -7
  493. package/test/modules/video.spec.js +5 -7
@@ -8,1229 +8,1206 @@
8
8
  *
9
9
  */
10
10
 
11
- ;(function ($, window, document, undefined) {
12
-
13
- 'use strict';
14
-
15
- $.isWindow = $.isWindow || function(obj) {
16
- return obj != null && obj === obj.window;
17
- };
18
-
19
- window = (typeof window != 'undefined' && window.Math == Math)
20
- ? window
21
- : (typeof self != 'undefined' && self.Math == Math)
22
- ? self
23
- : Function('return this')()
24
- ;
25
-
26
- $.api = $.fn.api = function(parameters) {
27
-
28
- var
29
- // use window context if none specified
30
- $allModules = $.isFunction(this)
31
- ? $(window)
32
- : $(this),
33
- moduleSelector = $allModules.selector || '',
34
- time = new Date().getTime(),
35
- performance = [],
36
-
37
- query = arguments[0],
38
- methodInvoked = (typeof query == 'string'),
39
- queryArguments = [].slice.call(arguments, 1),
40
-
41
- returnedValue
42
- ;
43
-
44
- $allModules
45
- .each(function() {
46
- var
47
- settings = ( $.isPlainObject(parameters) )
48
- ? $.extend(true, {}, $.fn.api.settings, parameters)
49
- : $.extend({}, $.fn.api.settings),
50
-
51
- // internal aliases
52
- namespace = settings.namespace,
53
- metadata = settings.metadata,
54
- selector = settings.selector,
55
- error = settings.error,
56
- className = settings.className,
57
-
58
- // define namespaces for modules
59
- eventNamespace = '.' + namespace,
60
- moduleNamespace = 'module-' + namespace,
61
-
62
- // element that creates request
63
- $module = $(this),
64
- $form = $module.closest(selector.form),
65
-
66
- // context used for state
67
- $context = (settings.stateContext)
68
- ? ([window,document].indexOf(settings.stateContext) < 0 ? $(document).find(settings.stateContext) : $(settings.stateContext))
69
- : $module,
70
-
71
- // request details
72
- ajaxSettings,
73
- requestSettings,
74
- url,
75
- data,
76
- requestStartTime,
77
- originalData,
78
-
79
- // standard module
80
- element = this,
81
- context = $context[0],
82
- instance = $module.data(moduleNamespace),
83
- module
84
- ;
85
-
86
- module = {
87
-
88
- initialize: function() {
89
- if(!methodInvoked) {
90
- originalData = settings.data;
91
- module.bind.events();
92
- }
93
- module.instantiate();
94
- },
11
+ (function ($, window, document, undefined) {
12
+ 'use strict';
13
+
14
+ function isWindow(obj) {
15
+ return obj != null && obj === obj.window;
16
+ }
17
+
18
+ function isFunction(obj) {
19
+ return typeof obj === 'function' && typeof obj.nodeType !== 'number';
20
+ }
21
+
22
+ window = (typeof window != 'undefined' && window.Math == Math)
23
+ ? window
24
+ : globalThis;
25
+
26
+ $.api = $.fn.api = function (parameters) {
27
+ var
28
+ // use window context if none specified
29
+ $allModules = isFunction(this)
30
+ ? $(window)
31
+ : $(this),
32
+ moduleSelector = $allModules.selector || '',
33
+ time = new Date().getTime(),
34
+ performance = [],
35
+
36
+ query = arguments[0],
37
+ methodInvoked = (typeof query == 'string'),
38
+ queryArguments = [].slice.call(arguments, 1),
39
+
40
+ returnedValue
41
+ ;
42
+
43
+ $allModules.each(function () {
44
+ var
45
+ settings = ($.isPlainObject(parameters))
46
+ ? $.extend(true, {}, $.fn.api.settings, parameters)
47
+ : $.extend({}, $.fn.api.settings),
48
+
49
+ // internal aliases
50
+ namespace = settings.namespace,
51
+ metadata = settings.metadata,
52
+ selector = settings.selector,
53
+ error = settings.error,
54
+ className = settings.className,
55
+
56
+ // define namespaces for modules
57
+ eventNamespace = '.' + namespace,
58
+ moduleNamespace = 'module-' + namespace,
59
+
60
+ // element that creates request
61
+ $module = $(this),
62
+ $form = $module.closest(selector.form),
63
+
64
+ // context used for state
65
+ $context = (settings.stateContext)
66
+ ? ([window, document].indexOf(settings.stateContext) < 0 ? $(document).find(settings.stateContext) : $(settings.stateContext))
67
+ : $module,
68
+
69
+ // request details
70
+ ajaxSettings,
71
+ requestSettings,
72
+ url,
73
+ data,
74
+ requestStartTime,
75
+ originalData,
76
+
77
+ // standard module
78
+ element = this,
79
+ context = $context[0],
80
+ instance = $module.data(moduleNamespace),
81
+ module
82
+ ;
95
83
 
96
- instantiate: function() {
97
- module.verbose('Storing instance of module', module);
98
- instance = module;
99
- $module
100
- .data(moduleNamespace, instance)
101
- ;
102
- },
84
+ module = {
103
85
 
104
- destroy: function() {
105
- module.verbose('Destroying previous module for', element);
106
- $module
107
- .removeData(moduleNamespace)
108
- .off(eventNamespace)
109
- ;
110
- },
86
+ initialize: function () {
87
+ if (!methodInvoked) {
88
+ originalData = settings.data;
89
+ module.bind.events();
90
+ }
91
+ module.instantiate();
92
+ },
93
+
94
+ instantiate: function () {
95
+ module.verbose('Storing instance of module', module);
96
+ instance = module;
97
+ $module
98
+ .data(moduleNamespace, instance)
99
+ ;
100
+ },
111
101
 
112
- bind: {
113
- events: function() {
114
- var
115
- triggerEvent = module.get.event()
116
- ;
117
- if( triggerEvent ) {
118
- module.verbose('Attaching API events to element', triggerEvent);
119
- $module
120
- .on(triggerEvent + eventNamespace, module.event.trigger)
121
- ;
122
- }
123
- else if(settings.on == 'now') {
124
- module.debug('Querying API endpoint immediately');
125
- module.query();
126
- }
127
- }
128
- },
102
+ destroy: function () {
103
+ module.verbose('Destroying previous module for', element);
104
+ $module
105
+ .removeData(moduleNamespace)
106
+ .off(eventNamespace)
107
+ ;
108
+ },
109
+
110
+ bind: {
111
+ events: function () {
112
+ var
113
+ triggerEvent = module.get.event()
114
+ ;
115
+ if (triggerEvent) {
116
+ module.verbose('Attaching API events to element', triggerEvent);
117
+ $module
118
+ .on(triggerEvent + eventNamespace, module.event.trigger)
119
+ ;
120
+ } else if (settings.on == 'now') {
121
+ module.debug('Querying API endpoint immediately');
122
+ module.query();
123
+ }
124
+ },
125
+ },
126
+
127
+ decode: {
128
+ json: function (response) {
129
+ if (response !== undefined && typeof response == 'string') {
130
+ try {
131
+ response = JSON.parse(response);
132
+ } catch (e) {
133
+ // isn't json string
134
+ }
135
+ }
136
+
137
+ return response;
138
+ },
139
+ },
140
+
141
+ read: {
142
+ cachedResponse: function (url) {
143
+ var
144
+ response
145
+ ;
146
+ if (window.Storage === undefined) {
147
+ module.error(error.noStorage);
148
+
149
+ return;
150
+ }
151
+ response = sessionStorage.getItem(url + module.get.normalizedData());
152
+ module.debug('Using cached response', url, settings.data, response);
153
+ response = module.decode.json(response);
154
+
155
+ return response;
156
+ },
157
+ },
158
+ write: {
159
+ cachedResponse: function (url, response) {
160
+ if (window.Storage === undefined) {
161
+ module.error(error.noStorage);
162
+
163
+ return;
164
+ }
165
+ if ($.isPlainObject(response)) {
166
+ response = JSON.stringify(response);
167
+ }
168
+ sessionStorage.setItem(url + module.get.normalizedData(), response);
169
+ module.verbose('Storing cached response for url', url, settings.data, response);
170
+ },
171
+ },
172
+
173
+ query: function () {
174
+ if (module.is.disabled()) {
175
+ module.debug('Element is disabled API request aborted');
176
+
177
+ return;
178
+ }
129
179
 
130
- decode: {
131
- json: function(response) {
132
- if(response !== undefined && typeof response == 'string') {
133
- try {
134
- response = JSON.parse(response);
135
- }
136
- catch(e) {
137
- // isn't json string
138
- }
139
- }
140
- return response;
141
- }
142
- },
180
+ if (module.is.loading()) {
181
+ if (settings.interruptRequests) {
182
+ module.debug('Interrupting previous request');
183
+ module.abort();
184
+ } else {
185
+ module.debug('Cancelling request, previous request is still pending');
143
186
 
144
- read: {
145
- cachedResponse: function(url) {
146
- var
147
- response
148
- ;
149
- if(window.Storage === undefined) {
150
- module.error(error.noStorage);
151
- return;
152
- }
153
- response = sessionStorage.getItem(url + module.get.normalizedData());
154
- module.debug('Using cached response', url, settings.data, response);
155
- response = module.decode.json(response);
156
- return response;
157
- }
158
- },
159
- write: {
160
- cachedResponse: function(url, response) {
161
- if(response && response === '') {
162
- module.debug('Response empty, not caching', response);
163
- return;
164
- }
165
- if(window.Storage === undefined) {
166
- module.error(error.noStorage);
167
- return;
168
- }
169
- if( $.isPlainObject(response) ) {
170
- response = JSON.stringify(response);
171
- }
172
- sessionStorage.setItem(url + module.get.normalizedData(), response);
173
- module.verbose('Storing cached response for url', url, settings.data, response);
174
- }
175
- },
187
+ return;
188
+ }
189
+ }
176
190
 
177
- query: function() {
191
+ // pass element metadata to url (value, text)
192
+ if (settings.defaultData) {
193
+ $.extend(true, settings.urlData, module.get.defaultData());
194
+ }
178
195
 
179
- if(module.is.disabled()) {
180
- module.debug('Element is disabled API request aborted');
181
- return;
182
- }
196
+ // Add form content
197
+ if (settings.serializeForm) {
198
+ settings.data = module.add.formData(originalData || settings.data);
199
+ }
183
200
 
184
- if(module.is.loading()) {
185
- if(settings.interruptRequests) {
186
- module.debug('Interrupting previous request');
187
- module.abort();
188
- }
189
- else {
190
- module.debug('Cancelling request, previous request is still pending');
191
- return;
192
- }
193
- }
194
-
195
- // pass element metadata to url (value, text)
196
- if(settings.defaultData) {
197
- $.extend(true, settings.urlData, module.get.defaultData());
198
- }
199
-
200
- // Add form content
201
- if(settings.serializeForm) {
202
- settings.data = module.add.formData(originalData || settings.data);
203
- }
204
-
205
- // call beforesend and get any settings changes
206
- requestSettings = module.get.settings();
207
-
208
- // check if before send cancelled request
209
- if(requestSettings === false) {
210
- module.cancelled = true;
211
- module.error(error.beforeSend);
212
- return;
213
- }
214
- else {
215
- module.cancelled = false;
216
- }
217
-
218
- // get url
219
- url = module.get.templatedURL();
220
-
221
- if(!url && !module.is.mocked()) {
222
- module.error(error.missingURL);
223
- return;
224
- }
225
-
226
- // replace variables
227
- url = module.add.urlData( url );
228
- // missing url parameters
229
- if( !url && !module.is.mocked()) {
230
- return;
231
- }
232
-
233
- requestSettings.url = settings.base + url;
234
-
235
- // look for jQuery ajax parameters in settings
236
- ajaxSettings = $.extend(true, {}, settings, {
237
- type : settings.method || settings.type,
238
- data : data,
239
- url : settings.base + url,
240
- beforeSend : settings.beforeXHR,
241
- success : function() {},
242
- failure : function() {},
243
- complete : function() {}
244
- });
245
-
246
- module.debug('Querying URL', ajaxSettings.url);
247
- module.verbose('Using AJAX settings', ajaxSettings);
248
- if(settings.cache === 'local' && module.read.cachedResponse(url)) {
249
- module.debug('Response returned from local cache');
250
- module.request = module.create.request();
251
- module.request.resolveWith(context, [ module.read.cachedResponse(url) ]);
252
- return;
253
- }
254
-
255
- if( !settings.throttle ) {
256
- module.debug('Sending request', data, ajaxSettings.method);
257
- module.send.request();
258
- }
259
- else {
260
- if(!settings.throttleFirstRequest && !module.timer) {
261
- module.debug('Sending request', data, ajaxSettings.method);
262
- module.send.request();
263
- module.timer = setTimeout(function(){}, settings.throttle);
264
- }
265
- else {
266
- module.debug('Throttling request', settings.throttle);
267
- clearTimeout(module.timer);
268
- module.timer = setTimeout(function() {
269
- if(module.timer) {
270
- delete module.timer;
271
- }
272
- module.debug('Sending throttled request', data, ajaxSettings.method);
273
- module.send.request();
274
- }, settings.throttle);
275
- }
276
- }
201
+ // call beforesend and get any settings changes
202
+ requestSettings = module.get.settings();
277
203
 
278
- },
204
+ // check if before send cancelled request
205
+ if (requestSettings === false) {
206
+ module.cancelled = true;
207
+ module.error(error.beforeSend);
279
208
 
280
- should: {
281
- removeError: function() {
282
- return ( settings.hideError === true || (settings.hideError === 'auto' && !module.is.form()) );
283
- }
284
- },
209
+ return;
210
+ } else {
211
+ module.cancelled = false;
212
+ }
285
213
 
286
- is: {
287
- disabled: function() {
288
- return ($module.filter(selector.disabled).length > 0);
289
- },
290
- expectingJSON: function() {
291
- return settings.dataType === 'json' || settings.dataType === 'jsonp';
292
- },
293
- form: function() {
294
- return $module.is('form') || $context.is('form');
295
- },
296
- mocked: function() {
297
- return (settings.mockResponse || settings.mockResponseAsync || settings.response || settings.responseAsync);
298
- },
299
- input: function() {
300
- return $module.is('input');
301
- },
302
- loading: function() {
303
- return (module.request)
304
- ? (module.request.state() == 'pending')
305
- : false
306
- ;
307
- },
308
- abortedRequest: function(xhr) {
309
- if(xhr && xhr.readyState !== undefined && xhr.readyState === 0) {
310
- module.verbose('XHR request determined to be aborted');
311
- return true;
312
- }
313
- else {
314
- module.verbose('XHR request was not aborted');
315
- return false;
316
- }
317
- },
318
- validResponse: function(response) {
319
- if( (!module.is.expectingJSON()) || !$.isFunction(settings.successTest) ) {
320
- module.verbose('Response is not JSON, skipping validation', settings.successTest, response);
321
- return true;
322
- }
323
- module.debug('Checking JSON returned success', settings.successTest, response);
324
- if( settings.successTest(response) ) {
325
- module.debug('Response passed success test', response);
326
- return true;
327
- }
328
- else {
329
- module.debug('Response failed success test', response);
330
- return false;
331
- }
332
- }
333
- },
214
+ // get url
215
+ url = module.get.templatedURL();
334
216
 
335
- was: {
336
- cancelled: function() {
337
- return (module.cancelled || false);
338
- },
339
- successful: function() {
340
- return (module.request && module.request.state() == 'resolved');
341
- },
342
- failure: function() {
343
- return (module.request && module.request.state() == 'rejected');
344
- },
345
- complete: function() {
346
- return (module.request && (module.request.state() == 'resolved' || module.request.state() == 'rejected') );
347
- }
348
- },
217
+ if (!url && !module.is.mocked()) {
218
+ module.error(error.missingURL);
349
219
 
350
- add: {
351
- urlData: function(url, urlData) {
352
- var
353
- requiredVariables,
354
- optionalVariables
355
- ;
356
- if(url) {
357
- requiredVariables = url.match(settings.regExp.required);
358
- optionalVariables = url.match(settings.regExp.optional);
359
- urlData = urlData || settings.urlData;
360
- if(requiredVariables) {
361
- module.debug('Looking for required URL variables', requiredVariables);
362
- $.each(requiredVariables, function(index, templatedString) {
363
- var
364
- // allow legacy {$var} style
365
- variable = (templatedString.indexOf('$') !== -1)
366
- ? templatedString.slice(2, -1)
367
- : templatedString.slice(1, -1),
368
- value = ($.isPlainObject(urlData) && urlData[variable] !== undefined)
369
- ? urlData[variable]
370
- : ($module.data(variable) !== undefined)
371
- ? $module.data(variable)
372
- : ($context.data(variable) !== undefined)
373
- ? $context.data(variable)
374
- : urlData[variable]
375
- ;
376
- // remove value
377
- if(value === undefined) {
378
- module.error(error.requiredParameter, variable, url);
379
- url = false;
380
- return false;
381
- }
382
- else {
383
- module.verbose('Found required variable', variable, value);
384
- value = (settings.encodeParameters)
385
- ? module.get.urlEncodedValue(value)
386
- : value
220
+ return;
221
+ }
222
+
223
+ // replace variables
224
+ url = module.add.urlData(url);
225
+ // missing url parameters
226
+ if (!url && !module.is.mocked()) {
227
+ return;
228
+ }
229
+
230
+ requestSettings.url = settings.base + url;
231
+
232
+ // look for jQuery ajax parameters in settings
233
+ ajaxSettings = $.extend(true, {}, settings, {
234
+ type: settings.method || settings.type,
235
+ data: data,
236
+ url: settings.base + url,
237
+ beforeSend: settings.beforeXHR,
238
+ success: function () {},
239
+ failure: function () {},
240
+ complete: function () {},
241
+ });
242
+
243
+ module.debug('Querying URL', ajaxSettings.url);
244
+ module.verbose('Using AJAX settings', ajaxSettings);
245
+ if (settings.cache === 'local' && module.read.cachedResponse(url)) {
246
+ module.debug('Response returned from local cache');
247
+ module.request = module.create.request();
248
+ module.request.resolveWith(context, [module.read.cachedResponse(url)]);
249
+
250
+ return;
251
+ }
252
+
253
+ if (!settings.throttle) {
254
+ module.debug('Sending request', data, ajaxSettings.method);
255
+ module.send.request();
256
+ } else {
257
+ if (!settings.throttleFirstRequest && !module.timer) {
258
+ module.debug('Sending request', data, ajaxSettings.method);
259
+ module.send.request();
260
+ module.timer = setTimeout(function () {}, settings.throttle);
261
+ } else {
262
+ module.debug('Throttling request', settings.throttle);
263
+ clearTimeout(module.timer);
264
+ module.timer = setTimeout(function () {
265
+ if (module.timer) {
266
+ delete module.timer;
267
+ }
268
+ module.debug('Sending throttled request', data, ajaxSettings.method);
269
+ module.send.request();
270
+ }, settings.throttle);
271
+ }
272
+ }
273
+ },
274
+
275
+ should: {
276
+ removeError: function () {
277
+ return (settings.hideError === true || (settings.hideError === 'auto' && !module.is.form()));
278
+ },
279
+ },
280
+
281
+ is: {
282
+ disabled: function () {
283
+ return ($module.filter(selector.disabled).length > 0);
284
+ },
285
+ expectingJSON: function () {
286
+ return settings.dataType === 'json' || settings.dataType === 'jsonp';
287
+ },
288
+ form: function () {
289
+ return $module.is('form') || $context.is('form');
290
+ },
291
+ mocked: function () {
292
+ return (settings.mockResponse || settings.mockResponseAsync || settings.response || settings.responseAsync);
293
+ },
294
+ input: function () {
295
+ return $module.is('input');
296
+ },
297
+ loading: function () {
298
+ return (module.request)
299
+ ? (module.request.state() == 'pending')
300
+ : false;
301
+ },
302
+ abortedRequest: function (xhr) {
303
+ if (xhr && xhr.readyState !== undefined && xhr.readyState === 0) {
304
+ module.verbose('XHR request determined to be aborted');
305
+
306
+ return true;
307
+ } else {
308
+ module.verbose('XHR request was not aborted');
309
+
310
+ return false;
311
+ }
312
+ },
313
+ validResponse: function (response) {
314
+ if ((!module.is.expectingJSON()) || !isFunction(settings.successTest)) {
315
+ module.verbose('Response is not JSON, skipping validation', settings.successTest, response);
316
+
317
+ return true;
318
+ }
319
+ module.debug('Checking JSON returned success', settings.successTest, response);
320
+ if (settings.successTest(response)) {
321
+ module.debug('Response passed success test', response);
322
+
323
+ return true;
324
+ } else {
325
+ module.debug('Response failed success test', response);
326
+
327
+ return false;
328
+ }
329
+ },
330
+ },
331
+
332
+ was: {
333
+ cancelled: function () {
334
+ return (module.cancelled || false);
335
+ },
336
+ successful: function () {
337
+ return (module.request && module.request.state() == 'resolved');
338
+ },
339
+ failure: function () {
340
+ return (module.request && module.request.state() == 'rejected');
341
+ },
342
+ complete: function () {
343
+ return (module.request && (module.request.state() == 'resolved' || module.request.state() == 'rejected'));
344
+ },
345
+ },
346
+
347
+ add: {
348
+ urlData: function (url, urlData) {
349
+ var
350
+ requiredVariables,
351
+ optionalVariables
352
+ ;
353
+ if (url) {
354
+ requiredVariables = url.match(settings.regExp.required);
355
+ optionalVariables = url.match(settings.regExp.optional);
356
+ urlData = urlData || settings.urlData;
357
+ if (requiredVariables) {
358
+ module.debug('Looking for required URL variables', requiredVariables);
359
+ $.each(requiredVariables, function (index, templatedString) {
360
+ var
361
+ // allow legacy {$var} style
362
+ variable = (templatedString.indexOf('$') !== -1)
363
+ ? templatedString.slice(2, -1)
364
+ : templatedString.slice(1, -1),
365
+ value = ($.isPlainObject(urlData) && urlData[variable] !== undefined)
366
+ ? urlData[variable]
367
+ : ($module.data(variable) !== undefined)
368
+ ? $module.data(variable)
369
+ : ($context.data(variable) !== undefined)
370
+ ? $context.data(variable)
371
+ : urlData[variable]
372
+ ;
373
+ // remove value
374
+ if (value === undefined) {
375
+ module.error(error.requiredParameter, variable, url);
376
+ url = false;
377
+
378
+ return false;
379
+ } else {
380
+ module.verbose('Found required variable', variable, value);
381
+ value = (settings.encodeParameters)
382
+ ? module.get.urlEncodedValue(value)
383
+ : value;
384
+ url = url.replace(templatedString, value);
385
+ }
386
+ });
387
+ }
388
+ if (optionalVariables) {
389
+ module.debug('Looking for optional URL variables', requiredVariables);
390
+ $.each(optionalVariables, function (index, templatedString) {
391
+ var
392
+ // allow legacy {/$var} style
393
+ variable = (templatedString.indexOf('$') !== -1)
394
+ ? templatedString.slice(3, -1)
395
+ : templatedString.slice(2, -1),
396
+ value = ($.isPlainObject(urlData) && urlData[variable] !== undefined)
397
+ ? urlData[variable]
398
+ : ($module.data(variable) !== undefined)
399
+ ? $module.data(variable)
400
+ : ($context.data(variable) !== undefined)
401
+ ? $context.data(variable)
402
+ : urlData[variable]
403
+ ;
404
+ // optional replacement
405
+ if (value !== undefined) {
406
+ module.verbose('Optional variable Found', variable, value);
407
+ url = url.replace(templatedString, value);
408
+ } else {
409
+ module.verbose('Optional variable not found', variable);
410
+ // remove preceding slash if set
411
+ if (url.indexOf('/' + templatedString) !== -1) {
412
+ url = url.replace('/' + templatedString, '');
413
+ } else {
414
+ url = url.replace(templatedString, '');
415
+ }
416
+ }
417
+ });
418
+ }
419
+ }
420
+
421
+ return url;
422
+ },
423
+ formData: function (data) {
424
+ var
425
+ formData = {},
426
+ hasOtherData,
427
+ useFormDataApi = settings.serializeForm === 'formdata'
428
+ ;
429
+ data = data || originalData || settings.data;
430
+ hasOtherData = $.isPlainObject(data);
431
+
432
+ if (useFormDataApi) {
433
+ formData = new FormData($form[0]);
434
+ settings.processData = typeof settings.processData !== 'undefined' ? settings.processData : false;
435
+ settings.contentType = typeof settings.contentType !== 'undefined' ? settings.contentType : false;
436
+ } else {
437
+ var
438
+ formArray = $form.serializeArray(),
439
+ pushes = {},
440
+ pushValues = {},
441
+ build = function (base, key, value) {
442
+ base[key] = value;
443
+
444
+ return base;
445
+ }
446
+ ;
447
+ // add files
448
+ $.each($('input[type="file"]', $form), function (i, tag) {
449
+ $.each($(tag)[0].files, function (j, file) {
450
+ formArray.push({ name: tag.name, value: file });
451
+ });
452
+ });
453
+ $.each(formArray, function (i, el) {
454
+ if (!settings.regExp.validate.test(el.name)) {
455
+ return;
456
+ }
457
+ var
458
+ isCheckbox = $('[name="' + el.name + '"]', $form).attr('type') === 'checkbox',
459
+ floatValue = parseFloat(el.value),
460
+ value = (isCheckbox && el.value === 'on')
461
+ || el.value === 'true'
462
+ || (String(floatValue) === el.value
463
+ ? floatValue
464
+ : (el.value === 'false' ? false : el.value)),
465
+ nameKeys = el.name.match(settings.regExp.key) || [],
466
+ k,
467
+ pushKey = el.name.replace(/\[\]$/, '')
468
+ ;
469
+ if (!(pushKey in pushes)) {
470
+ pushes[pushKey] = 0;
471
+ pushValues[pushKey] = value;
472
+ } else if (Array.isArray(pushValues[pushKey])) {
473
+ pushValues[pushKey].push(value);
474
+ } else {
475
+ pushValues[pushKey] = [pushValues[pushKey], value];
476
+ }
477
+ if (pushKey.indexOf('[]') === -1) {
478
+ value = pushValues[pushKey];
479
+ }
480
+
481
+ while ((k = nameKeys.pop()) !== undefined) {
482
+ if (k == '' && !Array.isArray(value)) { // foo[]
483
+ value = build([], pushes[pushKey]++, value);
484
+ } else if (settings.regExp.fixed.test(k)) { // foo[n]
485
+ value = build([], k, value);
486
+ } else if (settings.regExp.named.test(k)) { // foo; foo[bar]
487
+ value = build({}, k, value);
488
+ }
489
+ }
490
+ formData = $.extend(true, formData, value);
491
+ });
492
+ }
493
+
494
+ if (hasOtherData) {
495
+ module.debug('Extending existing data with form data', data, formData);
496
+ if (useFormDataApi) {
497
+ $.each(Object.keys(data), function (i, el) {
498
+ formData.append(el, data[el]);
499
+ });
500
+ data = formData;
501
+ } else {
502
+ data = $.extend(true, {}, data, formData);
503
+ }
504
+ } else {
505
+ module.debug('Adding form data', formData);
506
+ data = formData;
507
+ }
508
+
509
+ return data;
510
+ },
511
+ },
512
+
513
+ send: {
514
+ request: function () {
515
+ module.set.loading();
516
+ module.request = module.create.request();
517
+ if (module.is.mocked()) {
518
+ module.mockedXHR = module.create.mockedXHR();
519
+ } else {
520
+ module.xhr = module.create.xhr();
521
+ }
522
+ settings.onRequest.call(context, module.request, module.xhr);
523
+ },
524
+ },
525
+
526
+ event: {
527
+ trigger: function (event) {
528
+ module.query();
529
+ if (event.type == 'submit' || event.type == 'click') {
530
+ event.preventDefault();
531
+ }
532
+ },
533
+ xhr: {
534
+ always: function () {
535
+ // nothing special
536
+ },
537
+ done: function (response, textStatus, xhr) {
538
+ var
539
+ context = this,
540
+ elapsedTime = (new Date().getTime() - requestStartTime),
541
+ timeLeft = (settings.loadingDuration - elapsedTime),
542
+ translatedResponse = (isFunction(settings.onResponse))
543
+ ? module.is.expectingJSON() && !settings.rawResponse
544
+ ? settings.onResponse.call(context, $.extend(true, {}, response))
545
+ : settings.onResponse.call(context, response)
546
+ : false
547
+ ;
548
+ timeLeft = (timeLeft > 0)
549
+ ? timeLeft
550
+ : 0;
551
+ if (translatedResponse) {
552
+ module.debug('Modified API response in onResponse callback', settings.onResponse, translatedResponse, response);
553
+ response = translatedResponse;
554
+ }
555
+ if (timeLeft > 0) {
556
+ module.debug('Response completed early delaying state change by', timeLeft);
557
+ }
558
+ setTimeout(function () {
559
+ if (module.is.validResponse(response)) {
560
+ module.request.resolveWith(context, [response, xhr]);
561
+ } else {
562
+ module.request.rejectWith(context, [xhr, 'invalid']);
563
+ }
564
+ }, timeLeft);
565
+ },
566
+ fail: function (xhr, status, httpMessage) {
567
+ var
568
+ context = this,
569
+ elapsedTime = (new Date().getTime() - requestStartTime),
570
+ timeLeft = (settings.loadingDuration - elapsedTime)
571
+ ;
572
+ timeLeft = (timeLeft > 0)
573
+ ? timeLeft
574
+ : 0;
575
+ if (timeLeft > 0) {
576
+ module.debug('Response completed early delaying state change by', timeLeft);
577
+ }
578
+ setTimeout(function () {
579
+ if (module.is.abortedRequest(xhr)) {
580
+ module.request.rejectWith(context, [xhr, 'aborted', httpMessage]);
581
+ } else {
582
+ module.request.rejectWith(context, [xhr, 'error', status, httpMessage]);
583
+ }
584
+ }, timeLeft);
585
+ },
586
+ },
587
+ request: {
588
+ done: function (response, xhr) {
589
+ module.debug('Successful API Response', response);
590
+ if (settings.cache === 'local' && url) {
591
+ module.write.cachedResponse(url, response);
592
+ module.debug('Saving server response locally', module.cache);
593
+ }
594
+ settings.onSuccess.call(context, response, $module, xhr);
595
+ },
596
+ complete: function (firstParameter, secondParameter) {
597
+ var
598
+ xhr,
599
+ response
600
+ ;
601
+ // have to guess callback parameters based on request success
602
+ if (module.was.successful()) {
603
+ response = firstParameter;
604
+ xhr = secondParameter;
605
+ } else {
606
+ xhr = firstParameter;
607
+ response = module.get.responseFromXHR(xhr);
608
+ }
609
+ module.remove.loading();
610
+ settings.onComplete.call(context, response, $module, xhr);
611
+ },
612
+ fail: function (xhr, status, httpMessage) {
613
+ var
614
+ // pull response from xhr if available
615
+ response = module.get.responseFromXHR(xhr),
616
+ errorMessage = module.get.errorFromRequest(response, status, httpMessage)
617
+ ;
618
+ if (status == 'aborted') {
619
+ module.debug('XHR Aborted (Most likely caused by page navigation or CORS Policy)', status, httpMessage);
620
+ settings.onAbort.call(context, status, $module, xhr);
621
+
622
+ return true;
623
+ } else if (status == 'invalid') {
624
+ module.debug('JSON did not pass success test. A server-side error has most likely occurred', response);
625
+ } else if (status == 'error') {
626
+ if (xhr !== undefined) {
627
+ module.debug('XHR produced a server error', status, httpMessage);
628
+ // make sure we have an error to display to console
629
+ if ((xhr.status < 200 || xhr.status >= 300) && httpMessage !== undefined && httpMessage !== '') {
630
+ module.error(error.statusMessage + httpMessage, ajaxSettings.url);
631
+ }
632
+ settings.onError.call(context, errorMessage, $module, xhr);
633
+ }
634
+ }
635
+
636
+ if (settings.errorDuration && status !== 'aborted') {
637
+ module.debug('Adding error state');
638
+ module.set.error();
639
+ if (module.should.removeError()) {
640
+ setTimeout(module.remove.error, settings.errorDuration);
641
+ }
642
+ }
643
+ module.debug('API Request failed', errorMessage, xhr);
644
+ settings.onFailure.call(context, response, $module, xhr);
645
+ },
646
+ },
647
+ },
648
+
649
+ create: {
650
+
651
+ request: function () {
652
+ // api request promise
653
+ return $.Deferred()
654
+ .always(module.event.request.complete)
655
+ .done(module.event.request.done)
656
+ .fail(module.event.request.fail)
657
+ ;
658
+ },
659
+
660
+ mockedXHR: function () {
661
+ var
662
+ // xhr does not simulate these properties of xhr but must return them
663
+ textStatus = false,
664
+ status = false,
665
+ httpMessage = false,
666
+ responder = settings.mockResponse || settings.response,
667
+ asyncResponder = settings.mockResponseAsync || settings.responseAsync,
668
+ asyncCallback,
669
+ response,
670
+ mockedXHR
671
+ ;
672
+
673
+ mockedXHR = $.Deferred()
674
+ .always(module.event.xhr.complete)
675
+ .done(module.event.xhr.done)
676
+ .fail(module.event.xhr.fail)
677
+ ;
678
+
679
+ if (responder) {
680
+ if (isFunction(responder)) {
681
+ module.debug('Using specified synchronous callback', responder);
682
+ response = responder.call(context, requestSettings);
683
+ } else {
684
+ module.debug('Using settings specified response', responder);
685
+ response = responder;
686
+ }
687
+ // simulating response
688
+ mockedXHR.resolveWith(context, [response, textStatus, { responseText: response }]);
689
+ } else if (isFunction(asyncResponder)) {
690
+ asyncCallback = function (response) {
691
+ module.debug('Async callback returned response', response);
692
+
693
+ if (response) {
694
+ mockedXHR.resolveWith(context, [response, textStatus, { responseText: response }]);
695
+ } else {
696
+ mockedXHR.rejectWith(context, [{ responseText: response }, status, httpMessage]);
697
+ }
698
+ };
699
+ module.debug('Using specified async response callback', asyncResponder);
700
+ asyncResponder.call(context, requestSettings, asyncCallback);
701
+ }
702
+
703
+ return mockedXHR;
704
+ },
705
+
706
+ xhr: function () {
707
+ var
708
+ xhr
709
+ ;
710
+ // ajax request promise
711
+ xhr = $.ajax(ajaxSettings)
712
+ .always(module.event.xhr.always)
713
+ .done(module.event.xhr.done)
714
+ .fail(module.event.xhr.fail)
715
+ ;
716
+ module.verbose('Created server request', xhr, ajaxSettings);
717
+
718
+ return xhr;
719
+ },
720
+ },
721
+
722
+ set: {
723
+ error: function () {
724
+ module.verbose('Adding error state to element', $context);
725
+ $context.addClass(className.error);
726
+ },
727
+ loading: function () {
728
+ module.verbose('Adding loading state to element', $context);
729
+ $context.addClass(className.loading);
730
+ requestStartTime = new Date().getTime();
731
+ },
732
+ },
733
+
734
+ remove: {
735
+ error: function () {
736
+ module.verbose('Removing error state from element', $context);
737
+ $context.removeClass(className.error);
738
+ },
739
+ loading: function () {
740
+ module.verbose('Removing loading state from element', $context);
741
+ $context.removeClass(className.loading);
742
+ },
743
+ },
744
+
745
+ get: {
746
+ normalizedData: function () {
747
+ return typeof settings.data === 'string' ? settings.data : JSON.stringify(settings.data, Object.keys(settings.data).sort());
748
+ },
749
+ responseFromXHR: function (xhr) {
750
+ return $.isPlainObject(xhr)
751
+ ? (module.is.expectingJSON())
752
+ ? module.decode.json(xhr.responseText)
753
+ : xhr.responseText
754
+ : false;
755
+ },
756
+ errorFromRequest: function (response, status, httpMessage) {
757
+ return ($.isPlainObject(response) && response.error !== undefined)
758
+ ? response.error // use json error message
759
+ : (settings.error[status] !== undefined) // use server error message
760
+ ? settings.error[status]
761
+ : httpMessage;
762
+ },
763
+ request: function () {
764
+ return module.request || false;
765
+ },
766
+ xhr: function () {
767
+ return module.xhr || false;
768
+ },
769
+ settings: function () {
770
+ var
771
+ runSettings
772
+ ;
773
+ runSettings = settings.beforeSend.call($module, settings);
774
+ if (runSettings) {
775
+ if (runSettings.success !== undefined) {
776
+ module.debug('Legacy success callback detected', runSettings);
777
+ module.error(error.legacyParameters, runSettings.success);
778
+ runSettings.onSuccess = runSettings.success;
779
+ }
780
+ if (runSettings.failure !== undefined) {
781
+ module.debug('Legacy failure callback detected', runSettings);
782
+ module.error(error.legacyParameters, runSettings.failure);
783
+ runSettings.onFailure = runSettings.failure;
784
+ }
785
+ if (runSettings.complete !== undefined) {
786
+ module.debug('Legacy complete callback detected', runSettings);
787
+ module.error(error.legacyParameters, runSettings.complete);
788
+ runSettings.onComplete = runSettings.complete;
789
+ }
790
+ }
791
+ if (runSettings === undefined) {
792
+ module.error(error.noReturnedValue);
793
+ }
794
+ if (runSettings === false) {
795
+ return runSettings;
796
+ }
797
+
798
+ return (runSettings !== undefined)
799
+ ? $.extend(true, {}, runSettings)
800
+ : $.extend(true, {}, settings);
801
+ },
802
+ urlEncodedValue: function (value) {
803
+ var
804
+ decodedValue = window.decodeURIComponent(value),
805
+ encodedValue = window.encodeURIComponent(value),
806
+ alreadyEncoded = (decodedValue !== value)
807
+ ;
808
+ if (alreadyEncoded) {
809
+ module.debug('URL value is already encoded, avoiding double encoding', value);
810
+
811
+ return value;
812
+ }
813
+ module.verbose('Encoding value using encodeURIComponent', value, encodedValue);
814
+
815
+ return encodedValue;
816
+ },
817
+ defaultData: function () {
818
+ var
819
+ data = {}
820
+ ;
821
+ if (!isWindow(element)) {
822
+ if (module.is.input()) {
823
+ data.value = $module.val();
824
+ } else if (module.is.form()) {
825
+
826
+ } else {
827
+ data.text = $module.text();
828
+ }
829
+ }
830
+
831
+ return data;
832
+ },
833
+ event: function () {
834
+ if (isWindow(element) || settings.on == 'now') {
835
+ module.debug('API called without element, no events attached');
836
+
837
+ return false;
838
+ } else if (settings.on == 'auto') {
839
+ if ($module.is('input')) {
840
+ return (element.oninput !== undefined)
841
+ ? 'input'
842
+ : (element.onpropertychange !== undefined)
843
+ ? 'propertychange'
844
+ : 'keyup';
845
+ } else if ($module.is('form')) {
846
+ return 'submit';
847
+ } else {
848
+ return 'click';
849
+ }
850
+ } else {
851
+ return settings.on;
852
+ }
853
+ },
854
+ templatedURL: function (action) {
855
+ action = action || $module.data(metadata.action) || settings.action || false;
856
+ url = $module.data(metadata.url) || settings.url || false;
857
+ if (url) {
858
+ module.debug('Using specified url', url);
859
+
860
+ return url;
861
+ }
862
+ if (action) {
863
+ module.debug('Looking up url for action', action, settings.api);
864
+ if (settings.api[action] === undefined && !module.is.mocked()) {
865
+ module.error(error.missingAction, settings.action, settings.api);
866
+
867
+ return;
868
+ }
869
+ url = settings.api[action];
870
+ } else if (module.is.form()) {
871
+ url = $module.attr('action') || $context.attr('action') || false;
872
+ module.debug('No url or action specified, defaulting to form action', url);
873
+ }
874
+
875
+ return url;
876
+ },
877
+ },
878
+
879
+ abort: function () {
880
+ var
881
+ xhr = module.get.xhr()
387
882
  ;
388
- url = url.replace(templatedString, value);
389
- }
390
- });
391
- }
392
- if(optionalVariables) {
393
- module.debug('Looking for optional URL variables', requiredVariables);
394
- $.each(optionalVariables, function(index, templatedString) {
395
- var
396
- // allow legacy {/$var} style
397
- variable = (templatedString.indexOf('$') !== -1)
398
- ? templatedString.slice(3, -1)
399
- : templatedString.slice(2, -1),
400
- value = ($.isPlainObject(urlData) && urlData[variable] !== undefined)
401
- ? urlData[variable]
402
- : ($module.data(variable) !== undefined)
403
- ? $module.data(variable)
404
- : ($context.data(variable) !== undefined)
405
- ? $context.data(variable)
406
- : urlData[variable]
407
- ;
408
- // optional replacement
409
- if(value !== undefined) {
410
- module.verbose('Optional variable Found', variable, value);
411
- url = url.replace(templatedString, value);
412
- }
413
- else {
414
- module.verbose('Optional variable not found', variable);
415
- // remove preceding slash if set
416
- if(url.indexOf('/' + templatedString) !== -1) {
417
- url = url.replace('/' + templatedString, '');
883
+ if (xhr && xhr.state() !== 'resolved') {
884
+ module.debug('Cancelling API request');
885
+ xhr.abort();
418
886
  }
419
- else {
420
- url = url.replace(templatedString, '');
887
+ },
888
+
889
+ // reset state
890
+ reset: function () {
891
+ module.remove.error();
892
+ module.remove.loading();
893
+ },
894
+
895
+ setting: function (name, value) {
896
+ module.debug('Changing setting', name, value);
897
+ if ($.isPlainObject(name)) {
898
+ $.extend(true, settings, name);
899
+ } else if (value !== undefined) {
900
+ if ($.isPlainObject(settings[name])) {
901
+ $.extend(true, settings[name], value);
902
+ } else {
903
+ settings[name] = value;
904
+ }
905
+ } else {
906
+ return settings[name];
907
+ }
908
+ },
909
+ internal: function (name, value) {
910
+ if ($.isPlainObject(name)) {
911
+ $.extend(true, module, name);
912
+ } else if (value !== undefined) {
913
+ module[name] = value;
914
+ } else {
915
+ return module[name];
916
+ }
917
+ },
918
+ debug: function () {
919
+ if (!settings.silent && settings.debug) {
920
+ if (settings.performance) {
921
+ module.performance.log(arguments);
922
+ } else {
923
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
924
+ module.debug.apply(console, arguments);
925
+ }
926
+ }
927
+ },
928
+ verbose: function () {
929
+ if (!settings.silent && settings.verbose && settings.debug) {
930
+ if (settings.performance) {
931
+ module.performance.log(arguments);
932
+ } else {
933
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
934
+ module.verbose.apply(console, arguments);
935
+ }
936
+ }
937
+ },
938
+ error: function () {
939
+ if (!settings.silent) {
940
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
941
+ module.error.apply(console, arguments);
942
+ }
943
+ },
944
+ performance: {
945
+ log: function (message) {
946
+ var
947
+ currentTime,
948
+ executionTime,
949
+ previousTime
950
+ ;
951
+ if (settings.performance) {
952
+ currentTime = new Date().getTime();
953
+ previousTime = time || currentTime;
954
+ executionTime = currentTime - previousTime;
955
+ time = currentTime;
956
+ performance.push({
957
+ Name: message[0],
958
+ Arguments: [].slice.call(message, 1) || '',
959
+ // 'Element' : element,
960
+ 'Execution Time': executionTime,
961
+ });
962
+ }
963
+ clearTimeout(module.performance.timer);
964
+ module.performance.timer = setTimeout(module.performance.display, 500);
965
+ },
966
+ display: function () {
967
+ var
968
+ title = settings.name + ':',
969
+ totalTime = 0
970
+ ;
971
+ time = false;
972
+ clearTimeout(module.performance.timer);
973
+ $.each(performance, function (index, data) {
974
+ totalTime += data['Execution Time'];
975
+ });
976
+ title += ' ' + totalTime + 'ms';
977
+ if (moduleSelector) {
978
+ title += ' \'' + moduleSelector + '\'';
979
+ }
980
+ if ((console.group !== undefined || console.table !== undefined) && performance.length > 0) {
981
+ console.groupCollapsed(title);
982
+ if (console.table) {
983
+ console.table(performance);
984
+ } else {
985
+ $.each(performance, function (index, data) {
986
+ console.log(data.Name + ': ' + data['Execution Time'] + 'ms');
987
+ });
988
+ }
989
+ console.groupEnd();
990
+ }
991
+ performance = [];
992
+ },
993
+ },
994
+ invoke: function (query, passedArguments, context) {
995
+ var
996
+ object = instance,
997
+ maxDepth,
998
+ found,
999
+ response
1000
+ ;
1001
+ passedArguments = passedArguments || queryArguments;
1002
+ context = context || element;
1003
+ if (typeof query == 'string' && object !== undefined) {
1004
+ query = query.split(/[\. ]/);
1005
+ maxDepth = query.length - 1;
1006
+ $.each(query, function (depth, value) {
1007
+ var camelCaseValue = (depth != maxDepth)
1008
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
1009
+ : query
1010
+ ;
1011
+ if ($.isPlainObject(object[camelCaseValue]) && (depth != maxDepth)) {
1012
+ object = object[camelCaseValue];
1013
+ } else if (object[camelCaseValue] !== undefined) {
1014
+ found = object[camelCaseValue];
1015
+
1016
+ return false;
1017
+ } else if ($.isPlainObject(object[value]) && (depth != maxDepth)) {
1018
+ object = object[value];
1019
+ } else if (object[value] !== undefined) {
1020
+ found = object[value];
1021
+
1022
+ return false;
1023
+ } else {
1024
+ module.error(error.method, query);
1025
+
1026
+ return false;
1027
+ }
1028
+ });
1029
+ }
1030
+ if (isFunction(found)) {
1031
+ response = found.apply(context, passedArguments);
1032
+ } else if (found !== undefined) {
1033
+ response = found;
1034
+ }
1035
+ if (Array.isArray(returnedValue)) {
1036
+ returnedValue.push(response);
1037
+ } else if (returnedValue !== undefined) {
1038
+ returnedValue = [returnedValue, response];
1039
+ } else if (response !== undefined) {
1040
+ returnedValue = response;
421
1041
  }
422
- }
423
- });
424
- }
425
- }
426
- return url;
427
- },
428
- formData: function(data) {
429
- var
430
- formData = {},
431
- hasOtherData,
432
- useFormDataApi = settings.serializeForm === 'formdata'
433
- ;
434
- data = data || originalData || settings.data;
435
- hasOtherData = $.isPlainObject(data);
436
1042
 
437
- if (useFormDataApi) {
438
- formData = new FormData($form[0]);
439
- settings.processData = typeof settings.processData !== 'undefined' ? settings.processData : false;
440
- settings.contentType = typeof settings.contentType !== 'undefined' ? settings.contentType : false;
441
- } else {
442
- var formArray = $form.serializeArray(),
443
- pushes = {},
444
- pushValues= {},
445
- build = function(base, key, value) {
446
- base[key] = value;
447
- return base;
448
- }
449
- ;
450
- // add files
451
- $.each($('input[type="file"]',$form), function(i, tag) {
452
- $.each($(tag)[0].files, function(j, file) {
453
- formArray.push({name:tag.name, value: file});
454
- });
455
- });
456
- $.each(formArray, function(i, el) {
457
- if (!settings.regExp.validate.test(el.name)) return;
458
- var isCheckbox = $('[name="' + el.name + '"]', $form).attr('type') === 'checkbox',
459
- floatValue = parseFloat(el.value),
460
- value = (isCheckbox && el.value === 'on') || el.value === 'true' || (String(floatValue) === el.value ? floatValue : (el.value === 'false' ? false : el.value)),
461
- nameKeys = el.name.match(settings.regExp.key) || [], k, pushKey= el.name.replace(/\[\]$/,'')
462
- ;
463
- if(!(pushKey in pushes)) {
464
- pushes[pushKey] = 0;
465
- pushValues[pushKey] = value;
466
- } else if (Array.isArray(pushValues[pushKey])) {
467
- pushValues[pushKey].push(value);
468
- } else {
469
- pushValues[pushKey] = [pushValues[pushKey] , value];
1043
+ return found;
1044
+ },
1045
+ };
1046
+
1047
+ if (methodInvoked) {
1048
+ if (instance === undefined) {
1049
+ module.initialize();
470
1050
  }
471
- value = pushValues[pushKey];
472
-
473
- while ((k = nameKeys.pop()) !== undefined) {
474
- // foo[]
475
- if (k == '' && !Array.isArray(value)){
476
- value = build([], pushes[pushKey]++, value);
477
- }
478
- // foo[n]
479
- else if (settings.regExp.fixed.test(k)) {
480
- value = build([], k, value);
481
- }
482
- // foo; foo[bar]
483
- else if (settings.regExp.named.test(k)) {
484
- value = build({}, k, value);
485
- }
1051
+ module.invoke(query);
1052
+ } else {
1053
+ if (instance !== undefined) {
1054
+ instance.invoke('destroy');
486
1055
  }
487
- formData = $.extend(true, formData, value);
488
- });
1056
+ module.initialize();
489
1057
  }
1058
+ });
490
1059
 
491
- if(hasOtherData) {
492
- module.debug('Extending existing data with form data', data, formData);
493
- if(useFormDataApi) {
494
- $.each(Object.keys(data),function(i, el){
495
- formData.append(el, data[el]);
496
- });
497
- data = formData;
498
- } else {
499
- data = $.extend(true, {}, data, formData);
500
- }
501
- }
502
- else {
503
- module.debug('Adding form data', formData);
504
- data = formData;
505
- }
506
- return data;
507
- }
508
- },
1060
+ return (returnedValue !== undefined)
1061
+ ? returnedValue
1062
+ : this;
1063
+ };
509
1064
 
510
- send: {
511
- request: function() {
512
- module.set.loading();
513
- module.request = module.create.request();
514
- if( module.is.mocked() ) {
515
- module.mockedXHR = module.create.mockedXHR();
516
- }
517
- else {
518
- module.xhr = module.create.xhr();
519
- }
520
- settings.onRequest.call(context, module.request, module.xhr);
521
- }
522
- },
1065
+ $.api.settings = {
523
1066
 
524
- event: {
525
- trigger: function(event) {
526
- module.query();
527
- if(event.type == 'submit' || event.type == 'click') {
528
- event.preventDefault();
529
- }
530
- },
531
- xhr: {
532
- always: function() {
533
- // nothing special
534
- },
535
- done: function(response, textStatus, xhr) {
536
- var
537
- context = this,
538
- elapsedTime = (new Date().getTime() - requestStartTime),
539
- timeLeft = (settings.loadingDuration - elapsedTime),
540
- translatedResponse = ( $.isFunction(settings.onResponse) )
541
- ? module.is.expectingJSON() && !settings.rawResponse
542
- ? settings.onResponse.call(context, $.extend(true, {}, response))
543
- : settings.onResponse.call(context, response)
544
- : false
545
- ;
546
- timeLeft = (timeLeft > 0)
547
- ? timeLeft
548
- : 0
549
- ;
550
- if(translatedResponse) {
551
- module.debug('Modified API response in onResponse callback', settings.onResponse, translatedResponse, response);
552
- response = translatedResponse;
553
- }
554
- if(timeLeft > 0) {
555
- module.debug('Response completed early delaying state change by', timeLeft);
556
- }
557
- setTimeout(function() {
558
- if( module.is.validResponse(response) ) {
559
- module.request.resolveWith(context, [response, xhr]);
560
- }
561
- else {
562
- module.request.rejectWith(context, [xhr, 'invalid']);
563
- }
564
- }, timeLeft);
565
- },
566
- fail: function(xhr, status, httpMessage) {
567
- var
568
- context = this,
569
- elapsedTime = (new Date().getTime() - requestStartTime),
570
- timeLeft = (settings.loadingDuration - elapsedTime)
571
- ;
572
- timeLeft = (timeLeft > 0)
573
- ? timeLeft
574
- : 0
575
- ;
576
- if(timeLeft > 0) {
577
- module.debug('Response completed early delaying state change by', timeLeft);
578
- }
579
- setTimeout(function() {
580
- if( module.is.abortedRequest(xhr) ) {
581
- module.request.rejectWith(context, [xhr, 'aborted', httpMessage]);
582
- }
583
- else {
584
- module.request.rejectWith(context, [xhr, 'error', status, httpMessage]);
585
- }
586
- }, timeLeft);
587
- }
588
- },
589
- request: {
590
- done: function(response, xhr) {
591
- module.debug('Successful API Response', response);
592
- if(settings.cache === 'local' && url) {
593
- module.write.cachedResponse(url, response);
594
- module.debug('Saving server response locally', module.cache);
595
- }
596
- settings.onSuccess.call(context, response, $module, xhr);
597
- },
598
- complete: function(firstParameter, secondParameter) {
599
- var
600
- xhr,
601
- response
602
- ;
603
- // have to guess callback parameters based on request success
604
- if( module.was.successful() ) {
605
- response = firstParameter;
606
- xhr = secondParameter;
607
- }
608
- else {
609
- xhr = firstParameter;
610
- response = module.get.responseFromXHR(xhr);
611
- }
612
- module.remove.loading();
613
- settings.onComplete.call(context, response, $module, xhr);
614
- },
615
- fail: function(xhr, status, httpMessage) {
616
- var
617
- // pull response from xhr if available
618
- response = module.get.responseFromXHR(xhr),
619
- errorMessage = module.get.errorFromRequest(response, status, httpMessage)
620
- ;
621
- if(status == 'aborted') {
622
- module.debug('XHR Aborted (Most likely caused by page navigation or CORS Policy)', status, httpMessage);
623
- settings.onAbort.call(context, status, $module, xhr);
624
- return true;
625
- }
626
- else if(status == 'invalid') {
627
- module.debug('JSON did not pass success test. A server-side error has most likely occurred', response);
628
- }
629
- else if(status == 'error') {
630
- if(xhr !== undefined) {
631
- module.debug('XHR produced a server error', status, httpMessage);
632
- // make sure we have an error to display to console
633
- if( (xhr.status < 200 || xhr.status >= 300) && httpMessage !== undefined && httpMessage !== '') {
634
- module.error(error.statusMessage + httpMessage, ajaxSettings.url);
635
- }
636
- settings.onError.call(context, errorMessage, $module, xhr);
637
- }
638
- }
1067
+ name: 'API',
1068
+ namespace: 'api',
639
1069
 
640
- if(settings.errorDuration && status !== 'aborted') {
641
- module.debug('Adding error state');
642
- module.set.error();
643
- if( module.should.removeError() ) {
644
- setTimeout(module.remove.error, settings.errorDuration);
645
- }
646
- }
647
- module.debug('API Request failed', errorMessage, xhr);
648
- settings.onFailure.call(context, response, $module, xhr);
649
- }
650
- }
651
- },
1070
+ debug: false,
1071
+ verbose: false,
1072
+ performance: true,
652
1073
 
653
- create: {
1074
+ // object containing all templates endpoints
1075
+ api: {},
654
1076
 
655
- request: function() {
656
- // api request promise
657
- return $.Deferred()
658
- .always(module.event.request.complete)
659
- .done(module.event.request.done)
660
- .fail(module.event.request.fail)
661
- ;
662
- },
1077
+ // whether to cache responses
1078
+ cache: true,
663
1079
 
664
- mockedXHR: function () {
665
- var
666
- // xhr does not simulate these properties of xhr but must return them
667
- textStatus = false,
668
- status = false,
669
- httpMessage = false,
670
- responder = settings.mockResponse || settings.response,
671
- asyncResponder = settings.mockResponseAsync || settings.responseAsync,
672
- asyncCallback,
673
- response,
674
- mockedXHR
675
- ;
1080
+ // whether new requests should abort previous requests
1081
+ interruptRequests: true,
676
1082
 
677
- mockedXHR = $.Deferred()
678
- .always(module.event.xhr.complete)
679
- .done(module.event.xhr.done)
680
- .fail(module.event.xhr.fail)
681
- ;
1083
+ // event binding
1084
+ on: 'auto',
682
1085
 
683
- if(responder) {
684
- if( $.isFunction(responder) ) {
685
- module.debug('Using specified synchronous callback', responder);
686
- response = responder.call(context, requestSettings);
687
- }
688
- else {
689
- module.debug('Using settings specified response', responder);
690
- response = responder;
691
- }
692
- // simulating response
693
- mockedXHR.resolveWith(context, [ response, textStatus, { responseText: response }]);
694
- }
695
- else if( $.isFunction(asyncResponder) ) {
696
- asyncCallback = function(response) {
697
- module.debug('Async callback returned response', response);
1086
+ // context for applying state classes
1087
+ stateContext: false,
698
1088
 
699
- if(response) {
700
- mockedXHR.resolveWith(context, [ response, textStatus, { responseText: response }]);
701
- }
702
- else {
703
- mockedXHR.rejectWith(context, [{ responseText: response }, status, httpMessage]);
704
- }
705
- };
706
- module.debug('Using specified async response callback', asyncResponder);
707
- asyncResponder.call(context, requestSettings, asyncCallback);
708
- }
709
- return mockedXHR;
710
- },
1089
+ // duration for loading state
1090
+ loadingDuration: 0,
711
1091
 
712
- xhr: function() {
713
- var
714
- xhr
715
- ;
716
- // ajax request promise
717
- xhr = $.ajax(ajaxSettings)
718
- .always(module.event.xhr.always)
719
- .done(module.event.xhr.done)
720
- .fail(module.event.xhr.fail)
721
- ;
722
- module.verbose('Created server request', xhr, ajaxSettings);
723
- return xhr;
724
- }
725
- },
1092
+ // whether to hide errors after a period of time
1093
+ hideError: 'auto',
726
1094
 
727
- set: {
728
- error: function() {
729
- module.verbose('Adding error state to element', $context);
730
- $context.addClass(className.error);
731
- },
732
- loading: function() {
733
- module.verbose('Adding loading state to element', $context);
734
- $context.addClass(className.loading);
735
- requestStartTime = new Date().getTime();
736
- }
737
- },
1095
+ // duration for error state
1096
+ errorDuration: 2000,
738
1097
 
739
- remove: {
740
- error: function() {
741
- module.verbose('Removing error state from element', $context);
742
- $context.removeClass(className.error);
743
- },
744
- loading: function() {
745
- module.verbose('Removing loading state from element', $context);
746
- $context.removeClass(className.loading);
747
- }
748
- },
1098
+ // whether parameters should be encoded with encodeURIComponent
1099
+ encodeParameters: true,
749
1100
 
750
- get: {
751
- normalizedData: function(){
752
- return typeof settings.data === "string" ? settings.data : JSON.stringify(settings.data, Object.keys(settings.data).sort());
753
- },
754
- responseFromXHR: function(xhr) {
755
- return $.isPlainObject(xhr)
756
- ? (module.is.expectingJSON())
757
- ? module.decode.json(xhr.responseText)
758
- : xhr.responseText
759
- : false
760
- ;
761
- },
762
- errorFromRequest: function(response, status, httpMessage) {
763
- return ($.isPlainObject(response) && response.error !== undefined)
764
- ? response.error // use json error message
765
- : (settings.error[status] !== undefined) // use server error message
766
- ? settings.error[status]
767
- : httpMessage
768
- ;
769
- },
770
- request: function() {
771
- return module.request || false;
772
- },
773
- xhr: function() {
774
- return module.xhr || false;
775
- },
776
- settings: function() {
777
- var
778
- runSettings
779
- ;
780
- runSettings = settings.beforeSend.call($module, settings);
781
- if(runSettings) {
782
- if(runSettings.success !== undefined) {
783
- module.debug('Legacy success callback detected', runSettings);
784
- module.error(error.legacyParameters, runSettings.success);
785
- runSettings.onSuccess = runSettings.success;
786
- }
787
- if(runSettings.failure !== undefined) {
788
- module.debug('Legacy failure callback detected', runSettings);
789
- module.error(error.legacyParameters, runSettings.failure);
790
- runSettings.onFailure = runSettings.failure;
791
- }
792
- if(runSettings.complete !== undefined) {
793
- module.debug('Legacy complete callback detected', runSettings);
794
- module.error(error.legacyParameters, runSettings.complete);
795
- runSettings.onComplete = runSettings.complete;
796
- }
797
- }
798
- if(runSettings === undefined) {
799
- module.error(error.noReturnedValue);
800
- }
801
- if(runSettings === false) {
802
- return runSettings;
803
- }
804
- return (runSettings !== undefined)
805
- ? $.extend(true, {}, runSettings)
806
- : $.extend(true, {}, settings)
807
- ;
808
- },
809
- urlEncodedValue: function(value) {
810
- var
811
- decodedValue = window.decodeURIComponent(value),
812
- encodedValue = window.encodeURIComponent(value),
813
- alreadyEncoded = (decodedValue !== value)
814
- ;
815
- if(alreadyEncoded) {
816
- module.debug('URL value is already encoded, avoiding double encoding', value);
817
- return value;
818
- }
819
- module.verbose('Encoding value using encodeURIComponent', value, encodedValue);
820
- return encodedValue;
821
- },
822
- defaultData: function() {
823
- var
824
- data = {}
825
- ;
826
- if( !$.isWindow(element) ) {
827
- if( module.is.input() ) {
828
- data.value = $module.val();
829
- }
830
- else if( module.is.form() ) {
831
-
832
- }
833
- else {
834
- data.text = $module.text();
835
- }
836
- }
837
- return data;
838
- },
839
- event: function() {
840
- if( $.isWindow(element) || settings.on == 'now' ) {
841
- module.debug('API called without element, no events attached');
842
- return false;
843
- }
844
- else if(settings.on == 'auto') {
845
- if( $module.is('input') ) {
846
- return (element.oninput !== undefined)
847
- ? 'input'
848
- : (element.onpropertychange !== undefined)
849
- ? 'propertychange'
850
- : 'keyup'
851
- ;
852
- }
853
- else if( $module.is('form') ) {
854
- return 'submit';
855
- }
856
- else {
857
- return 'click';
858
- }
859
- }
860
- else {
861
- return settings.on;
862
- }
863
- },
864
- templatedURL: function(action) {
865
- action = action || $module.data(metadata.action) || settings.action || false;
866
- url = $module.data(metadata.url) || settings.url || false;
867
- if(url) {
868
- module.debug('Using specified url', url);
869
- return url;
870
- }
871
- if(action) {
872
- module.debug('Looking up url for action', action, settings.api);
873
- if(settings.api[action] === undefined && !module.is.mocked()) {
874
- module.error(error.missingAction, settings.action, settings.api);
875
- return;
876
- }
877
- url = settings.api[action];
878
- }
879
- else if( module.is.form() ) {
880
- url = $module.attr('action') || $context.attr('action') || false;
881
- module.debug('No url or action specified, defaulting to form action', url);
882
- }
883
- return url;
884
- }
885
- },
1101
+ // API action to use
1102
+ action: false,
886
1103
 
887
- abort: function() {
888
- var
889
- xhr = module.get.xhr()
890
- ;
891
- if( xhr && xhr.state() !== 'resolved') {
892
- module.debug('Cancelling API request');
893
- xhr.abort();
894
- }
895
- },
1104
+ // templated URL to use
1105
+ url: false,
896
1106
 
897
- // reset state
898
- reset: function() {
899
- module.remove.error();
900
- module.remove.loading();
901
- },
1107
+ // base URL to apply to all endpoints
1108
+ base: '',
902
1109
 
903
- setting: function(name, value) {
904
- module.debug('Changing setting', name, value);
905
- if( $.isPlainObject(name) ) {
906
- $.extend(true, settings, name);
907
- }
908
- else if(value !== undefined) {
909
- if($.isPlainObject(settings[name])) {
910
- $.extend(true, settings[name], value);
911
- }
912
- else {
913
- settings[name] = value;
914
- }
915
- }
916
- else {
917
- return settings[name];
918
- }
919
- },
920
- internal: function(name, value) {
921
- if( $.isPlainObject(name) ) {
922
- $.extend(true, module, name);
923
- }
924
- else if(value !== undefined) {
925
- module[name] = value;
926
- }
927
- else {
928
- return module[name];
929
- }
930
- },
931
- debug: function() {
932
- if(!settings.silent && settings.debug) {
933
- if(settings.performance) {
934
- module.performance.log(arguments);
935
- }
936
- else {
937
- module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
938
- module.debug.apply(console, arguments);
939
- }
940
- }
941
- },
942
- verbose: function() {
943
- if(!settings.silent && settings.verbose && settings.debug) {
944
- if(settings.performance) {
945
- module.performance.log(arguments);
946
- }
947
- else {
948
- module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
949
- module.verbose.apply(console, arguments);
950
- }
951
- }
952
- },
953
- error: function() {
954
- if(!settings.silent) {
955
- module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
956
- module.error.apply(console, arguments);
957
- }
958
- },
959
- performance: {
960
- log: function(message) {
961
- var
962
- currentTime,
963
- executionTime,
964
- previousTime
965
- ;
966
- if(settings.performance) {
967
- currentTime = new Date().getTime();
968
- previousTime = time || currentTime;
969
- executionTime = currentTime - previousTime;
970
- time = currentTime;
971
- performance.push({
972
- 'Name' : message[0],
973
- 'Arguments' : [].slice.call(message, 1) || '',
974
- //'Element' : element,
975
- 'Execution Time' : executionTime
976
- });
977
- }
978
- clearTimeout(module.performance.timer);
979
- module.performance.timer = setTimeout(module.performance.display, 500);
980
- },
981
- display: function() {
982
- var
983
- title = settings.name + ':',
984
- totalTime = 0
985
- ;
986
- time = false;
987
- clearTimeout(module.performance.timer);
988
- $.each(performance, function(index, data) {
989
- totalTime += data['Execution Time'];
990
- });
991
- title += ' ' + totalTime + 'ms';
992
- if(moduleSelector) {
993
- title += ' \'' + moduleSelector + '\'';
994
- }
995
- if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
996
- console.groupCollapsed(title);
997
- if(console.table) {
998
- console.table(performance);
999
- }
1000
- else {
1001
- $.each(performance, function(index, data) {
1002
- console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
1003
- });
1004
- }
1005
- console.groupEnd();
1006
- }
1007
- performance = [];
1008
- }
1009
- },
1010
- invoke: function(query, passedArguments, context) {
1011
- var
1012
- object = instance,
1013
- maxDepth,
1014
- found,
1015
- response
1016
- ;
1017
- passedArguments = passedArguments || queryArguments;
1018
- context = context || element;
1019
- if(typeof query == 'string' && object !== undefined) {
1020
- query = query.split(/[\. ]/);
1021
- maxDepth = query.length - 1;
1022
- $.each(query, function(depth, value) {
1023
- var camelCaseValue = (depth != maxDepth)
1024
- ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
1025
- : query
1026
- ;
1027
- if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
1028
- object = object[camelCaseValue];
1029
- }
1030
- else if( object[camelCaseValue] !== undefined ) {
1031
- found = object[camelCaseValue];
1032
- return false;
1033
- }
1034
- else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
1035
- object = object[value];
1036
- }
1037
- else if( object[value] !== undefined ) {
1038
- found = object[value];
1039
- return false;
1040
- }
1041
- else {
1042
- module.error(error.method, query);
1043
- return false;
1044
- }
1045
- });
1046
- }
1047
- if ( $.isFunction( found ) ) {
1048
- response = found.apply(context, passedArguments);
1049
- }
1050
- else if(found !== undefined) {
1051
- response = found;
1052
- }
1053
- if(Array.isArray(returnedValue)) {
1054
- returnedValue.push(response);
1055
- }
1056
- else if(returnedValue !== undefined) {
1057
- returnedValue = [returnedValue, response];
1058
- }
1059
- else if(response !== undefined) {
1060
- returnedValue = response;
1061
- }
1062
- return found;
1063
- }
1064
- };
1065
-
1066
- if(methodInvoked) {
1067
- if(instance === undefined) {
1068
- module.initialize();
1069
- }
1070
- module.invoke(query);
1071
- }
1072
- else {
1073
- if(instance !== undefined) {
1074
- instance.invoke('destroy');
1075
- }
1076
- module.initialize();
1077
- }
1078
- })
1079
- ;
1080
-
1081
- return (returnedValue !== undefined)
1082
- ? returnedValue
1083
- : this
1084
- ;
1085
- };
1086
-
1087
- $.api.settings = {
1088
-
1089
- name : 'API',
1090
- namespace : 'api',
1091
-
1092
- debug : false,
1093
- verbose : false,
1094
- performance : true,
1095
-
1096
- // object containing all templates endpoints
1097
- api : {},
1098
-
1099
- // whether to cache responses
1100
- cache : true,
1101
-
1102
- // whether new requests should abort previous requests
1103
- interruptRequests : true,
1104
-
1105
- // event binding
1106
- on : 'auto',
1107
-
1108
- // context for applying state classes
1109
- stateContext : false,
1110
-
1111
- // duration for loading state
1112
- loadingDuration : 0,
1113
-
1114
- // whether to hide errors after a period of time
1115
- hideError : 'auto',
1116
-
1117
- // duration for error state
1118
- errorDuration : 2000,
1119
-
1120
- // whether parameters should be encoded with encodeURIComponent
1121
- encodeParameters : true,
1122
-
1123
- // API action to use
1124
- action : false,
1125
-
1126
- // templated URL to use
1127
- url : false,
1128
-
1129
- // base URL to apply to all endpoints
1130
- base : '',
1131
-
1132
- // data that will
1133
- urlData : {},
1134
-
1135
- // whether to add default data to url data
1136
- defaultData : true,
1137
-
1138
- // whether to serialize closest form
1139
- // use true to convert complex named keys like a[b][1][c][] into a nested object
1140
- // use 'formdata' for formdata web api
1141
- serializeForm : false,
1142
-
1143
- // how long to wait before request should occur
1144
- throttle : 0,
1145
-
1146
- // whether to throttle first request or only repeated
1147
- throttleFirstRequest : true,
1148
-
1149
- // standard ajax settings
1150
- method : 'get',
1151
- data : {},
1152
- dataType : 'json',
1153
-
1154
- // mock response
1155
- mockResponse : false,
1156
- mockResponseAsync : false,
1157
-
1158
- // aliases for mock
1159
- response : false,
1160
- responseAsync : false,
1161
-
1162
- // whether onResponse should work with response value without force converting into an object
1163
- rawResponse : true,
1164
-
1165
- // callbacks before request
1166
- beforeSend : function(settings) { return settings; },
1167
- beforeXHR : function(xhr) {},
1168
- onRequest : function(promise, xhr) {},
1169
-
1170
- // after request
1171
- onResponse : false, // function(response) { },
1110
+ // data that will
1111
+ urlData: {},
1112
+
1113
+ // whether to add default data to url data
1114
+ defaultData: true,
1172
1115
 
1173
- // response was successful, if JSON passed validation
1174
- onSuccess : function(response, $module) {},
1116
+ // whether to serialize closest form
1117
+ // use true to convert complex named keys like a[b][1][c][] into a nested object
1118
+ // use 'formdata' for formdata web api
1119
+ serializeForm: false,
1175
1120
 
1176
- // request finished without aborting
1177
- onComplete : function(response, $module) {},
1121
+ // how long to wait before request should occur
1122
+ throttle: 0,
1178
1123
 
1179
- // failed JSON success test
1180
- onFailure : function(response, $module) {},
1124
+ // whether to throttle first request or only repeated
1125
+ throttleFirstRequest: true,
1181
1126
 
1182
- // server error
1183
- onError : function(errorMessage, $module) {},
1127
+ // standard ajax settings
1128
+ method: 'get',
1129
+ data: {},
1130
+ dataType: 'json',
1184
1131
 
1185
- // request aborted
1186
- onAbort : function(errorMessage, $module) {},
1132
+ // mock response
1133
+ mockResponse: false,
1134
+ mockResponseAsync: false,
1187
1135
 
1188
- successTest : false,
1136
+ // aliases for mock
1137
+ response: false,
1138
+ responseAsync: false,
1189
1139
 
1190
- // errors
1191
- error : {
1192
- beforeSend : 'The before send function has aborted the request',
1193
- error : 'There was an error with your request',
1194
- exitConditions : 'API Request Aborted. Exit conditions met',
1195
- JSONParse : 'JSON could not be parsed during error handling',
1196
- legacyParameters : 'You are using legacy API success callback names',
1197
- method : 'The method you called is not defined',
1198
- missingAction : 'API action used but no url was defined',
1199
- missingURL : 'No URL specified for api event',
1200
- noReturnedValue : 'The beforeSend callback must return a settings object, beforeSend ignored.',
1201
- noStorage : 'Caching responses locally requires session storage',
1202
- parseError : 'There was an error parsing your request',
1203
- requiredParameter : 'Missing a required URL parameter: ',
1204
- statusMessage : 'Server gave an error: ',
1205
- timeout : 'Your request timed out'
1206
- },
1140
+ // whether onResponse should work with response value without force converting into an object
1141
+ rawResponse: true,
1207
1142
 
1208
- regExp : {
1209
- required : /\{\$*[a-z0-9]+\}/gi,
1210
- optional : /\{\/\$*[a-z0-9]+\}/gi,
1211
- validate: /^[a-z_][a-z0-9_-]*(?:\[[a-z0-9_-]*\])*$/i,
1212
- key: /[a-z0-9_-]+|(?=\[\])/gi,
1213
- push: /^$/,
1214
- fixed: /^\d+$/,
1215
- named: /^[a-z0-9_-]+$/i
1216
- },
1217
-
1218
- className: {
1219
- loading : 'loading',
1220
- error : 'error'
1221
- },
1143
+ // callbacks before request
1144
+ beforeSend: function (settings) {
1145
+ return settings;
1146
+ },
1147
+ beforeXHR: function (xhr) {},
1148
+ onRequest: function (promise, xhr) {},
1149
+
1150
+ // after request
1151
+ onResponse: false, // function(response) { },
1152
+
1153
+ // response was successful, if JSON passed validation
1154
+ onSuccess: function (response, $module) {},
1155
+
1156
+ // request finished without aborting
1157
+ onComplete: function (response, $module) {},
1158
+
1159
+ // failed JSON success test
1160
+ onFailure: function (response, $module) {},
1161
+
1162
+ // server error
1163
+ onError: function (errorMessage, $module) {},
1164
+
1165
+ // request aborted
1166
+ onAbort: function (errorMessage, $module) {},
1167
+
1168
+ successTest: false,
1169
+
1170
+ // errors
1171
+ error: {
1172
+ beforeSend: 'The before send function has aborted the request',
1173
+ error: 'There was an error with your request',
1174
+ exitConditions: 'API Request Aborted. Exit conditions met',
1175
+ JSONParse: 'JSON could not be parsed during error handling',
1176
+ legacyParameters: 'You are using legacy API success callback names',
1177
+ method: 'The method you called is not defined',
1178
+ missingAction: 'API action used but no url was defined',
1179
+ missingURL: 'No URL specified for api event',
1180
+ noReturnedValue: 'The beforeSend callback must return a settings object, beforeSend ignored.',
1181
+ noStorage: 'Caching responses locally requires session storage',
1182
+ parseError: 'There was an error parsing your request',
1183
+ requiredParameter: 'Missing a required URL parameter: ',
1184
+ statusMessage: 'Server gave an error: ',
1185
+ timeout: 'Your request timed out',
1186
+ },
1222
1187
 
1223
- selector: {
1224
- disabled : '.disabled',
1225
- form : 'form'
1226
- },
1227
-
1228
- metadata: {
1229
- action : 'action',
1230
- url : 'url'
1231
- }
1232
- };
1233
-
1234
-
1235
-
1236
- })( jQuery, window, document );
1188
+ regExp: {
1189
+ required: /\{\$*[a-z0-9]+\}/gi,
1190
+ optional: /\{\/\$*[a-z0-9]+\}/gi,
1191
+ validate: /^[a-z_][a-z0-9_-]*(?:\[[a-z0-9_-]*\])*$/i,
1192
+ key: /[a-z0-9_-]+|(?=\[\])/gi,
1193
+ push: /^$/,
1194
+ fixed: /^\d+$/,
1195
+ named: /^[a-z0-9_-]+$/i,
1196
+ },
1197
+
1198
+ className: {
1199
+ loading: 'loading',
1200
+ error: 'error',
1201
+ },
1202
+
1203
+ selector: {
1204
+ disabled: '.disabled',
1205
+ form: 'form',
1206
+ },
1207
+
1208
+ metadata: {
1209
+ action: 'action',
1210
+ url: 'url',
1211
+ },
1212
+ };
1213
+ })(jQuery, window, document);