fomantic-ui 2.9.1-beta.8 → 2.9.1
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.
- package/.eslint/eqeqeq-rule.js +18 -0
- package/.eslint/index.js +29 -0
- package/.eslint/no-extra-parens-rule.js +17 -0
- package/.eslint/package.json +11 -0
- package/.eslintrc.js +123 -0
- package/.github/auto_assign.yml +0 -1
- package/.github/workflows/ci.yml +37 -4
- package/.github/workflows/nightly.yml +1 -1
- package/.github/workflows/release.yml +1 -1
- package/.prettierrc.js +12 -0
- package/.stylelintrc.js +48 -0
- package/CHANGELOG.md +112 -0
- package/README.md +1 -1
- package/dist/components/accordion.css +35 -53
- package/dist/components/accordion.js +568 -595
- package/dist/components/accordion.min.css +2 -2
- package/dist/components/accordion.min.js +3 -3
- package/dist/components/ad.css +34 -45
- package/dist/components/ad.min.css +2 -2
- package/dist/components/api.js +1157 -1179
- package/dist/components/api.min.js +3 -3
- package/dist/components/breadcrumb.css +5 -5
- package/dist/components/breadcrumb.min.css +2 -2
- package/dist/components/button.css +709 -1111
- package/dist/components/button.min.css +2 -2
- package/dist/components/calendar.css +24 -27
- package/dist/components/calendar.js +1934 -1809
- package/dist/components/calendar.min.css +2 -2
- package/dist/components/calendar.min.js +3 -3
- package/dist/components/card.css +219 -365
- package/dist/components/card.min.css +2 -2
- package/dist/components/checkbox.css +120 -191
- package/dist/components/checkbox.js +842 -841
- package/dist/components/checkbox.min.css +2 -2
- package/dist/components/checkbox.min.js +3 -3
- package/dist/components/comment.css +41 -59
- package/dist/components/comment.min.css +2 -2
- package/dist/components/container.css +7 -6
- package/dist/components/container.min.css +2 -2
- package/dist/components/dimmer.css +53 -172
- package/dist/components/dimmer.js +706 -737
- package/dist/components/dimmer.min.css +2 -2
- package/dist/components/dimmer.min.js +3 -3
- package/dist/components/divider.css +43 -61
- package/dist/components/divider.min.css +2 -2
- package/dist/components/dropdown.css +252 -386
- package/dist/components/dropdown.js +4195 -4236
- package/dist/components/dropdown.min.css +2 -2
- package/dist/components/dropdown.min.js +3 -3
- package/dist/components/embed.css +18 -29
- package/dist/components/embed.js +645 -675
- package/dist/components/embed.min.css +2 -2
- package/dist/components/embed.min.js +3 -3
- package/dist/components/emoji.css +3556 -3556
- package/dist/components/emoji.min.css +1 -1
- package/dist/components/feed.css +35 -57
- package/dist/components/feed.min.css +2 -2
- package/dist/components/flag.css +270 -268
- package/dist/components/flag.min.css +2 -2
- package/dist/components/flyout.css +95 -141
- package/dist/components/flyout.js +1514 -1465
- package/dist/components/flyout.min.css +2 -2
- package/dist/components/flyout.min.js +3 -3
- package/dist/components/form.css +244 -339
- package/dist/components/form.js +2022 -2004
- package/dist/components/form.min.css +2 -2
- package/dist/components/form.min.js +3 -3
- package/dist/components/grid.css +183 -329
- package/dist/components/grid.min.css +2 -2
- package/dist/components/header.css +118 -142
- package/dist/components/header.min.css +2 -2
- package/dist/components/icon.css +662 -745
- package/dist/components/icon.min.css +2 -2
- package/dist/components/image.css +39 -63
- package/dist/components/image.min.css +2 -2
- package/dist/components/input.css +356 -274
- package/dist/components/input.min.css +2 -2
- package/dist/components/item.css +84 -131
- package/dist/components/item.min.css +2 -2
- package/dist/components/label.css +359 -410
- package/dist/components/label.min.css +2 -2
- package/dist/components/list.css +49 -70
- package/dist/components/list.min.css +2 -2
- package/dist/components/loader.css +67 -155
- package/dist/components/loader.min.css +2 -2
- package/dist/components/menu.css +270 -431
- package/dist/components/menu.min.css +1 -1
- package/dist/components/message.css +125 -197
- package/dist/components/message.min.css +2 -2
- package/dist/components/modal.css +120 -154
- package/dist/components/modal.js +1544 -1486
- package/dist/components/modal.min.css +2 -2
- package/dist/components/modal.min.js +3 -3
- package/dist/components/nag.css +53 -63
- package/dist/components/nag.js +520 -526
- package/dist/components/nag.min.css +2 -2
- package/dist/components/nag.min.js +3 -3
- package/dist/components/placeholder.css +22 -42
- package/dist/components/placeholder.min.css +2 -2
- package/dist/components/popup.css +424 -202
- package/dist/components/popup.js +1456 -1456
- package/dist/components/popup.min.css +2 -2
- package/dist/components/popup.min.js +3 -3
- package/dist/components/progress.css +106 -211
- package/dist/components/progress.js +969 -997
- package/dist/components/progress.min.css +2 -2
- package/dist/components/progress.min.js +3 -3
- package/dist/components/rail.css +15 -20
- package/dist/components/rail.min.css +1 -1
- package/dist/components/rating.css +80 -121
- package/dist/components/rating.js +507 -523
- package/dist/components/rating.min.css +2 -2
- package/dist/components/rating.min.js +3 -3
- package/dist/components/reset.css +8 -13
- package/dist/components/reset.min.css +2 -2
- package/dist/components/reveal.css +44 -83
- package/dist/components/reveal.min.css +2 -2
- package/dist/components/search.css +69 -98
- package/dist/components/search.js +1520 -1534
- package/dist/components/search.min.css +2 -2
- package/dist/components/search.min.js +3 -3
- package/dist/components/segment.css +148 -224
- package/dist/components/segment.min.css +2 -2
- package/dist/components/shape.css +14 -30
- package/dist/components/shape.js +783 -810
- package/dist/components/shape.min.css +2 -2
- package/dist/components/shape.min.js +3 -3
- package/dist/components/sidebar.css +103 -206
- package/dist/components/sidebar.js +1061 -1099
- package/dist/components/sidebar.min.css +2 -2
- package/dist/components/sidebar.min.js +3 -3
- package/dist/components/site.css +28 -41
- package/dist/components/site.js +436 -476
- package/dist/components/site.min.css +2 -2
- package/dist/components/site.min.js +3 -3
- package/dist/components/slider.css +93 -121
- package/dist/components/slider.js +1310 -1311
- package/dist/components/slider.min.css +1 -1
- package/dist/components/slider.min.js +3 -3
- package/dist/components/state.js +638 -657
- package/dist/components/state.min.js +3 -3
- package/dist/components/statistic.css +75 -116
- package/dist/components/statistic.min.css +2 -2
- package/dist/components/step.css +77 -150
- package/dist/components/step.min.css +2 -2
- package/dist/components/sticky.css +1 -5
- package/dist/components/sticky.js +847 -901
- package/dist/components/sticky.min.css +2 -2
- package/dist/components/sticky.min.js +3 -3
- package/dist/components/tab.css +10 -14
- package/dist/components/tab.js +902 -966
- package/dist/components/tab.min.css +2 -2
- package/dist/components/tab.min.js +3 -3
- package/dist/components/table.css +547 -774
- package/dist/components/table.min.css +2 -2
- package/dist/components/text.css +32 -32
- package/dist/components/text.min.css +1 -1
- package/dist/components/toast.css +69 -147
- package/dist/components/toast.js +910 -884
- package/dist/components/toast.min.css +2 -2
- package/dist/components/toast.min.js +3 -3
- package/dist/components/transition.css +299 -1356
- package/dist/components/transition.js +1048 -1077
- package/dist/components/transition.min.css +2 -2
- package/dist/components/transition.min.js +3 -3
- package/dist/components/visibility.js +1213 -1245
- package/dist/components/visibility.min.js +3 -3
- package/dist/semantic.css +9344 -12298
- package/dist/semantic.js +29181 -29423
- package/dist/semantic.min.css +3 -3
- package/dist/semantic.min.js +3 -3
- package/dist/themes/basic/assets/fonts/icons.woff2 +0 -0
- package/dist/themes/github/assets/fonts/octicons.woff2 +0 -0
- package/examples/.eslintrc.js +6 -0
- package/examples/assets/library/jquery.min.js +2 -4
- package/examples/assets/show-examples.js +13 -13
- package/examples/attached.html +1 -1
- package/examples/bootstrap.html +1 -1
- package/examples/components/button.html +1 -1
- package/examples/components/card.html +6 -6
- package/examples/components/input.html +1 -1
- package/examples/components/menu.html +1 -1
- package/examples/components/site.html +1 -1
- package/examples/components/sticky-context.html +2 -2
- package/examples/components/table.html +1 -1
- package/examples/fixed.html +3 -3
- package/examples/grid.html +5 -5
- package/examples/homepage.html +1 -1
- package/examples/login.html +2 -2
- package/examples/responsive.html +2 -2
- package/examples/sticky.html +4 -4
- package/examples/theming.html +1 -1
- package/gulpfile.js +13 -11
- package/package.json +17 -8
- package/scripts/nightly-version.js +83 -75
- package/src/_site/collections/menu.overrides +1 -1
- package/src/_site/elements/flag.variables +2 -2
- package/src/_site/globals/site.variables +1 -1
- package/src/_site/modules/embed.variables +3 -0
- package/src/definitions/behaviors/api.js +1158 -1180
- package/src/definitions/behaviors/form.js +2021 -2003
- package/src/definitions/behaviors/state.js +644 -663
- package/src/definitions/behaviors/visibility.js +1212 -1244
- package/src/definitions/collections/breadcrumb.less +43 -47
- package/src/definitions/collections/form.less +866 -884
- package/src/definitions/collections/grid.less +1681 -1699
- package/src/definitions/collections/menu.less +1522 -1544
- package/src/definitions/collections/message.less +294 -298
- package/src/definitions/collections/table.less +1657 -1661
- package/src/definitions/elements/button.less +1716 -1750
- package/src/definitions/elements/container.less +211 -211
- package/src/definitions/elements/divider.less +198 -211
- package/src/definitions/elements/emoji.less +41 -48
- package/src/definitions/elements/flag.less +46 -48
- package/src/definitions/elements/header.less +351 -359
- package/src/definitions/elements/icon.less +541 -484
- package/src/definitions/elements/image.less +216 -227
- package/src/definitions/elements/input.less +692 -699
- package/src/definitions/elements/label.less +784 -806
- package/src/definitions/elements/list.less +810 -814
- package/src/definitions/elements/loader.less +273 -268
- package/src/definitions/elements/placeholder.less +173 -170
- package/src/definitions/elements/rail.less +93 -93
- package/src/definitions/elements/reveal.less +192 -198
- package/src/definitions/elements/segment.less +742 -749
- package/src/definitions/elements/step.less +423 -437
- package/src/definitions/elements/text.less +34 -36
- package/src/definitions/globals/reset.less +11 -8
- package/src/definitions/globals/site.js +435 -475
- package/src/definitions/globals/site.less +108 -110
- package/src/definitions/modules/accordion.js +567 -594
- package/src/definitions/modules/accordion.less +244 -248
- package/src/definitions/modules/calendar.js +1933 -1808
- package/src/definitions/modules/calendar.less +100 -97
- package/src/definitions/modules/checkbox.js +841 -840
- package/src/definitions/modules/checkbox.less +531 -552
- package/src/definitions/modules/dimmer.js +705 -736
- package/src/definitions/modules/dimmer.less +294 -305
- package/src/definitions/modules/dropdown.js +4194 -4235
- package/src/definitions/modules/dropdown.less +1568 -1598
- package/src/definitions/modules/embed.js +644 -674
- package/src/definitions/modules/embed.less +82 -84
- package/src/definitions/modules/flyout.js +1513 -1464
- package/src/definitions/modules/flyout.less +453 -455
- package/src/definitions/modules/modal.js +1543 -1485
- package/src/definitions/modules/modal.less +459 -467
- package/src/definitions/modules/nag.js +519 -525
- package/src/definitions/modules/nag.less +136 -149
- package/src/definitions/modules/popup.js +1455 -1455
- package/src/definitions/modules/popup.less +738 -693
- package/src/definitions/modules/progress.js +968 -996
- package/src/definitions/modules/progress.less +523 -499
- package/src/definitions/modules/rating.js +506 -522
- package/src/definitions/modules/rating.less +98 -103
- package/src/definitions/modules/search.js +1519 -1533
- package/src/definitions/modules/search.less +374 -394
- package/src/definitions/modules/shape.js +782 -809
- package/src/definitions/modules/shape.less +70 -79
- package/src/definitions/modules/sidebar.js +1060 -1098
- package/src/definitions/modules/sidebar.less +463 -476
- package/src/definitions/modules/slider.js +1309 -1310
- package/src/definitions/modules/slider.less +309 -310
- package/src/definitions/modules/sticky.js +863 -917
- package/src/definitions/modules/sticky.less +17 -25
- package/src/definitions/modules/tab.js +901 -965
- package/src/definitions/modules/tab.less +48 -54
- package/src/definitions/modules/toast.js +909 -883
- package/src/definitions/modules/toast.less +589 -589
- package/src/definitions/modules/transition.js +1047 -1076
- package/src/definitions/modules/transition.less +58 -59
- package/src/definitions/views/ad.less +207 -208
- package/src/definitions/views/card.less +955 -973
- package/src/definitions/views/comment.less +192 -200
- package/src/definitions/views/feed.less +222 -226
- package/src/definitions/views/item.less +437 -448
- package/src/definitions/views/statistic.less +273 -279
- package/src/semantic.less +8 -6
- package/src/theme.config.example +53 -53
- package/src/theme.less +44 -35
- package/src/themes/amazon/elements/button.overrides +23 -24
- package/src/themes/amazon/elements/button.variables +18 -23
- package/src/themes/amazon/globals/site.variables +16 -17
- package/src/themes/basic/assets/fonts/icons.woff2 +0 -0
- package/src/themes/basic/collections/table.overrides +0 -1
- package/src/themes/basic/collections/table.variables +3 -3
- package/src/themes/basic/elements/button.overrides +0 -1
- package/src/themes/basic/elements/button.variables +9 -9
- package/src/themes/basic/elements/icon.overrides +9 -169
- package/src/themes/basic/elements/icon.variables +161 -18
- package/src/themes/basic/elements/step.overrides +2 -2
- package/src/themes/basic/elements/step.variables +2 -2
- package/src/themes/basic/globals/reset.overrides +1 -1
- package/src/themes/basic/globals/reset.variables +1 -1
- package/src/themes/basic/modules/progress.variables +2 -2
- package/src/themes/basic/views/card.overrides +0 -1
- package/src/themes/basic/views/card.variables +6 -6
- package/src/themes/bookish/elements/header.overrides +4 -4
- package/src/themes/bookish/elements/header.variables +5 -5
- package/src/themes/bootstrap3/elements/button.overrides +3 -0
- package/src/themes/bootstrap3/elements/button.variables +20 -25
- package/src/themes/chubby/collections/form.overrides +9 -9
- package/src/themes/chubby/collections/form.variables +3 -3
- package/src/themes/chubby/collections/menu.overrides +3 -0
- package/src/themes/chubby/collections/menu.variables +3 -3
- package/src/themes/chubby/elements/button.overrides +8 -10
- package/src/themes/chubby/elements/button.variables +10 -10
- package/src/themes/chubby/elements/header.overrides +1 -1
- package/src/themes/chubby/elements/header.variables +4 -4
- package/src/themes/chubby/modules/accordion.overrides +2 -2
- package/src/themes/chubby/modules/accordion.variables +4 -4
- package/src/themes/chubby/views/comment.overrides +5 -5
- package/src/themes/chubby/views/comment.variables +11 -11
- package/src/themes/classic/collections/table.variables +3 -3
- package/src/themes/classic/elements/button.variables +36 -43
- package/src/themes/classic/elements/header.variables +4 -4
- package/src/themes/classic/modules/progress.variables +3 -3
- package/src/themes/classic/views/card.overrides +25 -27
- package/src/themes/classic/views/card.variables +7 -7
- package/src/themes/colored/modules/checkbox.overrides +3 -0
- package/src/themes/colored/modules/checkbox.variables +1 -3
- package/src/themes/default/collections/breadcrumb.variables +4 -4
- package/src/themes/default/collections/form.variables +15 -16
- package/src/themes/default/collections/grid.overrides +0 -1
- package/src/themes/default/collections/grid.variables +15 -16
- package/src/themes/default/collections/menu.variables +31 -45
- package/src/themes/default/collections/message.variables +84 -123
- package/src/themes/default/collections/table.overrides +3 -0
- package/src/themes/default/collections/table.variables +30 -34
- package/src/themes/default/elements/button.variables +44 -53
- package/src/themes/default/elements/container.variables +8 -16
- package/src/themes/default/elements/divider.overrides +8 -9
- package/src/themes/default/elements/divider.variables +5 -6
- package/src/themes/default/elements/emoji.overrides +0 -1
- package/src/themes/default/elements/emoji.variables +3556 -3556
- package/src/themes/default/elements/flag.variables +1595 -1595
- package/src/themes/default/elements/header.overrides +0 -1
- package/src/themes/default/elements/header.variables +21 -21
- package/src/themes/default/elements/icon.variables +2016 -2012
- package/src/themes/default/elements/image.variables +6 -7
- package/src/themes/default/elements/input.variables +11 -12
- package/src/themes/default/elements/label.variables +25 -26
- package/src/themes/default/elements/list.variables +17 -21
- package/src/themes/default/elements/loader.variables +16 -17
- package/src/themes/default/elements/placeholder.variables +12 -9
- package/src/themes/default/elements/rail.variables +4 -5
- package/src/themes/default/elements/reveal.variables +1 -1
- package/src/themes/default/elements/segment.variables +24 -36
- package/src/themes/default/elements/step.overrides +4 -4
- package/src/themes/default/elements/step.variables +19 -22
- package/src/themes/default/elements/text.variables +2 -3
- package/src/themes/default/globals/colors.less +588 -588
- package/src/themes/default/globals/reset.overrides +63 -59
- package/src/themes/default/globals/reset.variables +1 -1
- package/src/themes/default/globals/site.variables +1074 -1123
- package/src/themes/default/globals/variation.variables +6 -4
- package/src/themes/default/modules/accordion.overrides +11 -11
- package/src/themes/default/modules/accordion.variables +15 -20
- package/src/themes/default/modules/calendar.variables +2 -0
- package/src/themes/default/modules/chatroom.variables +1 -1
- package/src/themes/default/modules/checkbox.overrides +9 -13
- package/src/themes/default/modules/checkbox.variables +24 -33
- package/src/themes/default/modules/dimmer.variables +14 -17
- package/src/themes/default/modules/dropdown.overrides +17 -17
- package/src/themes/default/modules/dropdown.variables +29 -31
- package/src/themes/default/modules/embed.variables +9 -13
- package/src/themes/default/modules/flyout.variables +10 -8
- package/src/themes/default/modules/modal.variables +64 -67
- package/src/themes/default/modules/nag.variables +11 -14
- package/src/themes/default/modules/popup.variables +14 -13
- package/src/themes/default/modules/progress.variables +17 -19
- package/src/themes/default/modules/rating.variables +10 -12
- package/src/themes/default/modules/search.variables +12 -17
- package/src/themes/default/modules/shape.variables +7 -8
- package/src/themes/default/modules/sidebar.variables +4 -4
- package/src/themes/default/modules/slider.variables +55 -54
- package/src/themes/default/modules/sticky.variables +1 -1
- package/src/themes/default/modules/toast.variables +8 -8
- package/src/themes/default/modules/transition.overrides +936 -915
- package/src/themes/default/modules/transition.variables +1 -1
- package/src/themes/default/views/ad.variables +1 -1
- package/src/themes/default/views/card.variables +33 -45
- package/src/themes/default/views/comment.variables +7 -9
- package/src/themes/default/views/feed.variables +10 -10
- package/src/themes/default/views/item.variables +20 -23
- package/src/themes/default/views/statistic.variables +8 -8
- package/src/themes/duo/elements/loader.variables +1 -1
- package/src/themes/famfamfam/elements/flag.overrides +263 -268
- package/src/themes/famfamfam/elements/flag.variables +4 -4
- package/src/themes/fixed-width/collections/grid.variables +4 -4
- package/src/themes/fixed-width/modules/modal.variables +11 -13
- package/src/themes/flat/collections/form.overrides +9 -9
- package/src/themes/flat/collections/form.variables +16 -17
- package/src/themes/flat/globals/site.variables +69 -74
- package/src/themes/github/assets/fonts/octicons.woff2 +0 -0
- package/src/themes/github/collections/breadcrumb.variables +0 -1
- package/src/themes/github/collections/form.overrides +7 -8
- package/src/themes/github/collections/form.variables +16 -18
- package/src/themes/github/collections/grid.variables +1 -2
- package/src/themes/github/collections/menu.overrides +2 -2
- package/src/themes/github/collections/menu.variables +24 -26
- package/src/themes/github/collections/message.overrides +3 -3
- package/src/themes/github/collections/message.variables +12 -14
- package/src/themes/github/collections/table.variables +2 -2
- package/src/themes/github/elements/button.overrides +0 -1
- package/src/themes/github/elements/button.variables +26 -30
- package/src/themes/github/elements/header.variables +2 -2
- package/src/themes/github/elements/icon.overrides +3 -208
- package/src/themes/github/elements/icon.variables +234 -19
- package/src/themes/github/elements/image.variables +1 -1
- package/src/themes/github/elements/input.overrides +16 -16
- package/src/themes/github/elements/input.variables +4 -5
- package/src/themes/github/elements/label.overrides +3 -3
- package/src/themes/github/elements/label.variables +0 -1
- package/src/themes/github/elements/segment.variables +9 -10
- package/src/themes/github/elements/step.overrides +13 -13
- package/src/themes/github/elements/step.variables +6 -6
- package/src/themes/github/globals/site.variables +16 -16
- package/src/themes/github/modules/dropdown.overrides +18 -19
- package/src/themes/github/modules/dropdown.variables +8 -10
- package/src/themes/github/modules/popup.variables +0 -2
- package/src/themes/gmail/collections/message.overrides +3 -0
- package/src/themes/gmail/collections/message.variables +4 -4
- package/src/themes/instagram/views/card.overrides +4 -5
- package/src/themes/instagram/views/card.variables +7 -8
- package/src/themes/joypixels/elements/emoji.overrides +0 -2
- package/src/themes/joypixels/elements/emoji.variables +3554 -3554
- package/src/themes/material/collections/menu.overrides +1 -1
- package/src/themes/material/collections/menu.variables +4 -4
- package/src/themes/material/elements/button.overrides +7 -9
- package/src/themes/material/elements/button.variables +44 -46
- package/src/themes/material/elements/header.overrides +3 -3
- package/src/themes/material/elements/header.variables +8 -10
- package/src/themes/material/elements/icon.overrides +3 -934
- package/src/themes/material/elements/icon.variables +958 -18
- package/src/themes/material/globals/site.overrides +3 -0
- package/src/themes/material/globals/site.variables +83 -84
- package/src/themes/material/modules/dropdown.overrides +2 -2
- package/src/themes/material/modules/dropdown.variables +5 -5
- package/src/themes/material/modules/modal.overrides +3 -3
- package/src/themes/material/modules/modal.variables +4 -5
- package/src/themes/pulsar/elements/loader.overrides +23 -61
- package/src/themes/raised/elements/button.variables +8 -9
- package/src/themes/resetcss/globals/reset.overrides +115 -33
- package/src/themes/resetcss/globals/reset.variables +1 -1
- package/src/themes/round/elements/button.overrides +3 -0
- package/src/themes/round/elements/button.variables +33 -38
- package/src/themes/rtl/globals/site.overrides +1 -1
- package/src/themes/rtl/globals/site.variables +5 -6
- package/src/themes/striped/modules/progress.overrides +20 -16
- package/src/themes/systemfont/globals/reset.overrides +1 -1
- package/src/themes/systemfont/globals/site.variables +6 -6
- package/src/themes/timeline/views/feed.overrides +12 -12
- package/src/themes/timeline/views/feed.variables +8 -8
- package/src/themes/twitter/elements/button.overrides +4 -5
- package/src/themes/twitter/elements/button.variables +17 -18
- package/src/themes/twitter/elements/emoji.variables +3556 -3556
- package/tasks/.eslintrc.js +9 -0
- package/tasks/README.md +2 -4
- package/tasks/admin/components/create.js +268 -277
- package/tasks/admin/components/init.js +123 -129
- package/tasks/admin/components/update.js +151 -158
- package/tasks/admin/distributions/create.js +183 -189
- package/tasks/admin/distributions/init.js +125 -131
- package/tasks/admin/distributions/update.js +147 -153
- package/tasks/admin/publish.js +5 -9
- package/tasks/admin/register.js +37 -39
- package/tasks/admin/release.js +8 -12
- package/tasks/build/assets.js +43 -40
- package/tasks/build/css.js +230 -217
- package/tasks/build/javascript.js +120 -114
- package/tasks/build.js +11 -11
- package/tasks/check-install.js +15 -17
- package/tasks/clean.js +6 -6
- package/tasks/collections/README.md +3 -5
- package/tasks/collections/admin.js +34 -36
- package/tasks/collections/build.js +19 -21
- package/tasks/collections/docs.js +11 -13
- package/tasks/collections/install.js +11 -13
- package/tasks/collections/rtl.js +9 -12
- package/tasks/collections/various.js +10 -12
- package/tasks/config/admin/github.js +17 -19
- package/tasks/config/admin/oauth.example.js +4 -4
- package/tasks/config/admin/release.js +98 -98
- package/tasks/config/admin/templates/README.md +8 -8
- package/tasks/config/admin/templates/bower.json +3 -2
- package/tasks/config/admin/templates/component-package.js +9 -10
- package/tasks/config/admin/templates/css-package.js +19 -21
- package/tasks/config/admin/templates/less-package.js +12 -14
- package/tasks/config/admin/templates/package.json +6 -6
- package/tasks/config/defaults.js +116 -116
- package/tasks/config/docs.js +23 -23
- package/tasks/config/npm/gulpfile.js +15 -14
- package/tasks/config/project/config.js +124 -136
- package/tasks/config/project/install.js +722 -719
- package/tasks/config/project/release.js +34 -41
- package/tasks/config/tasks.js +168 -167
- package/tasks/config/user.js +28 -32
- package/tasks/docs/build.js +100 -96
- package/tasks/docs/metadata.js +91 -98
- package/tasks/docs/serve.js +84 -82
- package/tasks/install.js +373 -382
- package/tasks/rtl/build.js +4 -3
- package/tasks/rtl/watch.js +4 -3
- package/tasks/version.js +4 -6
- package/tasks/watch.js +29 -31
- package/test/.eslintrc.js +23 -0
- package/test/meteor/assets.js +11 -14
- package/test/meteor/fonts.js +12 -13
- package/test/modules/accordion.spec.js +6 -8
- package/test/modules/checkbox.spec.js +5 -7
- package/test/modules/dropdown.spec.js +5 -7
- package/test/modules/modal.spec.js +6 -8
- package/test/modules/module.spec.js +158 -178
- package/test/modules/popup.spec.js +5 -7
- package/test/modules/search.spec.js +5 -7
- package/test/modules/shape.spec.js +5 -7
- package/test/modules/sidebar.spec.js +5 -7
- package/test/modules/tab.spec.js +6 -8
- package/test/modules/transition.spec.js +5 -7
- package/test/modules/video.spec.js +5 -7
- package/.github/workflows/codeql.yml +0 -68
@@ -8,1229 +8,1207 @@
|
|
8
8
|
*
|
9
9
|
*/
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
;
|
25
|
-
|
26
|
-
$.
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
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) {
|
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 = window !== undefined && window.Math === Math
|
23
|
+
? window
|
24
|
+
: globalThis;
|
25
|
+
|
26
|
+
$.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 = Date.now(),
|
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
|
-
|
97
|
-
module.verbose('Storing instance of module', module);
|
98
|
-
instance = module;
|
99
|
-
$module
|
100
|
-
.data(moduleNamespace, instance)
|
101
|
-
;
|
102
|
-
},
|
84
|
+
module = {
|
103
85
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
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
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
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
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
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
|
-
|
145
|
-
|
146
|
-
|
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
|
-
|
191
|
+
// pass element metadata to url (value, text)
|
192
|
+
if (settings.defaultData) {
|
193
|
+
$.extend(true, settings.urlData, module.get.defaultData());
|
194
|
+
}
|
178
195
|
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
196
|
+
// Add form content
|
197
|
+
if (settings.serializeForm) {
|
198
|
+
settings.data = module.add.formData(originalData || settings.data);
|
199
|
+
}
|
183
200
|
|
184
|
-
|
185
|
-
|
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
|
-
|
281
|
-
|
282
|
-
return ( settings.hideError === true || (settings.hideError === 'auto' && !module.is.form()) );
|
283
|
-
}
|
284
|
-
},
|
209
|
+
return;
|
210
|
+
}
|
285
211
|
|
286
|
-
|
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
|
-
},
|
212
|
+
module.cancelled = false;
|
334
213
|
|
335
|
-
|
336
|
-
|
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
|
-
},
|
214
|
+
// get url
|
215
|
+
url = module.get.templatedURL();
|
349
216
|
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
: (
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
217
|
+
if (!url && !module.is.mocked()) {
|
218
|
+
module.error(error.missingURL);
|
219
|
+
|
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
|
+
}
|
308
|
+
|
309
|
+
module.verbose('XHR request was not aborted');
|
310
|
+
|
311
|
+
return false;
|
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
|
+
}
|
325
|
+
|
326
|
+
module.debug('Response failed success test', response);
|
327
|
+
|
328
|
+
return false;
|
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 // eslint-disable-line unicorn/no-nested-ternary
|
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
|
+
}
|
380
|
+
|
381
|
+
module.verbose('Found required variable', variable, value);
|
382
|
+
value = settings.encodeParameters
|
383
|
+
? module.get.urlEncodedValue(value)
|
384
|
+
: value;
|
385
|
+
url = url.replace(templatedString, value);
|
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 // eslint-disable-line unicorn/no-nested-ternary
|
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
|
+
url = url.indexOf('/' + templatedString) !== -1
|
412
|
+
? url.replace('/' + templatedString, '')
|
413
|
+
: url.replace(templatedString, '');
|
414
|
+
}
|
415
|
+
});
|
416
|
+
}
|
417
|
+
}
|
418
|
+
|
419
|
+
return url;
|
420
|
+
},
|
421
|
+
formData: function (data) {
|
422
|
+
var
|
423
|
+
formData = {},
|
424
|
+
hasOtherData,
|
425
|
+
useFormDataApi = settings.serializeForm === 'formdata'
|
426
|
+
;
|
427
|
+
data = data || originalData || settings.data;
|
428
|
+
hasOtherData = $.isPlainObject(data);
|
429
|
+
|
430
|
+
if (useFormDataApi) {
|
431
|
+
formData = new FormData($form[0]);
|
432
|
+
settings.processData = settings.processData !== undefined ? settings.processData : false;
|
433
|
+
settings.contentType = settings.contentType !== undefined ? settings.contentType : false;
|
434
|
+
} else {
|
435
|
+
var
|
436
|
+
formArray = $form.serializeArray(),
|
437
|
+
pushes = {},
|
438
|
+
pushValues = {},
|
439
|
+
build = function (base, key, value) {
|
440
|
+
base[key] = value;
|
441
|
+
|
442
|
+
return base;
|
443
|
+
}
|
444
|
+
;
|
445
|
+
// add files
|
446
|
+
$.each($('input[type="file"]', $form), function (i, tag) {
|
447
|
+
$.each($(tag)[0].files, function (j, file) {
|
448
|
+
formArray.push({ name: tag.name, value: file });
|
449
|
+
});
|
450
|
+
});
|
451
|
+
$.each(formArray, function (i, el) {
|
452
|
+
if (!settings.regExp.validate.test(el.name)) {
|
453
|
+
return;
|
454
|
+
}
|
455
|
+
var
|
456
|
+
isCheckbox = $('[name="' + el.name + '"]', $form).attr('type') === 'checkbox',
|
457
|
+
floatValue = parseFloat(el.value),
|
458
|
+
value = (isCheckbox && el.value === 'on')
|
459
|
+
|| el.value === 'true'
|
460
|
+
|| (String(floatValue) === el.value
|
461
|
+
? floatValue
|
462
|
+
: (el.value === 'false' ? false : el.value)),
|
463
|
+
nameKeys = el.name.match(settings.regExp.key) || [],
|
464
|
+
pushKey = el.name.replace(/\[]$/, '')
|
465
|
+
;
|
466
|
+
if (!(pushKey in pushes)) {
|
467
|
+
pushes[pushKey] = 0;
|
468
|
+
pushValues[pushKey] = value;
|
469
|
+
} else if (Array.isArray(pushValues[pushKey])) {
|
470
|
+
pushValues[pushKey].push(value);
|
471
|
+
} else {
|
472
|
+
pushValues[pushKey] = [pushValues[pushKey], value];
|
473
|
+
}
|
474
|
+
if (pushKey.indexOf('[]') === -1) {
|
475
|
+
value = pushValues[pushKey];
|
476
|
+
}
|
477
|
+
|
478
|
+
while (nameKeys.length > 0) {
|
479
|
+
var k = nameKeys.pop();
|
480
|
+
|
481
|
+
if (k === '' && !Array.isArray(value)) { // foo[]
|
482
|
+
value = build([], pushes[pushKey]++, value);
|
483
|
+
} else if (settings.regExp.fixed.test(k)) { // foo[n]
|
484
|
+
value = build([], k, value);
|
485
|
+
} else if (settings.regExp.named.test(k)) { // foo; foo[bar]
|
486
|
+
value = build({}, k, value);
|
487
|
+
}
|
488
|
+
}
|
489
|
+
formData = $.extend(true, formData, value);
|
490
|
+
});
|
491
|
+
}
|
492
|
+
|
493
|
+
if (hasOtherData) {
|
494
|
+
module.debug('Extending existing data with form data', data, formData);
|
495
|
+
if (useFormDataApi) {
|
496
|
+
$.each(Object.keys(data), function (i, el) {
|
497
|
+
formData.append(el, data[el]);
|
498
|
+
});
|
499
|
+
data = formData;
|
500
|
+
} else {
|
501
|
+
data = $.extend(true, {}, data, formData);
|
502
|
+
}
|
503
|
+
} else {
|
504
|
+
module.debug('Adding form data', formData);
|
505
|
+
data = formData;
|
506
|
+
}
|
507
|
+
|
508
|
+
return data;
|
509
|
+
},
|
510
|
+
},
|
511
|
+
|
512
|
+
send: {
|
513
|
+
request: function () {
|
514
|
+
module.set.loading();
|
515
|
+
module.request = module.create.request();
|
516
|
+
if (module.is.mocked()) {
|
517
|
+
module.mockedXHR = module.create.mockedXHR();
|
518
|
+
} else {
|
519
|
+
module.xhr = module.create.xhr();
|
520
|
+
}
|
521
|
+
settings.onRequest.call(context, module.request, module.xhr);
|
522
|
+
},
|
523
|
+
},
|
524
|
+
|
525
|
+
event: {
|
526
|
+
trigger: function (event) {
|
527
|
+
module.query();
|
528
|
+
if (event.type === 'submit' || event.type === 'click') {
|
529
|
+
event.preventDefault();
|
530
|
+
}
|
531
|
+
},
|
532
|
+
xhr: {
|
533
|
+
always: function () {
|
534
|
+
// nothing special
|
535
|
+
},
|
536
|
+
done: function (response, textStatus, xhr) {
|
537
|
+
var
|
538
|
+
context = this,
|
539
|
+
elapsedTime = Date.now() - requestStartTime,
|
540
|
+
timeLeft = settings.loadingDuration - elapsedTime,
|
541
|
+
translatedResponse = isFunction(settings.onResponse)
|
542
|
+
? (module.is.expectingJSON() && !settings.rawResponse
|
543
|
+
? settings.onResponse.call(context, $.extend(true, {}, response))
|
544
|
+
: settings.onResponse.call(context, response))
|
545
|
+
: false
|
546
|
+
;
|
547
|
+
timeLeft = timeLeft > 0
|
548
|
+
? timeLeft
|
549
|
+
: 0;
|
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
|
+
} else {
|
561
|
+
module.request.rejectWith(context, [xhr, 'invalid']);
|
562
|
+
}
|
563
|
+
}, timeLeft);
|
564
|
+
},
|
565
|
+
fail: function (xhr, status, httpMessage) {
|
566
|
+
var
|
567
|
+
context = this,
|
568
|
+
elapsedTime = Date.now() - requestStartTime,
|
569
|
+
timeLeft = settings.loadingDuration - elapsedTime
|
570
|
+
;
|
571
|
+
timeLeft = timeLeft > 0
|
572
|
+
? timeLeft
|
573
|
+
: 0;
|
574
|
+
if (timeLeft > 0) {
|
575
|
+
module.debug('Response completed early delaying state change by', timeLeft);
|
576
|
+
}
|
577
|
+
setTimeout(function () {
|
578
|
+
if (module.is.abortedRequest(xhr)) {
|
579
|
+
module.request.rejectWith(context, [xhr, 'aborted', httpMessage]);
|
580
|
+
} else {
|
581
|
+
module.request.rejectWith(context, [xhr, 'error', status, httpMessage]);
|
582
|
+
}
|
583
|
+
}, timeLeft);
|
584
|
+
},
|
585
|
+
},
|
586
|
+
request: {
|
587
|
+
done: function (response, xhr) {
|
588
|
+
module.debug('Successful API Response', response);
|
589
|
+
if (settings.cache === 'local' && url) {
|
590
|
+
module.write.cachedResponse(url, response);
|
591
|
+
module.debug('Saving server response locally', module.cache);
|
592
|
+
}
|
593
|
+
settings.onSuccess.call(context, response, $module, xhr);
|
594
|
+
},
|
595
|
+
complete: function (firstParameter, secondParameter) {
|
596
|
+
var
|
597
|
+
xhr,
|
598
|
+
response
|
599
|
+
;
|
600
|
+
// have to guess callback parameters based on request success
|
601
|
+
if (module.was.successful()) {
|
602
|
+
response = firstParameter;
|
603
|
+
xhr = secondParameter;
|
604
|
+
} else {
|
605
|
+
xhr = firstParameter;
|
606
|
+
response = module.get.responseFromXHR(xhr);
|
607
|
+
}
|
608
|
+
module.remove.loading();
|
609
|
+
settings.onComplete.call(context, response, $module, xhr);
|
610
|
+
},
|
611
|
+
fail: function (xhr, status, httpMessage) {
|
612
|
+
var
|
613
|
+
// pull response from xhr if available
|
614
|
+
response = module.get.responseFromXHR(xhr),
|
615
|
+
errorMessage = module.get.errorFromRequest(response, status, httpMessage)
|
616
|
+
;
|
617
|
+
if (status === 'aborted') {
|
618
|
+
module.debug('XHR Aborted (Most likely caused by page navigation or CORS Policy)', status, httpMessage);
|
619
|
+
settings.onAbort.call(context, status, $module, xhr);
|
620
|
+
|
621
|
+
return true;
|
622
|
+
}
|
623
|
+
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 = Date.now();
|
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
|
+
data.text = $module.text();
|
826
|
+
}
|
827
|
+
}
|
828
|
+
|
829
|
+
return data;
|
830
|
+
},
|
831
|
+
event: function () {
|
832
|
+
if (isWindow(element) || settings.on === 'now') {
|
833
|
+
module.debug('API called without element, no events attached');
|
834
|
+
|
835
|
+
return false;
|
836
|
+
}
|
837
|
+
if (settings.on === 'auto') {
|
838
|
+
if ($module.is('input')) {
|
839
|
+
return element.oninput !== undefined
|
840
|
+
? 'input'
|
841
|
+
: (element.onpropertychange !== undefined
|
842
|
+
? 'propertychange'
|
843
|
+
: 'keyup');
|
844
|
+
}
|
845
|
+
if ($module.is('form')) {
|
846
|
+
return 'submit';
|
847
|
+
}
|
848
|
+
|
849
|
+
return 'click';
|
850
|
+
}
|
851
|
+
|
852
|
+
return settings.on;
|
853
|
+
},
|
854
|
+
templatedURL: function (action) {
|
855
|
+
action = action || settings.action || $module.data(metadata.action) || false;
|
856
|
+
url = settings.url || $module.data(metadata.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
|
-
|
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
|
-
|
420
|
-
|
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 = Date.now();
|
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 (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
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
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
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
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
|
-
|
488
|
-
});
|
1056
|
+
module.initialize();
|
489
1057
|
}
|
1058
|
+
});
|
490
1059
|
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
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
|
+
};
|
1064
|
+
$.api = $.fn.api;
|
509
1065
|
|
510
|
-
|
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
|
-
},
|
1066
|
+
$.api.settings = {
|
523
1067
|
|
524
|
-
|
525
|
-
|
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
|
-
}
|
1068
|
+
name: 'API',
|
1069
|
+
namespace: 'api',
|
639
1070
|
|
640
|
-
|
641
|
-
|
642
|
-
|
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
|
-
},
|
1071
|
+
debug: false,
|
1072
|
+
verbose: false,
|
1073
|
+
performance: true,
|
652
1074
|
|
653
|
-
|
1075
|
+
// object containing all templates endpoints
|
1076
|
+
api: {},
|
654
1077
|
|
655
|
-
|
656
|
-
|
657
|
-
return $.Deferred()
|
658
|
-
.always(module.event.request.complete)
|
659
|
-
.done(module.event.request.done)
|
660
|
-
.fail(module.event.request.fail)
|
661
|
-
;
|
662
|
-
},
|
1078
|
+
// whether to cache responses
|
1079
|
+
cache: true,
|
663
1080
|
|
664
|
-
|
665
|
-
|
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
|
-
;
|
1081
|
+
// whether new requests should abort previous requests
|
1082
|
+
interruptRequests: true,
|
676
1083
|
|
677
|
-
|
678
|
-
|
679
|
-
.done(module.event.xhr.done)
|
680
|
-
.fail(module.event.xhr.fail)
|
681
|
-
;
|
1084
|
+
// event binding
|
1085
|
+
on: 'auto',
|
682
1086
|
|
683
|
-
|
684
|
-
|
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);
|
1087
|
+
// context for applying state classes
|
1088
|
+
stateContext: false,
|
698
1089
|
|
699
|
-
|
700
|
-
|
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
|
-
},
|
1090
|
+
// duration for loading state
|
1091
|
+
loadingDuration: 0,
|
711
1092
|
|
712
|
-
|
713
|
-
|
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
|
-
},
|
1093
|
+
// whether to hide errors after a period of time
|
1094
|
+
hideError: 'auto',
|
726
1095
|
|
727
|
-
|
728
|
-
|
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
|
-
},
|
1096
|
+
// duration for error state
|
1097
|
+
errorDuration: 2000,
|
738
1098
|
|
739
|
-
|
740
|
-
|
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
|
-
},
|
1099
|
+
// whether parameters should be encoded with encodeURIComponent
|
1100
|
+
encodeParameters: true,
|
749
1101
|
|
750
|
-
|
751
|
-
|
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
|
-
},
|
1102
|
+
// API action to use
|
1103
|
+
action: false,
|
886
1104
|
|
887
|
-
|
888
|
-
|
889
|
-
xhr = module.get.xhr()
|
890
|
-
;
|
891
|
-
if( xhr && xhr.state() !== 'resolved') {
|
892
|
-
module.debug('Cancelling API request');
|
893
|
-
xhr.abort();
|
894
|
-
}
|
895
|
-
},
|
1105
|
+
// templated URL to use
|
1106
|
+
url: false,
|
896
1107
|
|
897
|
-
//
|
898
|
-
|
899
|
-
module.remove.error();
|
900
|
-
module.remove.loading();
|
901
|
-
},
|
1108
|
+
// base URL to apply to all endpoints
|
1109
|
+
base: '',
|
902
1110
|
|
903
|
-
|
904
|
-
|
905
|
-
|
906
|
-
|
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) { },
|
1111
|
+
// data that will
|
1112
|
+
urlData: {},
|
1113
|
+
|
1114
|
+
// whether to add default data to url data
|
1115
|
+
defaultData: true,
|
1172
1116
|
|
1173
|
-
|
1174
|
-
|
1117
|
+
// whether to serialize closest form
|
1118
|
+
// use true to convert complex named keys like a[b][1][c][] into a nested object
|
1119
|
+
// use 'formdata' for formdata web api
|
1120
|
+
serializeForm: false,
|
1175
1121
|
|
1176
|
-
|
1177
|
-
|
1122
|
+
// how long to wait before request should occur
|
1123
|
+
throttle: 0,
|
1178
1124
|
|
1179
|
-
|
1180
|
-
|
1125
|
+
// whether to throttle first request or only repeated
|
1126
|
+
throttleFirstRequest: true,
|
1181
1127
|
|
1182
|
-
|
1183
|
-
|
1128
|
+
// standard ajax settings
|
1129
|
+
method: 'get',
|
1130
|
+
data: {},
|
1131
|
+
dataType: 'json',
|
1184
1132
|
|
1185
|
-
|
1186
|
-
|
1133
|
+
// mock response
|
1134
|
+
mockResponse: false,
|
1135
|
+
mockResponseAsync: false,
|
1187
1136
|
|
1188
|
-
|
1137
|
+
// aliases for mock
|
1138
|
+
response: false,
|
1139
|
+
responseAsync: false,
|
1189
1140
|
|
1190
|
-
|
1191
|
-
|
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
|
-
},
|
1141
|
+
// whether onResponse should work with response value without force converting into an object
|
1142
|
+
rawResponse: true,
|
1207
1143
|
|
1208
|
-
|
1209
|
-
|
1210
|
-
|
1211
|
-
|
1212
|
-
|
1213
|
-
|
1214
|
-
|
1215
|
-
|
1216
|
-
|
1217
|
-
|
1218
|
-
|
1219
|
-
|
1220
|
-
|
1221
|
-
|
1144
|
+
// callbacks before request
|
1145
|
+
beforeSend: function (settings) {
|
1146
|
+
return settings;
|
1147
|
+
},
|
1148
|
+
beforeXHR: function (xhr) {},
|
1149
|
+
onRequest: function (promise, xhr) {},
|
1150
|
+
|
1151
|
+
// after request
|
1152
|
+
onResponse: false, // function(response) { },
|
1153
|
+
|
1154
|
+
// response was successful, if JSON passed validation
|
1155
|
+
onSuccess: function (response, $module) {},
|
1156
|
+
|
1157
|
+
// request finished without aborting
|
1158
|
+
onComplete: function (response, $module) {},
|
1159
|
+
|
1160
|
+
// failed JSON success test
|
1161
|
+
onFailure: function (response, $module) {},
|
1162
|
+
|
1163
|
+
// server error
|
1164
|
+
onError: function (errorMessage, $module) {},
|
1165
|
+
|
1166
|
+
// request aborted
|
1167
|
+
onAbort: function (errorMessage, $module) {},
|
1168
|
+
|
1169
|
+
successTest: false,
|
1170
|
+
|
1171
|
+
// errors
|
1172
|
+
error: {
|
1173
|
+
beforeSend: 'The before send function has aborted the request',
|
1174
|
+
error: 'There was an error with your request',
|
1175
|
+
exitConditions: 'API Request Aborted. Exit conditions met',
|
1176
|
+
JSONParse: 'JSON could not be parsed during error handling',
|
1177
|
+
legacyParameters: 'You are using legacy API success callback names',
|
1178
|
+
method: 'The method you called is not defined',
|
1179
|
+
missingAction: 'API action used but no url was defined',
|
1180
|
+
missingURL: 'No URL specified for api event',
|
1181
|
+
noReturnedValue: 'The beforeSend callback must return a settings object, beforeSend ignored.',
|
1182
|
+
noStorage: 'Caching responses locally requires session storage',
|
1183
|
+
parseError: 'There was an error parsing your request',
|
1184
|
+
requiredParameter: 'Missing a required URL parameter: ',
|
1185
|
+
statusMessage: 'Server gave an error: ',
|
1186
|
+
timeout: 'Your request timed out',
|
1187
|
+
},
|
1222
1188
|
|
1223
|
-
|
1224
|
-
|
1225
|
-
|
1226
|
-
|
1227
|
-
|
1228
|
-
|
1229
|
-
|
1230
|
-
|
1231
|
-
|
1232
|
-
|
1233
|
-
|
1234
|
-
|
1235
|
-
|
1236
|
-
}
|
1189
|
+
regExp: {
|
1190
|
+
required: /{\$*[\da-z]+}/gi,
|
1191
|
+
optional: /{\/\$*[\da-z]+}/gi,
|
1192
|
+
validate: /^[_a-z][\w-]*(?:\[[\w-]*])*$/i,
|
1193
|
+
key: /[\w-]+|(?=\[])/gi,
|
1194
|
+
push: /^$/,
|
1195
|
+
fixed: /^\d+$/,
|
1196
|
+
named: /^[\w-]+$/i,
|
1197
|
+
},
|
1198
|
+
|
1199
|
+
className: {
|
1200
|
+
loading: 'loading',
|
1201
|
+
error: 'error',
|
1202
|
+
},
|
1203
|
+
|
1204
|
+
selector: {
|
1205
|
+
disabled: '.disabled',
|
1206
|
+
form: 'form',
|
1207
|
+
},
|
1208
|
+
|
1209
|
+
metadata: {
|
1210
|
+
action: 'action',
|
1211
|
+
url: 'url',
|
1212
|
+
},
|
1213
|
+
};
|
1214
|
+
})(jQuery, window, document);
|