fluentd-ui 0.1.0

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.

Potentially problematic release.


This version of fluentd-ui might be problematic. Click here for more details.

Files changed (320) hide show
  1. checksums.yaml +7 -0
  2. data/.bowerrc +3 -0
  3. data/.gitignore +31 -0
  4. data/.rspec +1 -0
  5. data/ChangeLog +3 -0
  6. data/Gemfile +21 -0
  7. data/Gemfile.lock +247 -0
  8. data/Gemfile.production +3 -0
  9. data/README.md +53 -0
  10. data/Rakefile +8 -0
  11. data/app/assets/images/.keep +0 -0
  12. data/app/assets/javascripts/alert.js +51 -0
  13. data/app/assets/javascripts/application.js +22 -0
  14. data/app/assets/javascripts/nested_setting.js +41 -0
  15. data/app/assets/javascripts/setting_format.js +15 -0
  16. data/app/assets/javascripts/tutorial.js +58 -0
  17. data/app/assets/javascripts/vue/fluent_log.js +64 -0
  18. data/app/assets/javascripts/vue/in_tail_format.js +153 -0
  19. data/app/assets/javascripts/vue/treeview.js +97 -0
  20. data/app/assets/javascripts/vue_common.js +4 -0
  21. data/app/assets/stylesheets/application.css +18 -0
  22. data/app/assets/stylesheets/common.css.scss +152 -0
  23. data/app/controllers/api_controller.rb +37 -0
  24. data/app/controllers/application_controller.rb +110 -0
  25. data/app/controllers/concerns/.keep +0 -0
  26. data/app/controllers/fluentd/agents_controller.rb +35 -0
  27. data/app/controllers/fluentd/settings/in_syslog_controller.rb +34 -0
  28. data/app/controllers/fluentd/settings/in_tail_controller.rb +57 -0
  29. data/app/controllers/fluentd/settings/out_forward_controller.rb +42 -0
  30. data/app/controllers/fluentd/settings/out_mongo_controller.rb +36 -0
  31. data/app/controllers/fluentd/settings/out_s3_controller.rb +36 -0
  32. data/app/controllers/fluentd/settings/out_td_controller.rb +36 -0
  33. data/app/controllers/fluentd/settings_controller.rb +18 -0
  34. data/app/controllers/fluentd_controller.rb +62 -0
  35. data/app/controllers/misc_controller.rb +69 -0
  36. data/app/controllers/plugins_controller.rb +44 -0
  37. data/app/controllers/polling_controller.rb +20 -0
  38. data/app/controllers/sessions_controller.rb +45 -0
  39. data/app/controllers/tutorials_controller.rb +40 -0
  40. data/app/controllers/users_controller.rb +28 -0
  41. data/app/controllers/welcome_controller.rb +5 -0
  42. data/app/helpers/application_helper.rb +55 -0
  43. data/app/helpers/fluentd/settings_helper.rb +2 -0
  44. data/app/helpers/miscs_helper.rb +2 -0
  45. data/app/helpers/settings_helper.rb +43 -0
  46. data/app/mailers/.keep +0 -0
  47. data/app/models/.keep +0 -0
  48. data/app/models/concerns/.keep +0 -0
  49. data/app/models/fluentd.rb +178 -0
  50. data/app/models/fluentd/agent.rb +28 -0
  51. data/app/models/fluentd/agent/common.rb +76 -0
  52. data/app/models/fluentd/agent/configuration.rb +35 -0
  53. data/app/models/fluentd/agent/fluentd_gem.rb +104 -0
  54. data/app/models/fluentd/agent/local_common.rb +101 -0
  55. data/app/models/fluentd/agent/remote.rb +7 -0
  56. data/app/models/fluentd/agent/td_agent.rb +44 -0
  57. data/app/models/fluentd/api.rb +6 -0
  58. data/app/models/fluentd/api/http.rb +26 -0
  59. data/app/models/fluentd/setting.rb +4 -0
  60. data/app/models/fluentd/setting/common.rb +185 -0
  61. data/app/models/fluentd/setting/in_syslog.rb +16 -0
  62. data/app/models/fluentd/setting/in_tail.rb +107 -0
  63. data/app/models/fluentd/setting/out_forward.rb +70 -0
  64. data/app/models/fluentd/setting/out_mongo.rb +35 -0
  65. data/app/models/fluentd/setting/out_s3.rb +29 -0
  66. data/app/models/fluentd/setting/out_td.rb +26 -0
  67. data/app/models/plugin.rb +193 -0
  68. data/app/models/settings.rb +4 -0
  69. data/app/models/user.rb +52 -0
  70. data/app/views/fluentd/_form.html.haml +31 -0
  71. data/app/views/fluentd/edit.html.haml +3 -0
  72. data/app/views/fluentd/errors.html.haml +19 -0
  73. data/app/views/fluentd/log.html.haml +9 -0
  74. data/app/views/fluentd/new.html.haml +3 -0
  75. data/app/views/fluentd/settings/_form.html.haml +43 -0
  76. data/app/views/fluentd/settings/edit.html.haml +7 -0
  77. data/app/views/fluentd/settings/in_syslog/_form.html.haml +9 -0
  78. data/app/views/fluentd/settings/in_syslog/show.html.haml +6 -0
  79. data/app/views/fluentd/settings/in_tail/_form.html.haml +42 -0
  80. data/app/views/fluentd/settings/in_tail/after_file_choose.html.haml +19 -0
  81. data/app/views/fluentd/settings/in_tail/after_format.html.haml +10 -0
  82. data/app/views/fluentd/settings/in_tail/confirm.html.haml +13 -0
  83. data/app/views/fluentd/settings/in_tail/show.html.haml +5 -0
  84. data/app/views/fluentd/settings/out_forward/_form.html.haml +22 -0
  85. data/app/views/fluentd/settings/out_forward/show.html.haml +6 -0
  86. data/app/views/fluentd/settings/out_mongo/_form.html.haml +30 -0
  87. data/app/views/fluentd/settings/out_mongo/finish.html.haml +4 -0
  88. data/app/views/fluentd/settings/out_mongo/show.html.haml +6 -0
  89. data/app/views/fluentd/settings/out_s3/_form.html.haml +39 -0
  90. data/app/views/fluentd/settings/out_s3/show.html.haml +6 -0
  91. data/app/views/fluentd/settings/out_td/_form.html.haml +18 -0
  92. data/app/views/fluentd/settings/out_td/show.html.haml +6 -0
  93. data/app/views/fluentd/settings/show.html.haml +10 -0
  94. data/app/views/fluentd/settings/source_and_output.html.haml +45 -0
  95. data/app/views/fluentd/show.html.haml +60 -0
  96. data/app/views/layouts/application.html.erb +102 -0
  97. data/app/views/layouts/sign_in.html.erb +28 -0
  98. data/app/views/misc/information.html.haml +75 -0
  99. data/app/views/misc/update_fluentd_ui.html.haml +45 -0
  100. data/app/views/plugins/installed.html.haml +67 -0
  101. data/app/views/plugins/recommended.html.haml +59 -0
  102. data/app/views/plugins/updated.html.haml +29 -0
  103. data/app/views/sessions/new.html.haml +13 -0
  104. data/app/views/shared/_error.html.haml +3 -0
  105. data/app/views/shared/_flash.html.haml +10 -0
  106. data/app/views/shared/_fluentd_nav.html.haml +12 -0
  107. data/app/views/shared/_global_nav.html.erb +80 -0
  108. data/app/views/shared/_initial_setup.html.haml +13 -0
  109. data/app/views/shared/_modal.html.erb +25 -0
  110. data/app/views/shared/_setting_errors.html.haml +5 -0
  111. data/app/views/shared/vue/_fluent_log.html.erb +25 -0
  112. data/app/views/shared/vue/_in_tail_format.html.erb +53 -0
  113. data/app/views/shared/vue/_treeview.html.erb +30 -0
  114. data/app/views/tutorials/chapter1.html.erb +31 -0
  115. data/app/views/tutorials/chapter2.html.haml +12 -0
  116. data/app/views/tutorials/chapter3.html.haml +12 -0
  117. data/app/views/tutorials/chapter4.html.haml +12 -0
  118. data/app/views/tutorials/chapter5.html.haml +10 -0
  119. data/app/views/tutorials/index.html.haml +26 -0
  120. data/app/views/users/show.html.haml +22 -0
  121. data/app/workers/all_plugin_check_update.rb +14 -0
  122. data/app/workers/fluentd_ui_restart.rb +41 -0
  123. data/app/workers/fluentd_ui_update_check.rb +15 -0
  124. data/app/workers/gem_installer.rb +17 -0
  125. data/app/workers/gem_uninstaller.rb +15 -0
  126. data/app/workers/gem_update_check.rb +10 -0
  127. data/bin/bundle +3 -0
  128. data/bin/fluentd-ui +13 -0
  129. data/bin/fluentd-ui-restart +12 -0
  130. data/bin/rails +8 -0
  131. data/bin/rake +8 -0
  132. data/bin/spring +18 -0
  133. data/bower.json +10 -0
  134. data/circle.yml +8 -0
  135. data/config.ru +4 -0
  136. data/config/application.rb +48 -0
  137. data/config/application.yml +211 -0
  138. data/config/boot.rb +4 -0
  139. data/config/environment.rb +5 -0
  140. data/config/environments/development.rb +36 -0
  141. data/config/environments/production.rb +69 -0
  142. data/config/environments/test.rb +40 -0
  143. data/config/initializers/backtrace_silencers.rb +7 -0
  144. data/config/initializers/cookies_serializer.rb +3 -0
  145. data/config/initializers/filter_parameter_logging.rb +4 -0
  146. data/config/initializers/inflections.rb +16 -0
  147. data/config/initializers/mime_types.rb +4 -0
  148. data/config/initializers/prefetch_gem_updates.rb +1 -0
  149. data/config/initializers/session_store.rb +3 -0
  150. data/config/initializers/wrap_parameters.rb +14 -0
  151. data/config/locales/en.yml +204 -0
  152. data/config/locales/ja.yml +194 -0
  153. data/config/locales/translation_en.yml +255 -0
  154. data/config/locales/translation_ja.yml +255 -0
  155. data/config/locales/tutorial_en.yml +117 -0
  156. data/config/locales/tutorial_ja.yml +120 -0
  157. data/config/routes.rb +93 -0
  158. data/config/secrets.yml +22 -0
  159. data/db/schema.rb +0 -0
  160. data/db/seeds.rb +11 -0
  161. data/fluentd-ui-ss01.png +0 -0
  162. data/fluentd-ui-ss02.png +0 -0
  163. data/fluentd-ui-ss03.png +0 -0
  164. data/fluentd-ui-ss04.png +0 -0
  165. data/fluentd-ui-ss05.png +0 -0
  166. data/fluentd-ui.gemspec +46 -0
  167. data/lib/assets/.keep +0 -0
  168. data/lib/file_reverse_reader.rb +56 -0
  169. data/lib/fluentd-ui.rb +22 -0
  170. data/lib/fluentd-ui/command.rb +52 -0
  171. data/lib/fluentd-ui/version.rb +3 -0
  172. data/lib/grok_converter.rb +39 -0
  173. data/lib/regexp_preview.rb +48 -0
  174. data/lib/tasks/.keep +0 -0
  175. data/lib/treeview.rb +45 -0
  176. data/log/.keep +0 -0
  177. data/public/404.html +67 -0
  178. data/public/422.html +67 -0
  179. data/public/500.html +66 -0
  180. data/public/favicon.ico +0 -0
  181. data/public/fluentd-logo-right-text.png +0 -0
  182. data/public/fluentd-logo.png +0 -0
  183. data/public/fluentd.png +0 -0
  184. data/public/robots.txt +5 -0
  185. data/spec/controllers/plugins_controller_spec.rb +5 -0
  186. data/spec/controllers/polling_controller_spec.rb +5 -0
  187. data/spec/controllers/sessions_controller_spec.rb +5 -0
  188. data/spec/controllers/tutorials_controller_spec.rb +5 -0
  189. data/spec/factories/fluentd.rb +11 -0
  190. data/spec/factories/plugins.rb +8 -0
  191. data/spec/factories/user.rb +6 -0
  192. data/spec/features/fluentd/setting/out_forward_spec.rb +45 -0
  193. data/spec/features/fluentd/setting/out_td_spec.rb +35 -0
  194. data/spec/features/sessions_spec.rb +55 -0
  195. data/spec/features/shared_examples/login_required.rb +4 -0
  196. data/spec/features/users_spec.rb +9 -0
  197. data/spec/grok_converter_spec.rb +50 -0
  198. data/spec/lib/file_reverse_reader_spec.rb +73 -0
  199. data/spec/lib/fluentd-ui_spec.rb +35 -0
  200. data/spec/models/fluentd/agent_spec.rb +91 -0
  201. data/spec/models/fluentd/setting/common_spec.rb +178 -0
  202. data/spec/models/fluentd/setting/in_syslog_spec.rb +35 -0
  203. data/spec/models/fluentd/setting/out_mongo_spec.rb +40 -0
  204. data/spec/models/fluentd/setting/out_td_spec.rb +38 -0
  205. data/spec/models/fluentd_spec.rb +166 -0
  206. data/spec/models/plugin_spec.rb +191 -0
  207. data/spec/models/user_spec.rb +15 -0
  208. data/spec/spec_helper.rb +58 -0
  209. data/spec/support/fixtures/error0.log +12 -0
  210. data/spec/support/fixtures/error2.log +130 -0
  211. data/spec/support/fluentd_agent_common_behavior.rb +114 -0
  212. data/spec/support/fluentd_agent_restart_strategy.rb +94 -0
  213. data/tmp/.gitkeep +0 -0
  214. data/vendor/assets/javascripts/.keep +0 -0
  215. data/vendor/assets/javascripts/bower/es6-promise/.bower.json +15 -0
  216. data/vendor/assets/javascripts/bower/es6-promise/bower.json +5 -0
  217. data/vendor/assets/javascripts/bower/es6-promise/promise.js +684 -0
  218. data/vendor/assets/javascripts/bower/es6-promise/promise.min.js +1 -0
  219. data/vendor/assets/javascripts/bower/lodash/.bower.json +33 -0
  220. data/vendor/assets/javascripts/bower/lodash/LICENSE.txt +22 -0
  221. data/vendor/assets/javascripts/bower/lodash/bower.json +23 -0
  222. data/vendor/assets/javascripts/bower/lodash/dist/lodash.compat.js +7157 -0
  223. data/vendor/assets/javascripts/bower/lodash/dist/lodash.compat.min.js +61 -0
  224. data/vendor/assets/javascripts/bower/lodash/dist/lodash.js +6785 -0
  225. data/vendor/assets/javascripts/bower/lodash/dist/lodash.min.js +56 -0
  226. data/vendor/assets/javascripts/bower/lodash/dist/lodash.underscore.js +4979 -0
  227. data/vendor/assets/javascripts/bower/lodash/dist/lodash.underscore.min.js +39 -0
  228. data/vendor/assets/javascripts/bower/vue/.bower.json +29 -0
  229. data/vendor/assets/javascripts/bower/vue/LICENSE +21 -0
  230. data/vendor/assets/javascripts/bower/vue/dist/vue.js +4713 -0
  231. data/vendor/assets/javascripts/bower/vue/dist/vue.min.js +7 -0
  232. data/vendor/assets/javascripts/bower/vue/src/batcher.js +45 -0
  233. data/vendor/assets/javascripts/bower/vue/src/binding.js +103 -0
  234. data/vendor/assets/javascripts/bower/vue/src/compiler.js +1037 -0
  235. data/vendor/assets/javascripts/bower/vue/src/config.js +19 -0
  236. data/vendor/assets/javascripts/bower/vue/src/deps-parser.js +65 -0
  237. data/vendor/assets/javascripts/bower/vue/src/directive.js +258 -0
  238. data/vendor/assets/javascripts/bower/vue/src/directives/html.js +41 -0
  239. data/vendor/assets/javascripts/bower/vue/src/directives/if.js +56 -0
  240. data/vendor/assets/javascripts/bower/vue/src/directives/index.js +129 -0
  241. data/vendor/assets/javascripts/bower/vue/src/directives/model.js +174 -0
  242. data/vendor/assets/javascripts/bower/vue/src/directives/on.js +56 -0
  243. data/vendor/assets/javascripts/bower/vue/src/directives/partial.js +50 -0
  244. data/vendor/assets/javascripts/bower/vue/src/directives/repeat.js +246 -0
  245. data/vendor/assets/javascripts/bower/vue/src/directives/style.js +40 -0
  246. data/vendor/assets/javascripts/bower/vue/src/directives/view.js +56 -0
  247. data/vendor/assets/javascripts/bower/vue/src/directives/with.js +50 -0
  248. data/vendor/assets/javascripts/bower/vue/src/emitter.js +97 -0
  249. data/vendor/assets/javascripts/bower/vue/src/exp-parser.js +190 -0
  250. data/vendor/assets/javascripts/bower/vue/src/filters.js +190 -0
  251. data/vendor/assets/javascripts/bower/vue/src/fragment.js +84 -0
  252. data/vendor/assets/javascripts/bower/vue/src/main.js +186 -0
  253. data/vendor/assets/javascripts/bower/vue/src/observer.js +446 -0
  254. data/vendor/assets/javascripts/bower/vue/src/text-parser.js +96 -0
  255. data/vendor/assets/javascripts/bower/vue/src/transition.js +228 -0
  256. data/vendor/assets/javascripts/bower/vue/src/utils.js +321 -0
  257. data/vendor/assets/javascripts/bower/vue/src/viewmodel.js +180 -0
  258. data/vendor/assets/javascripts/sb-admin-v2/bootstrap.js +1951 -0
  259. data/vendor/assets/javascripts/sb-admin-v2/bootstrap.min.js +6 -0
  260. data/vendor/assets/javascripts/sb-admin-v2/demo/dashboard-demo.js +117 -0
  261. data/vendor/assets/javascripts/sb-admin-v2/demo/flot-demo.js +1242 -0
  262. data/vendor/assets/javascripts/sb-admin-v2/demo/morris-demo.js +155 -0
  263. data/vendor/assets/javascripts/sb-admin-v2/jquery-1.10.2.js +6 -0
  264. data/vendor/assets/javascripts/sb-admin-v2/plugins/dataTables/dataTables.bootstrap.js +245 -0
  265. data/vendor/assets/javascripts/sb-admin-v2/plugins/dataTables/jquery.dataTables.js +14013 -0
  266. data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/excanvas.min.js +1 -0
  267. data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/jquery.flot.js +2599 -0
  268. data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/jquery.flot.pie.js +750 -0
  269. data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/jquery.flot.resize.js +60 -0
  270. data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/jquery.flot.tooltip.min.js +12 -0
  271. data/vendor/assets/javascripts/sb-admin-v2/plugins/metisMenu/jquery.metisMenu.js +45 -0
  272. data/vendor/assets/javascripts/sb-admin-v2/plugins/morris/morris.js +1888 -0
  273. data/vendor/assets/javascripts/sb-admin-v2/plugins/morris/raphael-2.1.0.min.js +10 -0
  274. data/vendor/assets/javascripts/sb-admin-v2/sb-admin.js +18 -0
  275. data/vendor/assets/stylesheets/.keep +0 -0
  276. data/vendor/assets/stylesheets/sb-admin-v2/bootstrap.css +5830 -0
  277. data/vendor/assets/stylesheets/sb-admin-v2/bootstrap.min.css +7 -0
  278. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/css/font-awesome.css +1338 -0
  279. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/css/font-awesome.min.css +4 -0
  280. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/fonts/FontAwesome.otf +0 -0
  281. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/fonts/fontawesome-webfont.eot +0 -0
  282. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/fonts/fontawesome-webfont.svg +414 -0
  283. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
  284. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/fonts/fontawesome-webfont.woff +0 -0
  285. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_bordered-pulled.scss +16 -0
  286. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_core.scss +12 -0
  287. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_fixed-width.scss +6 -0
  288. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_icons.scss +412 -0
  289. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_larger.scss +13 -0
  290. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_list.scss +19 -0
  291. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_mixins.scss +20 -0
  292. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_path.scss +14 -0
  293. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_rotated-flipped.scss +9 -0
  294. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_spinning.scss +30 -0
  295. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_stacked.scss +20 -0
  296. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_variables.scss +381 -0
  297. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/font-awesome.scss +17 -0
  298. data/vendor/assets/stylesheets/sb-admin-v2/fonts/glyphicons-halflings-regular.eot +0 -0
  299. data/vendor/assets/stylesheets/sb-admin-v2/fonts/glyphicons-halflings-regular.svg +229 -0
  300. data/vendor/assets/stylesheets/sb-admin-v2/fonts/glyphicons-halflings-regular.ttf +0 -0
  301. data/vendor/assets/stylesheets/sb-admin-v2/fonts/glyphicons-halflings-regular.woff +0 -0
  302. data/vendor/assets/stylesheets/sb-admin-v2/plugins/dataTables/dataTables.bootstrap.css +233 -0
  303. data/vendor/assets/stylesheets/sb-admin-v2/plugins/morris/morris-0.4.3.min.css +2 -0
  304. data/vendor/assets/stylesheets/sb-admin-v2/plugins/social-buttons/social-buttons.css +68 -0
  305. data/vendor/assets/stylesheets/sb-admin-v2/plugins/timeline/timeline.css +144 -0
  306. data/vendor/assets/stylesheets/sb-admin-v2/sb-admin.css +329 -0
  307. data/vendor/patterns/firewalls +60 -0
  308. data/vendor/patterns/grok-patterns +94 -0
  309. data/vendor/patterns/haproxy +37 -0
  310. data/vendor/patterns/java +3 -0
  311. data/vendor/patterns/junos +9 -0
  312. data/vendor/patterns/linux-syslog +16 -0
  313. data/vendor/patterns/mcollective +1 -0
  314. data/vendor/patterns/mcollective-patterns +4 -0
  315. data/vendor/patterns/mongodb +4 -0
  316. data/vendor/patterns/nagios +108 -0
  317. data/vendor/patterns/postgresql +3 -0
  318. data/vendor/patterns/redis +3 -0
  319. data/vendor/patterns/ruby +2 -0
  320. metadata +659 -0
@@ -0,0 +1,174 @@
1
+ var utils = require('../utils'),
2
+ isIE9 = navigator.userAgent.indexOf('MSIE 9.0') > 0,
3
+ filter = [].filter
4
+
5
+ /**
6
+ * Returns an array of values from a multiple select
7
+ */
8
+ function getMultipleSelectOptions (select) {
9
+ return filter
10
+ .call(select.options, function (option) {
11
+ return option.selected
12
+ })
13
+ .map(function (option) {
14
+ return option.value || option.text
15
+ })
16
+ }
17
+
18
+ /**
19
+ * Two-way binding for form input elements
20
+ */
21
+ module.exports = {
22
+
23
+ bind: function () {
24
+
25
+ var self = this,
26
+ el = self.el,
27
+ type = el.type,
28
+ tag = el.tagName
29
+
30
+ self.lock = false
31
+ self.ownerVM = self.binding.compiler.vm
32
+
33
+ // determine what event to listen to
34
+ self.event =
35
+ (self.compiler.options.lazy ||
36
+ tag === 'SELECT' ||
37
+ type === 'checkbox' || type === 'radio')
38
+ ? 'change'
39
+ : 'input'
40
+
41
+ // determine the attribute to change when updating
42
+ self.attr = type === 'checkbox'
43
+ ? 'checked'
44
+ : (tag === 'INPUT' || tag === 'SELECT' || tag === 'TEXTAREA')
45
+ ? 'value'
46
+ : 'innerHTML'
47
+
48
+ // select[multiple] support
49
+ if(tag === 'SELECT' && el.hasAttribute('multiple')) {
50
+ this.multi = true
51
+ }
52
+
53
+ var compositionLock = false
54
+ self.cLock = function () {
55
+ compositionLock = true
56
+ }
57
+ self.cUnlock = function () {
58
+ compositionLock = false
59
+ }
60
+ el.addEventListener('compositionstart', this.cLock)
61
+ el.addEventListener('compositionend', this.cUnlock)
62
+
63
+ // attach listener
64
+ self.set = self.filters
65
+ ? function () {
66
+ if (compositionLock) return
67
+ // if this directive has filters
68
+ // we need to let the vm.$set trigger
69
+ // update() so filters are applied.
70
+ // therefore we have to record cursor position
71
+ // so that after vm.$set changes the input
72
+ // value we can put the cursor back at where it is
73
+ var cursorPos
74
+ try { cursorPos = el.selectionStart } catch (e) {}
75
+
76
+ self._set()
77
+
78
+ // since updates are async
79
+ // we need to reset cursor position async too
80
+ utils.nextTick(function () {
81
+ if (cursorPos !== undefined) {
82
+ el.setSelectionRange(cursorPos, cursorPos)
83
+ }
84
+ })
85
+ }
86
+ : function () {
87
+ if (compositionLock) return
88
+ // no filters, don't let it trigger update()
89
+ self.lock = true
90
+
91
+ self._set()
92
+
93
+ utils.nextTick(function () {
94
+ self.lock = false
95
+ })
96
+ }
97
+ el.addEventListener(self.event, self.set)
98
+
99
+ // fix shit for IE9
100
+ // since it doesn't fire input on backspace / del / cut
101
+ if (isIE9) {
102
+ self.onCut = function () {
103
+ // cut event fires before the value actually changes
104
+ utils.nextTick(function () {
105
+ self.set()
106
+ })
107
+ }
108
+ self.onDel = function (e) {
109
+ if (e.keyCode === 46 || e.keyCode === 8) {
110
+ self.set()
111
+ }
112
+ }
113
+ el.addEventListener('cut', self.onCut)
114
+ el.addEventListener('keyup', self.onDel)
115
+ }
116
+ },
117
+
118
+ _set: function () {
119
+ this.ownerVM.$set(
120
+ this.key, this.multi
121
+ ? getMultipleSelectOptions(this.el)
122
+ : this.el[this.attr]
123
+ )
124
+ },
125
+
126
+ update: function (value, init) {
127
+ /* jshint eqeqeq: false */
128
+ // sync back inline value if initial data is undefined
129
+ if (init && value === undefined) {
130
+ return this._set()
131
+ }
132
+ if (this.lock) return
133
+ var el = this.el
134
+ if (el.tagName === 'SELECT') { // select dropdown
135
+ el.selectedIndex = -1
136
+ if(this.multi && Array.isArray(value)) {
137
+ value.forEach(this.updateSelect, this)
138
+ } else {
139
+ this.updateSelect(value)
140
+ }
141
+ } else if (el.type === 'radio') { // radio button
142
+ el.checked = value == el.value
143
+ } else if (el.type === 'checkbox') { // checkbox
144
+ el.checked = !!value
145
+ } else {
146
+ el[this.attr] = utils.guard(value)
147
+ }
148
+ },
149
+
150
+ updateSelect: function (value) {
151
+ /* jshint eqeqeq: false */
152
+ // setting <select>'s value in IE9 doesn't work
153
+ // we have to manually loop through the options
154
+ var options = this.el.options,
155
+ i = options.length
156
+ while (i--) {
157
+ if (options[i].value == value) {
158
+ options[i].selected = true
159
+ break
160
+ }
161
+ }
162
+ },
163
+
164
+ unbind: function () {
165
+ var el = this.el
166
+ el.removeEventListener(this.event, this.set)
167
+ el.removeEventListener('compositionstart', this.cLock)
168
+ el.removeEventListener('compositionend', this.cUnlock)
169
+ if (isIE9) {
170
+ el.removeEventListener('cut', this.onCut)
171
+ el.removeEventListener('keyup', this.onDel)
172
+ }
173
+ }
174
+ }
@@ -0,0 +1,56 @@
1
+ var utils = require('../utils')
2
+
3
+ /**
4
+ * Binding for event listeners
5
+ */
6
+ module.exports = {
7
+
8
+ isFn: true,
9
+
10
+ bind: function () {
11
+ this.context = this.binding.isExp
12
+ ? this.vm
13
+ : this.binding.compiler.vm
14
+ if (this.el.tagName === 'IFRAME' && this.arg !== 'load') {
15
+ var self = this
16
+ this.iframeBind = function () {
17
+ self.el.contentWindow.addEventListener(self.arg, self.handler)
18
+ }
19
+ this.el.addEventListener('load', this.iframeBind)
20
+ }
21
+ },
22
+
23
+ update: function (handler) {
24
+ if (typeof handler !== 'function') {
25
+ utils.warn('Directive "v-on:' + this.expression + '" expects a method.')
26
+ return
27
+ }
28
+ this.reset()
29
+ var vm = this.vm,
30
+ context = this.context
31
+ this.handler = function (e) {
32
+ e.targetVM = vm
33
+ context.$event = e
34
+ var res = handler.call(context, e)
35
+ context.$event = null
36
+ return res
37
+ }
38
+ if (this.iframeBind) {
39
+ this.iframeBind()
40
+ } else {
41
+ this.el.addEventListener(this.arg, this.handler)
42
+ }
43
+ },
44
+
45
+ reset: function () {
46
+ var el = this.iframeBind
47
+ ? this.el.contentWindow
48
+ : this.el
49
+ el.removeEventListener(this.arg, this.handler)
50
+ },
51
+
52
+ unbind: function () {
53
+ this.reset()
54
+ this.el.removeEventListener('load', this.iframeBind)
55
+ }
56
+ }
@@ -0,0 +1,50 @@
1
+ var utils = require('../utils')
2
+
3
+ /**
4
+ * Binding for partials
5
+ */
6
+ module.exports = {
7
+
8
+ isLiteral: true,
9
+
10
+ bind: function () {
11
+
12
+ var id = this.expression
13
+ if (!id) return
14
+
15
+ var el = this.el,
16
+ compiler = this.compiler,
17
+ partial = compiler.getOption('partials', id)
18
+
19
+ if (!partial) {
20
+ if (id === 'yield') {
21
+ utils.warn('{{>yield}} syntax has been deprecated. Use <content> tag instead.')
22
+ }
23
+ return
24
+ }
25
+
26
+ partial = partial.cloneNode(true)
27
+
28
+ // comment ref node means inline partial
29
+ if (el.nodeType === 8) {
30
+
31
+ // keep a ref for the partial's content nodes
32
+ var nodes = [].slice.call(partial.childNodes),
33
+ parent = el.parentNode
34
+ parent.insertBefore(partial, el)
35
+ parent.removeChild(el)
36
+ // compile partial after appending, because its children's parentNode
37
+ // will change from the fragment to the correct parentNode.
38
+ // This could affect directives that need access to its element's parentNode.
39
+ nodes.forEach(compiler.compile, compiler)
40
+
41
+ } else {
42
+
43
+ // just set innerHTML...
44
+ el.innerHTML = ''
45
+ el.appendChild(partial)
46
+
47
+ }
48
+ }
49
+
50
+ }
@@ -0,0 +1,246 @@
1
+ var utils = require('../utils'),
2
+ config = require('../config')
3
+
4
+ /**
5
+ * Binding that manages VMs based on an Array
6
+ */
7
+ module.exports = {
8
+
9
+ bind: function () {
10
+
11
+ this.identifier = '$r' + this.id
12
+
13
+ // a hash to cache the same expressions on repeated instances
14
+ // so they don't have to be compiled for every single instance
15
+ this.expCache = utils.hash()
16
+
17
+ var el = this.el,
18
+ ctn = this.container = el.parentNode
19
+
20
+ // extract child Id, if any
21
+ this.childId = this.compiler.eval(utils.attr(el, 'ref'))
22
+
23
+ // create a comment node as a reference node for DOM insertions
24
+ this.ref = document.createComment(config.prefix + '-repeat-' + this.key)
25
+ ctn.insertBefore(this.ref, el)
26
+ ctn.removeChild(el)
27
+
28
+ this.collection = null
29
+ this.vms = null
30
+
31
+ },
32
+
33
+ update: function (collection) {
34
+
35
+ if (!Array.isArray(collection)) {
36
+ if (utils.isObject(collection)) {
37
+ collection = utils.objectToArray(collection)
38
+ } else {
39
+ utils.warn('v-repeat only accepts Array or Object values.')
40
+ }
41
+ }
42
+
43
+ // keep reference of old data and VMs
44
+ // so we can reuse them if possible
45
+ this.oldVMs = this.vms
46
+ this.oldCollection = this.collection
47
+ collection = this.collection = collection || []
48
+
49
+ var isObject = collection[0] && utils.isObject(collection[0])
50
+ this.vms = this.oldCollection
51
+ ? this.diff(collection, isObject)
52
+ : this.init(collection, isObject)
53
+
54
+ if (this.childId) {
55
+ this.vm.$[this.childId] = this.vms
56
+ }
57
+
58
+ },
59
+
60
+ init: function (collection, isObject) {
61
+ var vm, vms = []
62
+ for (var i = 0, l = collection.length; i < l; i++) {
63
+ vm = this.build(collection[i], i, isObject)
64
+ vms.push(vm)
65
+ if (this.compiler.init) {
66
+ this.container.insertBefore(vm.$el, this.ref)
67
+ } else {
68
+ vm.$before(this.ref)
69
+ }
70
+ }
71
+ return vms
72
+ },
73
+
74
+ /**
75
+ * Diff the new array with the old
76
+ * and determine the minimum amount of DOM manipulations.
77
+ */
78
+ diff: function (newCollection, isObject) {
79
+
80
+ var i, l, item, vm,
81
+ oldIndex,
82
+ targetNext,
83
+ currentNext,
84
+ nextEl,
85
+ ctn = this.container,
86
+ oldVMs = this.oldVMs,
87
+ vms = []
88
+
89
+ vms.length = newCollection.length
90
+
91
+ // first pass, collect new reused and new created
92
+ for (i = 0, l = newCollection.length; i < l; i++) {
93
+ item = newCollection[i]
94
+ if (isObject) {
95
+ item.$index = i
96
+ if (item.__emitter__ && item.__emitter__[this.identifier]) {
97
+ // this piece of data is being reused.
98
+ // record its final position in reused vms
99
+ item.$reused = true
100
+ } else {
101
+ vms[i] = this.build(item, i, isObject)
102
+ }
103
+ } else {
104
+ // we can't attach an identifier to primitive values
105
+ // so have to do an indexOf...
106
+ oldIndex = indexOf(oldVMs, item)
107
+ if (oldIndex > -1) {
108
+ // record the position on the existing vm
109
+ oldVMs[oldIndex].$reused = true
110
+ oldVMs[oldIndex].$data.$index = i
111
+ } else {
112
+ vms[i] = this.build(item, i, isObject)
113
+ }
114
+ }
115
+ }
116
+
117
+ // second pass, collect old reused and destroy unused
118
+ for (i = 0, l = oldVMs.length; i < l; i++) {
119
+ vm = oldVMs[i]
120
+ item = this.arg
121
+ ? vm.$data[this.arg]
122
+ : vm.$data
123
+ if (item.$reused) {
124
+ vm.$reused = true
125
+ delete item.$reused
126
+ }
127
+ if (vm.$reused) {
128
+ // update the index to latest
129
+ vm.$index = item.$index
130
+ // the item could have had a new key
131
+ if (item.$key && item.$key !== vm.$key) {
132
+ vm.$key = item.$key
133
+ }
134
+ vms[vm.$index] = vm
135
+ } else {
136
+ // this one can be destroyed.
137
+ if (item.__emitter__) {
138
+ delete item.__emitter__[this.identifier]
139
+ }
140
+ vm.$destroy()
141
+ }
142
+ }
143
+
144
+ // final pass, move/insert DOM elements
145
+ i = vms.length
146
+ while (i--) {
147
+ vm = vms[i]
148
+ item = vm.$data
149
+ targetNext = vms[i + 1]
150
+ if (vm.$reused) {
151
+ nextEl = vm.$el.nextSibling
152
+ // destroyed VMs' element might still be in the DOM
153
+ // due to transitions
154
+ while (!nextEl.vue_vm && nextEl !== this.ref) {
155
+ nextEl = nextEl.nextSibling
156
+ }
157
+ currentNext = nextEl.vue_vm
158
+ if (currentNext !== targetNext) {
159
+ if (!targetNext) {
160
+ ctn.insertBefore(vm.$el, this.ref)
161
+ } else {
162
+ nextEl = targetNext.$el
163
+ // new VMs' element might not be in the DOM yet
164
+ // due to transitions
165
+ while (!nextEl.parentNode) {
166
+ targetNext = vms[nextEl.vue_vm.$index + 1]
167
+ nextEl = targetNext
168
+ ? targetNext.$el
169
+ : this.ref
170
+ }
171
+ ctn.insertBefore(vm.$el, nextEl)
172
+ }
173
+ }
174
+ delete vm.$reused
175
+ delete item.$index
176
+ delete item.$key
177
+ } else { // a new vm
178
+ vm.$before(targetNext ? targetNext.$el : this.ref)
179
+ }
180
+ }
181
+
182
+ return vms
183
+ },
184
+
185
+ build: function (data, index, isObject) {
186
+
187
+ // wrap non-object values
188
+ var raw, alias,
189
+ wrap = !isObject || this.arg
190
+ if (wrap) {
191
+ raw = data
192
+ alias = this.arg || '$value'
193
+ data = {}
194
+ data[alias] = raw
195
+ }
196
+ data.$index = index
197
+
198
+ var el = this.el.cloneNode(true),
199
+ Ctor = this.compiler.resolveComponent(el, data),
200
+ vm = new Ctor({
201
+ el: el,
202
+ data: data,
203
+ parent: this.vm,
204
+ compilerOptions: {
205
+ repeat: true,
206
+ expCache: this.expCache
207
+ }
208
+ })
209
+
210
+ if (isObject) {
211
+ // attach an ienumerable identifier to the raw data
212
+ (raw || data).__emitter__[this.identifier] = true
213
+ }
214
+
215
+ return vm
216
+
217
+ },
218
+
219
+ unbind: function () {
220
+ if (this.childId) {
221
+ delete this.vm.$[this.childId]
222
+ }
223
+ if (this.vms) {
224
+ var i = this.vms.length
225
+ while (i--) {
226
+ this.vms[i].$destroy()
227
+ }
228
+ }
229
+ }
230
+ }
231
+
232
+ // Helpers --------------------------------------------------------------------
233
+
234
+ /**
235
+ * Find an object or a wrapped data object
236
+ * from an Array
237
+ */
238
+ function indexOf (vms, obj) {
239
+ for (var vm, i = 0, l = vms.length; i < l; i++) {
240
+ vm = vms[i]
241
+ if (!vm.$reused && vm.$value === obj) {
242
+ return i
243
+ }
244
+ }
245
+ return -1
246
+ }