trestle 0.8.3 → 0.8.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/trestle/_confirmation.js +23 -0
  3. data/app/assets/javascripts/trestle/_datepicker.js +22 -0
  4. data/app/assets/javascripts/trestle/_errors.js +11 -0
  5. data/app/assets/javascripts/trestle/_form.js +6 -0
  6. data/app/assets/javascripts/trestle/_gallery.js +27 -0
  7. data/app/assets/javascripts/trestle/_select.js +11 -0
  8. data/app/assets/javascripts/trestle/_sidebar.js +52 -0
  9. data/app/assets/javascripts/trestle/_table.js +21 -0
  10. data/app/assets/javascripts/trestle/_tabs.js +13 -0
  11. data/app/assets/javascripts/trestle/_tooltips.js +3 -0
  12. data/app/assets/javascripts/trestle/admin.js +23 -0
  13. data/app/assets/javascripts/trestle/custom.js +4 -0
  14. data/app/assets/stylesheets/trestle/components/_table.scss +6 -0
  15. data/app/helpers/trestle/form_helper.rb +1 -1
  16. data/app/helpers/trestle/format_helper.rb +48 -0
  17. data/app/helpers/trestle/url_helper.rb +2 -8
  18. data/app/views/layouts/trestle/admin.html.erb +3 -3
  19. data/app/views/trestle/admin/index.html.erb +1 -1
  20. data/app/views/trestle/dashboard/index.html.erb +2 -2
  21. data/app/views/trestle/resource/_form.html.erb +1 -1
  22. data/app/views/trestle/resource/edit.html.erb +2 -2
  23. data/app/views/trestle/resource/index.html.erb +1 -1
  24. data/app/views/trestle/resource/new.html.erb +1 -1
  25. data/app/views/trestle/resource/show.html.erb +2 -2
  26. data/app/views/trestle/shared/_sidebar.html.erb +4 -2
  27. data/bower.json +1 -1
  28. data/config/locales/en.yml +16 -2
  29. data/lib/generators/trestle/install/install_generator.rb +3 -3
  30. data/lib/generators/trestle/install/templates/custom.js +7 -0
  31. data/lib/generators/trestle/install/templates/trestle.rb.erb +3 -2
  32. data/lib/trestle/adapters.rb +7 -64
  33. data/lib/trestle/adapters/active_record_adapter.rb +46 -20
  34. data/lib/trestle/adapters/adapter.rb +176 -0
  35. data/lib/trestle/adapters/sequel_adapter.rb +85 -0
  36. data/lib/trestle/admin.rb +1 -1
  37. data/lib/trestle/attribute.rb +14 -37
  38. data/lib/trestle/breadcrumb.rb +6 -0
  39. data/lib/trestle/configuration.rb +1 -1
  40. data/lib/trestle/form/automatic.rb +29 -21
  41. data/lib/trestle/form/builder.rb +4 -0
  42. data/lib/trestle/form/field.rb +2 -2
  43. data/lib/trestle/form/fields/check_box.rb +1 -1
  44. data/lib/trestle/form/fields/collection_select.rb +1 -1
  45. data/lib/trestle/form/fields/date_select.rb +1 -1
  46. data/lib/trestle/form/fields/datetime_select.rb +1 -1
  47. data/lib/trestle/form/fields/grouped_collection_select.rb +1 -1
  48. data/lib/trestle/form/fields/select.rb +2 -2
  49. data/lib/trestle/form/fields/tag_select.rb +1 -2
  50. data/lib/trestle/form/fields/time_select.rb +1 -1
  51. data/lib/trestle/form/fields/time_zone_select.rb +1 -1
  52. data/lib/trestle/resource.rb +11 -7
  53. data/lib/trestle/resource/builder.rb +2 -1
  54. data/lib/trestle/resource/controller.rb +61 -17
  55. data/lib/trestle/scope.rb +1 -1
  56. data/lib/trestle/table/automatic.rb +5 -11
  57. data/lib/trestle/table/builder.rb +1 -0
  58. data/lib/trestle/table/column.rb +24 -43
  59. data/lib/trestle/version.rb +1 -1
  60. data/trestle.gemspec +3 -4
  61. data/vendor/assets/bower_components/trestle/flatpickr/dist/flatpickr.css +51 -26
  62. data/vendor/assets/bower_components/trestle/flatpickr/dist/flatpickr.js +349 -299
  63. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/ar.js +5 -5
  64. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/bg.js +5 -5
  65. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/bn.js +5 -5
  66. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/cat.js +7 -7
  67. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/cs.js +7 -7
  68. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/cy.js +7 -7
  69. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/da.js +6 -6
  70. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/de.js +10 -10
  71. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/eo.js +11 -11
  72. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/es.js +7 -7
  73. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/et.js +11 -11
  74. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/fa.js +6 -6
  75. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/fi.js +7 -7
  76. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/fr.js +11 -11
  77. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/gr.js +13 -13
  78. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/he.js +5 -5
  79. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/hi.js +5 -5
  80. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/hr.js +6 -6
  81. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/hu.js +10 -10
  82. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/id.js +7 -7
  83. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/index.js +97 -0
  84. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/it.js +10 -10
  85. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/ja.js +5 -5
  86. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/ko.js +6 -6
  87. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/lt.js +10 -10
  88. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/lv.js +6 -6
  89. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/mk.js +8 -8
  90. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/ms.js +7 -7
  91. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/my.js +7 -7
  92. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/nl.js +11 -11
  93. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/no.js +11 -11
  94. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/pa.js +5 -5
  95. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/pl.js +6 -6
  96. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/pt.js +6 -8
  97. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/ro.js +7 -9
  98. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/ru.js +6 -8
  99. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/si.js +5 -7
  100. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/sk.js +8 -8
  101. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/sl.js +8 -10
  102. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/sq.js +5 -7
  103. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/sr.js +9 -10
  104. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/sv.js +8 -10
  105. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/th.js +10 -11
  106. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/tr.js +6 -8
  107. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/uk.js +6 -7
  108. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/vn.js +6 -8
  109. data/vendor/assets/bower_components/trestle/flatpickr/dist/l10n/zh.js +9 -11
  110. metadata +24 -34
  111. data/app/assets/javascripts/trestle/_confirmation.js.coffee +0 -18
  112. data/app/assets/javascripts/trestle/_datepicker.js.coffee +0 -18
  113. data/app/assets/javascripts/trestle/_errors.js.coffee +0 -8
  114. data/app/assets/javascripts/trestle/_form.js.coffee +0 -4
  115. data/app/assets/javascripts/trestle/_gallery.js.coffee +0 -21
  116. data/app/assets/javascripts/trestle/_select.js.coffee +0 -7
  117. data/app/assets/javascripts/trestle/_sidebar.js.coffee +0 -45
  118. data/app/assets/javascripts/trestle/_table.js.coffee +0 -16
  119. data/app/assets/javascripts/trestle/_tabs.js.coffee +0 -9
  120. data/app/assets/javascripts/trestle/_tooltips.js.coffee +0 -2
  121. data/app/assets/javascripts/trestle/admin.js.coffee +0 -22
  122. data/app/assets/javascripts/trestle/custom.js.coffee +0 -4
  123. data/lib/generators/trestle/install/templates/custom.js.coffee +0 -7
@@ -20,7 +20,7 @@ module Trestle
20
20
 
21
21
  def apply(collection)
22
22
  if @block
23
- @block.call
23
+ @admin.instance_exec(&@block)
24
24
  else
25
25
  collection.public_send(name)
26
26
  end
@@ -11,20 +11,14 @@ module Trestle
11
11
  end
12
12
 
13
13
  def content_columns
14
- @admin.default_attributes.map.with_index do |attribute, index|
15
- next if attribute.inheritance_column?
16
- next if attribute.counter_cache?
17
-
18
- if attribute.association?
14
+ @admin.default_table_attributes.map.with_index do |attribute, index|
15
+ case attribute.type
16
+ when :association
19
17
  Column.new(self, attribute.association_name, sort: false)
20
- elsif attribute.text?
21
- Column.new(self, attribute.name, link: index.zero?) do |instance|
22
- truncate(instance.public_send(attribute.name))
23
- end
24
18
  else
25
- Column.new(self, attribute.name, link: index.zero?, align: (:center if attribute.datetime? || attribute.boolean?))
19
+ Column.new(self, attribute.name, link: index.zero?, align: (:center if [:datetime, :boolean].include?(attribute.type)))
26
20
  end
27
- end.compact
21
+ end
28
22
  end
29
23
 
30
24
  def actions_column
@@ -5,6 +5,7 @@ module Trestle
5
5
 
6
6
  def initialize(options={})
7
7
  @table = Table.new(options)
8
+ @output_buffer = ActionView::OutputBuffer.new
8
9
  end
9
10
 
10
11
  def row(options={}, &block)
@@ -28,6 +28,16 @@ module Trestle
28
28
  options[:sort].is_a?(Hash) ? options[:sort] : {}
29
29
  end
30
30
 
31
+ def header
32
+ if options[:header]
33
+ options[:header]
34
+ elsif admin = table.options[:admin]
35
+ admin.human_attribute_name(field)
36
+ else
37
+ field.to_s.humanize.titleize
38
+ end
39
+ end
40
+
31
41
  class Renderer
32
42
  delegate :options, to: :@column
33
43
 
@@ -38,17 +48,14 @@ module Trestle
38
48
  def header
39
49
  return if options.has_key?(:header) && options[:header].in?([nil, false])
40
50
 
41
- header = I18n.t("admin.table.headers.#{@column.field}", default: options[:header] || @column.field.to_s.humanize.titleize)
51
+ header = I18n.t("admin.table.headers.#{@column.field}", default: @column.header)
42
52
  header = @template.sort_link(header, @column.sort_field, @column.sort_options) if @column.sortable?
43
53
  header
44
54
  end
45
55
 
46
56
  def content(instance)
47
57
  value = column_value(instance)
48
-
49
- return blank_column(instance) if value.nil?
50
-
51
- content = format_column(value)
58
+ content = @template.format_value(value, options)
52
59
 
53
60
  if value.respond_to?(:id) && options[:link] != false
54
61
  # Automatically link to instance's admin if available
@@ -72,48 +79,22 @@ module Trestle
72
79
  private
73
80
  def column_value(instance)
74
81
  if @column.block
75
- @template.capture { @template.instance_exec(instance, &@column.block).to_s }
82
+ if defined?(Haml) && Haml::Helpers.block_is_haml?(@column.block)
83
+ # In order for table column blocks to work properly within Haml templates,
84
+ # the _hamlout local variable needs to be defined in the scope of the block,
85
+ # so that the Haml version of the capture method is used. Because we
86
+ # evaluate the block using instance_exec, we need to set this up manually.
87
+ -> {
88
+ _hamlout = eval('_hamlout', @column.block.binding)
89
+ @template.capture { @template.instance_exec(instance, &@column.block).to_s }
90
+ }.call
91
+ else
92
+ @template.capture { @template.instance_exec(instance, &@column.block).to_s }
93
+ end
76
94
  else
77
95
  instance.send(@column.field)
78
96
  end
79
97
  end
80
-
81
- def blank_column(value)
82
- text = options.key?(:blank) ? options[:blank] : I18n.t("admin.table.column.blank")
83
- @template.content_tag(:span, text, class: "blank")
84
- end
85
-
86
- def format_column(value)
87
- if options.key?(:format)
88
- format_from_options(value)
89
- else
90
- autoformat_value(value)
91
- end
92
- end
93
-
94
- def format_from_options(value)
95
- case options[:format]
96
- when :currency
97
- @template.number_to_currency(value)
98
- else
99
- value
100
- end
101
- end
102
-
103
- def autoformat_value(value)
104
- case value
105
- when Time, DateTime
106
- @template.timestamp(value)
107
- when Date
108
- @template.datestamp(value)
109
- when TrueClass, FalseClass
110
- @template.status_tag(@template.icon("fa fa-check"), :success) if value
111
- when ->(value) { value.respond_to?(:id) }
112
- @template.display(value)
113
- else
114
- value
115
- end
116
- end
117
98
  end
118
99
  end
119
100
  end
@@ -1,3 +1,3 @@
1
1
  module Trestle
2
- VERSION = "0.8.3"
2
+ VERSION = "0.8.4"
3
3
  end
@@ -33,11 +33,10 @@ Gem::Specification.new do |spec|
33
33
 
34
34
  spec.required_ruby_version = ">= 2.2.2"
35
35
 
36
- spec.add_dependency "rails", ">= 4.2.0"
36
+ spec.add_dependency "railties", ">= 4.2.0"
37
37
  spec.add_dependency "sass-rails", "~> 5.0.6"
38
- spec.add_dependency "coffee-rails", "~> 4.2.1"
39
- spec.add_dependency "autoprefixer-rails", "~> 6.4.0"
40
- spec.add_dependency "kaminari", "~> 0.17.0"
38
+ spec.add_dependency "autoprefixer-rails", "~> 7.1.2"
39
+ spec.add_dependency "kaminari", "~> 1.0.1"
41
40
 
42
41
  spec.add_development_dependency "bundler", "~> 1.12"
43
42
  spec.add_development_dependency "rake", "~> 10.0"
@@ -14,12 +14,14 @@
14
14
  line-height: 24px;
15
15
  border-radius: 5px;
16
16
  position: absolute;
17
- width: 315px;
18
- box-sizing: border-box;
17
+ width: 307.875px;
18
+ -webkit-box-sizing: border-box;
19
+ box-sizing: border-box;
19
20
  -ms-touch-action: manipulation;
20
21
  touch-action: manipulation;
21
22
  background: #fff;
22
- box-shadow: 1px 0 0 #e6e6e6, -1px 0 0 #e6e6e6, 0 1px 0 #e6e6e6, 0 -1px 0 #e6e6e6, 0 3px 13px rgba(0,0,0,0.08);
23
+ -webkit-box-shadow: 1px 0 0 #e6e6e6, -1px 0 0 #e6e6e6, 0 1px 0 #e6e6e6, 0 -1px 0 #e6e6e6, 0 3px 13px rgba(0,0,0,0.08);
24
+ box-shadow: 1px 0 0 #e6e6e6, -1px 0 0 #e6e6e6, 0 1px 0 #e6e6e6, 0 -1px 0 #e6e6e6, 0 3px 13px rgba(0,0,0,0.08);
23
25
  }
24
26
  .flatpickr-calendar.open,
25
27
  .flatpickr-calendar.inline {
@@ -194,6 +196,7 @@
194
196
  }
195
197
  .flatpickr-prev-month svg path,
196
198
  .flatpickr-next-month svg path {
199
+ -webkit-transition: fill 0.1s;
197
200
  transition: fill 0.1s;
198
201
  fill: inherit;
199
202
  }
@@ -218,7 +221,8 @@
218
221
  opacity: 0;
219
222
  cursor: pointer;
220
223
  border: 1px solid rgba(57,57,57,0.05);
221
- box-sizing: border-box;
224
+ -webkit-box-sizing: border-box;
225
+ box-sizing: border-box;
222
226
  }
223
227
  .numInputWrapper span:hover {
224
228
  background: rgba(0,0,0,0.1);
@@ -326,7 +330,8 @@
326
330
  }
327
331
  .flatpickr-current-month input.cur-year {
328
332
  background: transparent;
329
- box-sizing: border-box;
333
+ -webkit-box-sizing: border-box;
334
+ box-sizing: border-box;
330
335
  color: inherit;
331
336
  cursor: default;
332
337
  padding: 0 0 0 0.5ch;
@@ -355,10 +360,12 @@
355
360
  background: transparent;
356
361
  text-align: center;
357
362
  overflow: hidden;
358
- width: 315px;
363
+ width: 100%;
364
+ display: -webkit-box;
359
365
  display: -webkit-flex;
360
366
  display: -ms-flexbox;
361
367
  display: flex;
368
+ -webkit-box-align: center;
362
369
  -webkit-align-items: center;
363
370
  -ms-flex-align: center;
364
371
  align-items: center;
@@ -373,6 +380,7 @@ span.flatpickr-weekday {
373
380
  margin: 0;
374
381
  text-align: center;
375
382
  display: block;
383
+ -webkit-box-flex: 1;
376
384
  -webkit-flex: 1;
377
385
  -ms-flex: 1;
378
386
  flex: 1;
@@ -385,10 +393,11 @@ span.flatpickr-weekday {
385
393
  .flatpickr-days {
386
394
  position: relative;
387
395
  overflow: hidden;
396
+ display: -webkit-box;
388
397
  display: -webkit-flex;
389
398
  display: -ms-flexbox;
390
399
  display: flex;
391
- width: 315px;
400
+ width: 307.875px;
392
401
  }
393
402
  .flatpickr-days:focus {
394
403
  outline: 0;
@@ -397,12 +406,14 @@ span.flatpickr-weekday {
397
406
  padding: 0;
398
407
  outline: 0;
399
408
  text-align: left;
400
- width: 315px;
401
- min-width: 315px;
402
- max-width: 315px;
403
- box-sizing: border-box;
409
+ width: 307.875px;
410
+ min-width: 307.875px;
411
+ max-width: 307.875px;
412
+ -webkit-box-sizing: border-box;
413
+ box-sizing: border-box;
404
414
  display: inline-block;
405
415
  display: -ms-flexbox;
416
+ display: -webkit-box;
406
417
  display: -webkit-flex;
407
418
  display: flex;
408
419
  -webkit-flex-wrap: wrap;
@@ -442,7 +453,8 @@ span.flatpickr-weekday {
442
453
  background: none;
443
454
  border: 1px solid transparent;
444
455
  border-radius: 150px;
445
- box-sizing: border-box;
456
+ -webkit-box-sizing: border-box;
457
+ box-sizing: border-box;
446
458
  color: #393939;
447
459
  cursor: pointer;
448
460
  font-weight: 400;
@@ -450,12 +462,13 @@ span.flatpickr-weekday {
450
462
  -webkit-flex-basis: 14.2857143%;
451
463
  -ms-flex-preferred-size: 14.2857143%;
452
464
  flex-basis: 14.2857143%;
453
- max-width: 40px;
454
- height: 40px;
455
- line-height: 40px;
465
+ max-width: 39px;
466
+ height: 39px;
467
+ line-height: 39px;
456
468
  margin: 0;
457
469
  display: inline-block;
458
470
  position: relative;
471
+ -webkit-box-pack: center;
459
472
  -webkit-justify-content: center;
460
473
  -ms-flex-pack: center;
461
474
  justify-content: center;
@@ -506,7 +519,8 @@ span.flatpickr-weekday {
506
519
  .flatpickr-day.startRange.nextMonthDay,
507
520
  .flatpickr-day.endRange.nextMonthDay {
508
521
  background: #569ff7;
509
- box-shadow: none;
522
+ -webkit-box-shadow: none;
523
+ box-shadow: none;
510
524
  color: #fff;
511
525
  border-color: #569ff7;
512
526
  }
@@ -523,7 +537,8 @@ span.flatpickr-weekday {
523
537
  .flatpickr-day.selected.startRange + .endRange,
524
538
  .flatpickr-day.startRange.startRange + .endRange,
525
539
  .flatpickr-day.endRange.startRange + .endRange {
526
- box-shadow: -10px 0 0 #569ff7;
540
+ -webkit-box-shadow: -10px 0 0 #569ff7;
541
+ box-shadow: -10px 0 0 #569ff7;
527
542
  }
528
543
  .flatpickr-day.selected.startRange.endRange,
529
544
  .flatpickr-day.startRange.startRange.endRange,
@@ -532,7 +547,8 @@ span.flatpickr-weekday {
532
547
  }
533
548
  .flatpickr-day.inRange {
534
549
  border-radius: 0;
535
- box-shadow: -5px 0 0 #e6e6e6, 5px 0 0 #e6e6e6;
550
+ -webkit-box-shadow: -5px 0 0 #e6e6e6, 5px 0 0 #e6e6e6;
551
+ box-shadow: -5px 0 0 #e6e6e6, 5px 0 0 #e6e6e6;
536
552
  }
537
553
  .flatpickr-day.disabled,
538
554
  .flatpickr-day.disabled:hover {
@@ -552,7 +568,8 @@ span.flatpickr-weekday {
552
568
  }
553
569
  .flatpickr-day.week.selected {
554
570
  border-radius: 0;
555
- box-shadow: -5px 0 0 #569ff7, 5px 0 0 #569ff7;
571
+ -webkit-box-shadow: -5px 0 0 #569ff7, 5px 0 0 #569ff7;
572
+ box-shadow: -5px 0 0 #569ff7, 5px 0 0 #569ff7;
556
573
  }
557
574
  .rangeMode .flatpickr-day {
558
575
  margin-top: 1px;
@@ -563,7 +580,8 @@ span.flatpickr-weekday {
563
580
  }
564
581
  .flatpickr-weekwrapper .flatpickr-weeks {
565
582
  padding: 0 12px;
566
- box-shadow: 1px 0 0 #e6e6e6;
583
+ -webkit-box-shadow: 1px 0 0 #e6e6e6;
584
+ box-shadow: 1px 0 0 #e6e6e6;
567
585
  }
568
586
  .flatpickr-weekwrapper .flatpickr-weekday {
569
587
  float: none;
@@ -577,16 +595,19 @@ span.flatpickr-weekday {
577
595
  }
578
596
  .flatpickr-innerContainer {
579
597
  display: block;
598
+ display: -webkit-box;
580
599
  display: -webkit-flex;
581
600
  display: -ms-flexbox;
582
601
  display: flex;
583
- box-sizing: border-box;
602
+ -webkit-box-sizing: border-box;
603
+ box-sizing: border-box;
584
604
  overflow: hidden;
585
605
  }
586
606
  .flatpickr-rContainer {
587
607
  display: inline-block;
588
608
  padding: 0;
589
- box-sizing: border-box;
609
+ -webkit-box-sizing: border-box;
610
+ box-sizing: border-box;
590
611
  }
591
612
  .flatpickr-time {
592
613
  text-align: center;
@@ -595,8 +616,10 @@ span.flatpickr-weekday {
595
616
  height: 0;
596
617
  line-height: 40px;
597
618
  max-height: 40px;
598
- box-sizing: border-box;
619
+ -webkit-box-sizing: border-box;
620
+ box-sizing: border-box;
599
621
  overflow: hidden;
622
+ display: -webkit-box;
600
623
  display: -webkit-flex;
601
624
  display: -ms-flexbox;
602
625
  display: flex;
@@ -607,6 +630,7 @@ span.flatpickr-weekday {
607
630
  clear: both;
608
631
  }
609
632
  .flatpickr-time .numInputWrapper {
633
+ -webkit-box-flex: 1;
610
634
  -webkit-flex: 1;
611
635
  -ms-flex: 1;
612
636
  flex: 1;
@@ -628,7 +652,8 @@ span.flatpickr-weekday {
628
652
  }
629
653
  .flatpickr-time input {
630
654
  background: transparent;
631
- box-shadow: none;
655
+ -webkit-box-shadow: none;
656
+ box-shadow: none;
632
657
  border: 0;
633
658
  border-radius: 0;
634
659
  text-align: center;
@@ -640,7 +665,8 @@ span.flatpickr-weekday {
640
665
  color: #393939;
641
666
  font-size: 14px;
642
667
  position: relative;
643
- box-sizing: border-box;
668
+ -webkit-box-sizing: border-box;
669
+ box-sizing: border-box;
644
670
  }
645
671
  .flatpickr-time input.flatpickr-hour {
646
672
  font-weight: bold;
@@ -668,7 +694,6 @@ span.flatpickr-weekday {
668
694
  user-select: none;
669
695
  -webkit-align-self: center;
670
696
  -ms-flex-item-align: center;
671
- -ms-grid-row-align: center;
672
697
  align-self: center;
673
698
  }
674
699
  .flatpickr-time .flatpickr-am-pm {
@@ -2,12 +2,15 @@ var _extends = Object.assign || function (target) { for (var i = 1; i < argument
2
2
 
3
3
  var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
4
4
 
5
- /*! flatpickr v2.6.3, @license MIT */
6
- function Flatpickr(element, config) {
5
+ /*! flatpickr v3.0.6, @license MIT */
6
+ function FlatpickrInstance(element, config) {
7
7
  var self = this;
8
8
 
9
9
  self._ = {};
10
10
  self._.afterDayAnim = afterDayAnim;
11
+ self._bind = bind;
12
+ self._compareDates = compareDates;
13
+ self._setHoursFromDate = setHoursFromDate;
11
14
  self.changeMonth = changeMonth;
12
15
  self.changeYear = changeYear;
13
16
  self.clear = clear;
@@ -25,8 +28,8 @@ function Flatpickr(element, config) {
25
28
  function init() {
26
29
  self.element = self.input = element;
27
30
  self.instanceConfig = config || {};
28
- self.parseDate = Flatpickr.prototype.parseDate.bind(self);
29
- self.formatDate = Flatpickr.prototype.formatDate.bind(self);
31
+ self.parseDate = FlatpickrInstance.prototype.parseDate.bind(self);
32
+ self.formatDate = FlatpickrInstance.prototype.formatDate.bind(self);
30
33
 
31
34
  setupFormats();
32
35
  parseConfig();
@@ -47,15 +50,15 @@ function Flatpickr(element, config) {
47
50
  if (self.config.enableTime) {
48
51
  setHoursFromDate(self.config.noCalendar ? self.latestSelectedDateObj || self.config.minDate : null);
49
52
  }
50
- updateValue();
53
+ updateValue(false);
51
54
  }
52
55
 
56
+ self.showTimeInput = self.selectedDates.length > 0 || self.config.noCalendar;
57
+
53
58
  if (self.config.weekNumbers) {
54
59
  self.calendarContainer.style.width = self.daysContainer.offsetWidth + self.weekWrapper.offsetWidth + "px";
55
60
  }
56
61
 
57
- self.showTimeInput = self.selectedDates.length > 0 || self.config.noCalendar;
58
-
59
62
  if (!self.isMobile) positionCalendar();
60
63
 
61
64
  triggerEvent("Ready");
@@ -238,7 +241,10 @@ function Flatpickr(element, config) {
238
241
  bind(window.document, "mousedown", onClick(documentClick));
239
242
  bind(self._input, "blur", documentClick);
240
243
 
241
- if (self.config.clickOpens === true) bind(self._input, "focus", self.open);
244
+ if (self.config.clickOpens === true) {
245
+ bind(self._input, "focus", self.open);
246
+ bind(self._input, "mousedown", onClick(self.open));
247
+ }
242
248
 
243
249
  if (!self.config.noCalendar) {
244
250
  self.monthNav.addEventListener("wheel", function (e) {
@@ -667,7 +673,7 @@ function Flatpickr(element, config) {
667
673
 
668
674
  self.hourElement.tabIndex = self.minuteElement.tabIndex = -1;
669
675
 
670
- self.hourElement.value = self.pad(self.latestSelectedDateObj ? self.latestSelectedDateObj.getHours() : self.config.defaultHour);
676
+ self.hourElement.value = self.pad(self.latestSelectedDateObj ? self.latestSelectedDateObj.getHours() : self.config.defaultHour % (self.time_24hr ? 24 : 12));
671
677
 
672
678
  self.minuteElement.value = self.pad(self.latestSelectedDateObj ? self.latestSelectedDateObj.getMinutes() : self.config.defaultMinute);
673
679
 
@@ -694,7 +700,7 @@ function Flatpickr(element, config) {
694
700
  var secondInput = createNumberInput("flatpickr-second");
695
701
  self.secondElement = secondInput.childNodes[0];
696
702
 
697
- self.secondElement.value = self.latestSelectedDateObj ? self.pad(self.latestSelectedDateObj.getSeconds()) : "00";
703
+ self.secondElement.value = self.pad(self.latestSelectedDateObj ? self.latestSelectedDateObj.getSeconds() : self.config.defaultSeconds);
698
704
 
699
705
  self.secondElement.step = self.minuteElement.step;
700
706
  self.secondElement.min = self.minuteElement.min;
@@ -706,7 +712,7 @@ function Flatpickr(element, config) {
706
712
 
707
713
  if (!self.config.time_24hr) {
708
714
  // add self.amPM if appropriate
709
- self.amPM = createElement("span", "flatpickr-am-pm", ["AM", "PM"][self.hourElement.value > 11 | 0]);
715
+ self.amPM = createElement("span", "flatpickr-am-pm", ["AM", "PM"][(self.latestSelectedDateObj ? self.hourElement.value : self.config.defaultHour) > 11 | 0]);
710
716
  self.amPM.title = self.l10n.toggleTitle;
711
717
  self.amPM.tabIndex = -1;
712
718
  self.timeContainer.appendChild(self.amPM);
@@ -840,6 +846,8 @@ function Flatpickr(element, config) {
840
846
  }
841
847
 
842
848
  function destroy() {
849
+ if (self.config !== undefined) triggerEvent("Destroy");
850
+
843
851
  for (var i = self._handlers.length; i--;) {
844
852
  var h = self._handlers[i];
845
853
  h.element.removeEventListener(h.event, h.handler);
@@ -866,7 +874,9 @@ function Flatpickr(element, config) {
866
874
  }
867
875
 
868
876
  ["_showTimeInput", "latestSelectedDateObj", "_hideNextMonthArrow", "_hidePrevMonthArrow", "__hideNextMonthArrow", "__hidePrevMonthArrow", "isMobile", "isOpen", "selectedDateElem", "minDateHasTime", "maxDateHasTime", "days", "daysContainer", "_input", "_positionElement", "innerContainer", "rContainer", "monthNav", "todayDateElem", "calendarContainer", "weekdayContainer", "prevMonthNav", "nextMonthNav", "currentMonthElement", "currentYearElement", "navigationCurrentMonth", "selectedDateElem", "config"].forEach(function (k) {
869
- return delete self[k];
877
+ try {
878
+ delete self[k];
879
+ } catch (e) {}
870
880
  });
871
881
  }
872
882
 
@@ -885,8 +895,7 @@ function Flatpickr(element, config) {
885
895
 
886
896
  var lostFocus = e.type === "blur" ? isInput && e.relatedTarget && !isCalendarElem(e.relatedTarget) : !isInput && !isCalendarElement;
887
897
 
888
- if (lostFocus) {
889
- e.preventDefault();
898
+ if (lostFocus && self.config.ignoredFocusElements.indexOf(e.target) === -1) {
890
899
  self.close();
891
900
 
892
901
  if (self.config.mode === "range" && self.selectedDates.length === 1) {
@@ -966,6 +975,11 @@ function Flatpickr(element, config) {
966
975
  self.close();
967
976
  break;
968
977
 
978
+ case "Backspace":
979
+ case "Delete":
980
+ if (!self.config.allowInput) self.clear();
981
+ break;
982
+
969
983
  case "ArrowLeft":
970
984
  case "ArrowRight":
971
985
  if (!isTimeObj) {
@@ -993,6 +1007,7 @@ function Flatpickr(element, config) {
993
1007
  } else if (self.config.enableTime) {
994
1008
  if (!isTimeObj) self.hourElement.focus();
995
1009
  updateTime(e);
1010
+ self.debouncedChange();
996
1011
  }
997
1012
 
998
1013
  break;
@@ -1089,7 +1104,7 @@ function Flatpickr(element, config) {
1089
1104
  if (self.isOpen && !self.config.static && !self.config.inline) positionCalendar();
1090
1105
  }
1091
1106
 
1092
- function open(e) {
1107
+ function open(e, positionElement) {
1093
1108
  if (self.isMobile) {
1094
1109
  if (e) {
1095
1110
  e.preventDefault();
@@ -1108,7 +1123,7 @@ function Flatpickr(element, config) {
1108
1123
 
1109
1124
  self.isOpen = true;
1110
1125
  self.calendarContainer.classList.add("open");
1111
- positionCalendar();
1126
+ positionCalendar(positionElement);
1112
1127
  self._input.classList.add("active");
1113
1128
 
1114
1129
  triggerEvent("Open");
@@ -1144,25 +1159,43 @@ function Flatpickr(element, config) {
1144
1159
  }
1145
1160
 
1146
1161
  function parseConfig() {
1147
- var boolOpts = ["utc", "wrap", "weekNumbers", "allowInput", "clickOpens", "time_24hr", "enableTime", "noCalendar", "altInput", "shorthandCurrentMonth", "inline", "static", "enableSeconds", "disableMobile"];
1162
+ var boolOpts = ["wrap", "weekNumbers", "allowInput", "clickOpens", "time_24hr", "enableTime", "noCalendar", "altInput", "shorthandCurrentMonth", "inline", "static", "enableSeconds", "disableMobile"];
1148
1163
 
1149
- var hooks = ["onChange", "onClose", "onDayCreate", "onKeyDown", "onMonthChange", "onOpen", "onParseConfig", "onReady", "onValueUpdate", "onYearChange"];
1164
+ var hooks = ["onChange", "onClose", "onDayCreate", "onDestroy", "onKeyDown", "onMonthChange", "onOpen", "onParseConfig", "onReady", "onValueUpdate", "onYearChange"];
1150
1165
 
1151
- self.config = Object.create(Flatpickr.defaultConfig);
1166
+ self.config = Object.create(flatpickr.defaultConfig);
1152
1167
 
1153
1168
  var userConfig = _extends({}, self.instanceConfig, JSON.parse(JSON.stringify(self.element.dataset || {})));
1154
1169
 
1155
1170
  self.config.parseDate = userConfig.parseDate;
1156
1171
  self.config.formatDate = userConfig.formatDate;
1157
1172
 
1173
+ Object.defineProperty(self.config, "enable", {
1174
+ get: function get() {
1175
+ return self.config._enable || [];
1176
+ },
1177
+ set: function set(dates) {
1178
+ return self.config._enable = parseDateRules(dates);
1179
+ }
1180
+ });
1181
+
1182
+ Object.defineProperty(self.config, "disable", {
1183
+ get: function get() {
1184
+ return self.config._disable || [];
1185
+ },
1186
+ set: function set(dates) {
1187
+ return self.config._disable = parseDateRules(dates);
1188
+ }
1189
+ });
1190
+
1158
1191
  _extends(self.config, userConfig);
1159
1192
 
1160
1193
  if (!userConfig.dateFormat && userConfig.enableTime) {
1161
- self.config.dateFormat = self.config.noCalendar ? "H:i" + (self.config.enableSeconds ? ":S" : "") : Flatpickr.defaultConfig.dateFormat + " H:i" + (self.config.enableSeconds ? ":S" : "");
1194
+ self.config.dateFormat = self.config.noCalendar ? "H:i" + (self.config.enableSeconds ? ":S" : "") : flatpickr.defaultConfig.dateFormat + " H:i" + (self.config.enableSeconds ? ":S" : "");
1162
1195
  }
1163
1196
 
1164
1197
  if (userConfig.altInput && userConfig.enableTime && !userConfig.altFormat) {
1165
- self.config.altFormat = self.config.noCalendar ? "h:i" + (self.config.enableSeconds ? ":S K" : " K") : Flatpickr.defaultConfig.altFormat + (" h:i" + (self.config.enableSeconds ? ":S" : "") + " K");
1198
+ self.config.altFormat = self.config.noCalendar ? "h:i" + (self.config.enableSeconds ? ":S K" : " K") : flatpickr.defaultConfig.altFormat + (" h:i" + (self.config.enableSeconds ? ":S" : "") + " K");
1166
1199
  }
1167
1200
 
1168
1201
  Object.defineProperty(self.config, "minDate", {
@@ -1204,22 +1237,24 @@ function Flatpickr(element, config) {
1204
1237
  }
1205
1238
 
1206
1239
  function setupLocale() {
1207
- if (_typeof(self.config.locale) !== "object" && typeof Flatpickr.l10ns[self.config.locale] === "undefined") console.warn("flatpickr: invalid locale " + self.config.locale);
1240
+ if (_typeof(self.config.locale) !== "object" && typeof flatpickr.l10ns[self.config.locale] === "undefined") console.warn("flatpickr: invalid locale " + self.config.locale);
1208
1241
 
1209
- self.l10n = _extends(Object.create(Flatpickr.l10ns.default), _typeof(self.config.locale) === "object" ? self.config.locale : self.config.locale !== "default" ? Flatpickr.l10ns[self.config.locale] || {} : {});
1242
+ self.l10n = _extends(Object.create(flatpickr.l10ns.default), _typeof(self.config.locale) === "object" ? self.config.locale : self.config.locale !== "default" ? flatpickr.l10ns[self.config.locale] || {} : {});
1210
1243
  }
1211
1244
 
1212
1245
  function positionCalendar() {
1246
+ var positionElement = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : self._positionElement;
1247
+
1213
1248
  if (self.calendarContainer === undefined) return;
1214
1249
 
1215
1250
  var calendarHeight = self.calendarContainer.offsetHeight,
1216
1251
  calendarWidth = self.calendarContainer.offsetWidth,
1217
1252
  configPos = self.config.position,
1218
- inputBounds = self._positionElement.getBoundingClientRect(),
1253
+ inputBounds = positionElement.getBoundingClientRect(),
1219
1254
  distanceFromBottom = window.innerHeight - inputBounds.bottom,
1220
1255
  showOnTop = configPos === "above" || configPos !== "below" && distanceFromBottom < calendarHeight && inputBounds.top > calendarHeight;
1221
1256
 
1222
- var top = window.pageYOffset + inputBounds.top + (!showOnTop ? self._positionElement.offsetHeight + 2 : -calendarHeight - 2);
1257
+ var top = window.pageYOffset + inputBounds.top + (!showOnTop ? positionElement.offsetHeight + 2 : -calendarHeight - 2);
1223
1258
 
1224
1259
  toggleClass(self.calendarContainer, "arrowTop", !showOnTop);
1225
1260
  toggleClass(self.calendarContainer, "arrowBottom", showOnTop);
@@ -1315,7 +1350,7 @@ function Flatpickr(element, config) {
1315
1350
 
1316
1351
  // maintain focus
1317
1352
  if (!shouldChangeMonth) focusOnDay(e.target.$i, 0);else afterDayAnim(function () {
1318
- return self.selectedDateElem.focus();
1353
+ return self.selectedDateElem && self.selectedDateElem.focus();
1319
1354
  });
1320
1355
 
1321
1356
  if (self.config.enableTime) setTimeout(function () {
@@ -1331,7 +1366,8 @@ function Flatpickr(element, config) {
1331
1366
  }
1332
1367
 
1333
1368
  function set(option, value) {
1334
- self.config[option] = value;
1369
+ if (option !== null && (typeof option === "undefined" ? "undefined" : _typeof(option)) === "object") _extends(self.config, option);else self.config[option] = value;
1370
+
1335
1371
  self.redraw();
1336
1372
  jumpToDate();
1337
1373
  }
@@ -1373,7 +1409,7 @@ function Flatpickr(element, config) {
1373
1409
  }
1374
1410
 
1375
1411
  function setDate(date, triggerChange, format) {
1376
- if (!date) return self.clear(triggerChange);
1412
+ if (date !== 0 && !date) return self.clear(triggerChange);
1377
1413
 
1378
1414
  setSelectedDate(date, format);
1379
1415
 
@@ -1389,27 +1425,23 @@ function Flatpickr(element, config) {
1389
1425
  if (triggerChange) triggerEvent("Change");
1390
1426
  }
1391
1427
 
1392
- function setupDates() {
1393
- function parseDateRules(arr) {
1394
- for (var i = arr.length; i--;) {
1395
- if (typeof arr[i] === "string" || +arr[i]) arr[i] = self.parseDate(arr[i], null, true);else if (arr[i] && arr[i].from && arr[i].to) {
1396
- arr[i].from = self.parseDate(arr[i].from);
1397
- arr[i].to = self.parseDate(arr[i].to);
1398
- }
1428
+ function parseDateRules(arr) {
1429
+ for (var i = arr.length; i--;) {
1430
+ if (typeof arr[i] === "string" || +arr[i]) arr[i] = self.parseDate(arr[i], null, true);else if (arr[i] && arr[i].from && arr[i].to) {
1431
+ arr[i].from = self.parseDate(arr[i].from);
1432
+ arr[i].to = self.parseDate(arr[i].to);
1399
1433
  }
1400
-
1401
- return arr.filter(function (x) {
1402
- return x;
1403
- }); // remove falsy values
1404
1434
  }
1405
1435
 
1436
+ return arr.filter(function (x) {
1437
+ return x;
1438
+ }); // remove falsy values
1439
+ }
1440
+
1441
+ function setupDates() {
1406
1442
  self.selectedDates = [];
1407
1443
  self.now = new Date();
1408
1444
 
1409
- if (self.config.disable.length) self.config.disable = parseDateRules(self.config.disable);
1410
-
1411
- if (self.config.enable.length) self.config.enable = parseDateRules(self.config.enable);
1412
-
1413
1445
  var preloadedDate = self.config.defaultDate || self.input.value;
1414
1446
  if (preloadedDate) setSelectedDate(preloadedDate, self.config.dateFormat);
1415
1447
 
@@ -1471,12 +1503,13 @@ function Flatpickr(element, config) {
1471
1503
 
1472
1504
  /* istanbul ignore next */
1473
1505
  function setupFormats() {
1506
+ self.formats = Object.create(FlatpickrInstance.prototype.formats);
1474
1507
  ["D", "F", "J", "M", "W", "l"].forEach(function (f) {
1475
- self.formats[f] = Flatpickr.prototype.formats[f].bind(self);
1508
+ self.formats[f] = FlatpickrInstance.prototype.formats[f].bind(self);
1476
1509
  });
1477
1510
 
1478
- self.revFormat.F = Flatpickr.prototype.revFormat.F.bind(self);
1479
- self.revFormat.M = Flatpickr.prototype.revFormat.M.bind(self);
1511
+ self.revFormat.F = FlatpickrInstance.prototype.revFormat.F.bind(self);
1512
+ self.revFormat.M = FlatpickrInstance.prototype.revFormat.M.bind(self);
1480
1513
  }
1481
1514
 
1482
1515
  function setupInputs() {
@@ -1497,6 +1530,7 @@ function Flatpickr(element, config) {
1497
1530
  self._input = self.altInput;
1498
1531
  self.altInput.placeholder = self.input.placeholder;
1499
1532
  self.altInput.disabled = self.input.disabled;
1533
+ self.altInput.required = self.input.required;
1500
1534
  self.altInput.type = "text";
1501
1535
  self.input.type = "hidden";
1502
1536
 
@@ -1512,7 +1546,7 @@ function Flatpickr(element, config) {
1512
1546
  var inputType = self.config.enableTime ? self.config.noCalendar ? "time" : "datetime-local" : "date";
1513
1547
 
1514
1548
  self.mobileInput = createElement("input", self.input.className + " flatpickr-mobile");
1515
- self.mobileInput.step = "any";
1549
+ self.mobileInput.step = self.input.getAttribute("step") || "any";
1516
1550
  self.mobileInput.tabIndex = 1;
1517
1551
  self.mobileInput.type = inputType;
1518
1552
  self.mobileInput.disabled = self.input.disabled;
@@ -1625,7 +1659,8 @@ function Flatpickr(element, config) {
1625
1659
  return self.formatDate(dObj, self.config.altFormat);
1626
1660
  }).join(joinChar);
1627
1661
  }
1628
- triggerEvent("ValueUpdate");
1662
+
1663
+ if (triggerChange !== false) triggerEvent("ValueUpdate");
1629
1664
  }
1630
1665
 
1631
1666
  function mouseDelta(e) {
@@ -1760,204 +1795,7 @@ function Flatpickr(element, config) {
1760
1795
  return self;
1761
1796
  }
1762
1797
 
1763
- /* istanbul ignore next */
1764
- Flatpickr.defaultConfig = {
1765
- mode: "single",
1766
-
1767
- position: "auto",
1768
-
1769
- animate: window.navigator.userAgent.indexOf("MSIE") === -1,
1770
-
1771
- /* if true, dates will be parsed, formatted, and displayed in UTC.
1772
- preloading date strings w/ timezones is recommended but not necessary */
1773
- utc: false,
1774
-
1775
- // wrap: see https://chmln.github.io/flatpickr/examples/#flatpickr-external-elements
1776
- wrap: false,
1777
-
1778
- // enables week numbers
1779
- weekNumbers: false,
1780
-
1781
- // allow manual datetime input
1782
- allowInput: false,
1783
-
1784
- /*
1785
- clicking on input opens the date(time)picker.
1786
- disable if you wish to open the calendar manually with .open()
1787
- */
1788
- clickOpens: true,
1789
-
1790
- /*
1791
- closes calendar after date selection,
1792
- unless 'mode' is 'multiple' or enableTime is true
1793
- */
1794
- closeOnSelect: true,
1795
-
1796
- // display time picker in 24 hour mode
1797
- time_24hr: false,
1798
-
1799
- // enables the time picker functionality
1800
- enableTime: false,
1801
-
1802
- // noCalendar: true will hide the calendar. use for a time picker along w/ enableTime
1803
- noCalendar: false,
1804
-
1805
- // more date format chars at https://chmln.github.io/flatpickr/#dateformat
1806
- dateFormat: "Y-m-d",
1807
-
1808
- // date format used in aria-label for days
1809
- ariaDateFormat: "F j, Y",
1810
-
1811
- // altInput - see https://chmln.github.io/flatpickr/#altinput
1812
- altInput: false,
1813
-
1814
- // the created altInput element will have this class.
1815
- altInputClass: "form-control input",
1816
-
1817
- // same as dateFormat, but for altInput
1818
- altFormat: "F j, Y", // defaults to e.g. June 10, 2016
1819
-
1820
- // defaultDate - either a datestring or a date object. used for datetimepicker"s initial value
1821
- defaultDate: null,
1822
-
1823
- // the minimum date that user can pick (inclusive)
1824
- minDate: null,
1825
-
1826
- // the maximum date that user can pick (inclusive)
1827
- maxDate: null,
1828
-
1829
- // dateparser that transforms a given string to a date object
1830
- parseDate: null,
1831
-
1832
- // dateformatter that transforms a given date object to a string, according to passed format
1833
- formatDate: null,
1834
-
1835
- getWeek: function getWeek(givenDate) {
1836
- var date = new Date(givenDate.getTime());
1837
- var onejan = new Date(date.getFullYear(), 0, 1);
1838
- return Math.ceil(((date - onejan) / 86400000 + onejan.getDay() + 1) / 7);
1839
- },
1840
-
1841
-
1842
- // see https://chmln.github.io/flatpickr/#disable
1843
- enable: [],
1844
-
1845
- // see https://chmln.github.io/flatpickr/#disable
1846
- disable: [],
1847
-
1848
- // display the short version of month names - e.g. Sep instead of September
1849
- shorthandCurrentMonth: false,
1850
-
1851
- // displays calendar inline. see https://chmln.github.io/flatpickr/#inline-calendar
1852
- inline: false,
1853
-
1854
- // position calendar inside wrapper and next to the input element
1855
- // leave at false unless you know what you"re doing
1856
- "static": false,
1857
-
1858
- // DOM node to append the calendar to in *static* mode
1859
- appendTo: null,
1860
-
1861
- // code for previous/next icons. this is where you put your custom icon code e.g. fontawesome
1862
- prevArrow: "<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M5.207 8.471l7.146 7.147-0.707 0.707-7.853-7.854 7.854-7.853 0.707 0.707-7.147 7.146z' /></svg>",
1863
- nextArrow: "<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M13.207 8.472l-7.854 7.854-0.707-0.707 7.146-7.146-7.146-7.148 0.707-0.707 7.854 7.854z' /></svg>",
1864
-
1865
- // enables seconds in the time picker
1866
- enableSeconds: false,
1867
-
1868
- // step size used when scrolling/incrementing the hour element
1869
- hourIncrement: 1,
1870
-
1871
- // step size used when scrolling/incrementing the minute element
1872
- minuteIncrement: 5,
1873
-
1874
- // initial value in the hour element
1875
- defaultHour: 12,
1876
-
1877
- // initial value in the minute element
1878
- defaultMinute: 0,
1879
-
1880
- // disable native mobile datetime input support
1881
- disableMobile: false,
1882
-
1883
- // default locale
1884
- locale: "default",
1885
-
1886
- plugins: [],
1887
-
1888
- // called every time calendar is closed
1889
- onClose: undefined, // function (dateObj, dateStr) {}
1890
-
1891
- // onChange callback when user selects a date or time
1892
- onChange: undefined, // function (dateObj, dateStr) {}
1893
-
1894
- // called for every day element
1895
- onDayCreate: undefined,
1896
-
1897
- // called every time the month is changed
1898
- onMonthChange: undefined,
1899
-
1900
- // called every time calendar is opened
1901
- onOpen: undefined, // function (dateObj, dateStr) {}
1902
-
1903
- // called after the configuration has been parsed
1904
- onParseConfig: undefined,
1905
-
1906
- // called after calendar is ready
1907
- onReady: undefined, // function (dateObj, dateStr) {}
1908
-
1909
- // called after input value updated
1910
- onValueUpdate: undefined,
1911
-
1912
- // called every time the year is changed
1913
- onYearChange: undefined,
1914
-
1915
- onKeyDown: undefined
1916
- };
1917
-
1918
- /* istanbul ignore next */
1919
- Flatpickr.l10ns = {
1920
- en: {
1921
- weekdays: {
1922
- shorthand: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
1923
- longhand: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
1924
- },
1925
- months: {
1926
- shorthand: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
1927
- longhand: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
1928
- },
1929
- daysInMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
1930
- firstDayOfWeek: 0,
1931
- ordinal: function ordinal(nth) {
1932
- var s = nth % 100;
1933
- if (s > 3 && s < 21) return "th";
1934
- switch (s % 10) {
1935
- case 1:
1936
- return "st";
1937
- case 2:
1938
- return "nd";
1939
- case 3:
1940
- return "rd";
1941
- default:
1942
- return "th";
1943
- }
1944
- },
1945
- rangeSeparator: " to ",
1946
- weekAbbreviation: "Wk",
1947
- scrollTitle: "Scroll to increment",
1948
- toggleTitle: "Click to toggle"
1949
- }
1950
- };
1951
-
1952
- Flatpickr.l10ns.default = Object.create(Flatpickr.l10ns.en);
1953
- Flatpickr.localize = function (l10n) {
1954
- return _extends(Flatpickr.l10ns.default, l10n || {});
1955
- };
1956
- Flatpickr.setDefaults = function (config) {
1957
- return _extends(Flatpickr.defaultConfig, config || {});
1958
- };
1959
-
1960
- Flatpickr.prototype = {
1798
+ FlatpickrInstance.prototype = {
1961
1799
  formats: {
1962
1800
  // get the date in UTC
1963
1801
  Z: function Z(date) {
@@ -1976,12 +1814,12 @@ Flatpickr.prototype = {
1976
1814
 
1977
1815
  // padded hour 1-12
1978
1816
  G: function G(date) {
1979
- return Flatpickr.prototype.pad(Flatpickr.prototype.formats.h(date));
1817
+ return FlatpickrInstance.prototype.pad(FlatpickrInstance.prototype.formats.h(date));
1980
1818
  },
1981
1819
 
1982
1820
  // hours with leading zero e.g. 03
1983
1821
  H: function H(date) {
1984
- return Flatpickr.prototype.pad(date.getHours());
1822
+ return FlatpickrInstance.prototype.pad(date.getHours());
1985
1823
  },
1986
1824
 
1987
1825
  // day (1-30) with ordinal suffix e.g. 1st, 2nd
@@ -2001,7 +1839,7 @@ Flatpickr.prototype = {
2001
1839
 
2002
1840
  // seconds 00-59
2003
1841
  S: function S(date) {
2004
- return Flatpickr.prototype.pad(date.getSeconds());
1842
+ return FlatpickrInstance.prototype.pad(date.getSeconds());
2005
1843
  },
2006
1844
 
2007
1845
  // unix timestamp
@@ -2020,7 +1858,7 @@ Flatpickr.prototype = {
2020
1858
 
2021
1859
  // day in month, padded (01-30)
2022
1860
  d: function d(date) {
2023
- return Flatpickr.prototype.pad(date.getDate());
1861
+ return FlatpickrInstance.prototype.pad(date.getDate());
2024
1862
  },
2025
1863
 
2026
1864
  // hour from 1-12 (am/pm)
@@ -2030,7 +1868,7 @@ Flatpickr.prototype = {
2030
1868
 
2031
1869
  // minutes, padded with leading zero e.g. 09
2032
1870
  i: function i(date) {
2033
- return Flatpickr.prototype.pad(date.getMinutes());
1871
+ return FlatpickrInstance.prototype.pad(date.getMinutes());
2034
1872
  },
2035
1873
 
2036
1874
  // day in month (1-30)
@@ -2045,7 +1883,7 @@ Flatpickr.prototype = {
2045
1883
 
2046
1884
  // padded month number (01-12)
2047
1885
  m: function m(date) {
2048
- return Flatpickr.prototype.pad(date.getMonth() + 1);
1886
+ return FlatpickrInstance.prototype.pad(date.getMonth() + 1);
2049
1887
  },
2050
1888
 
2051
1889
  // the month number (1-12)
@@ -2160,7 +1998,7 @@ Flatpickr.prototype = {
2160
1998
  G: "(\\d\\d|\\d)",
2161
1999
  H: "(\\d\\d|\\d)",
2162
2000
  J: "(\\d\\d|\\d)\\w+",
2163
- K: "(\\w+)",
2001
+ K: "(am|AM|Am|aM|pm|PM|Pm|pM)",
2164
2002
  M: "(\\w+)",
2165
2003
  S: "(\\d\\d|\\d)",
2166
2004
  U: "(.+)",
@@ -2191,45 +2029,58 @@ Flatpickr.prototype = {
2191
2029
  * @return {Date} the parsed Date object
2192
2030
  */
2193
2031
  parseDate: function parseDate(date, givenFormat, timeless) {
2194
- if (!date) return null;
2032
+ var _this2 = this;
2033
+
2034
+ if (date !== 0 && !date) return null;
2195
2035
 
2196
2036
  var date_orig = date;
2197
2037
 
2198
- if (date instanceof Date) {
2199
- date = new Date(date.getTime()); // create a copy
2200
- date.fp_isUTC = date_orig.fp_isUTC;
2201
- } else if (date.toFixed !== undefined) // timestamp
2202
- date = new Date(date);else {
2203
- // date string
2204
- var format = givenFormat || (this.config || Flatpickr.defaultConfig).dateFormat;
2205
- date = String(date).trim();
2206
-
2207
- if (date === "today") {
2208
- date = new Date();
2209
- timeless = true;
2210
- } else if (/Z$/.test(date) || /GMT$/.test(date)) // datestrings w/ timezone
2211
- date = new Date(date);else if (this.config && this.config.parseDate) date = this.config.parseDate(date, format);else {
2212
- var parsedDate = !this.config || !this.config.noCalendar ? new Date(new Date().getFullYear(), 0, 1, 0, 0, 0, 0) : new Date(new Date().setHours(0, 0, 0, 0));
2213
-
2214
- var matched = void 0;
2215
-
2216
- for (var i = 0, matchIndex = 0, regexStr = ""; i < format.length; i++) {
2217
- var token = format[i];
2218
- var isBackSlash = token === "\\";
2219
- var escaped = format[i - 1] === "\\" || isBackSlash;
2220
-
2221
- if (this.tokenRegex[token] && !escaped) {
2222
- regexStr += this.tokenRegex[token];
2223
- var match = new RegExp(regexStr).exec(date);
2224
- if (match && (matched = true)) {
2225
- parsedDate = this.revFormat[token](parsedDate, match[++matchIndex]) || parsedDate;
2038
+ if (date instanceof Date) date = new Date(date.getTime()); // create a copy
2039
+
2040
+ else if (date.toFixed !== undefined) // timestamp
2041
+ date = new Date(date);else {
2042
+ // date string
2043
+ var format = givenFormat || (this.config || flatpickr.defaultConfig).dateFormat;
2044
+ date = String(date).trim();
2045
+
2046
+ if (date === "today") {
2047
+ date = new Date();
2048
+ timeless = true;
2049
+ } else if (/Z$/.test(date) || /GMT$/.test(date)) // datestrings w/ timezone
2050
+ date = new Date(date);else if (this.config && this.config.parseDate) date = this.config.parseDate(date, format);else {
2051
+ (function () {
2052
+ var parsedDate = !_this2.config || !_this2.config.noCalendar ? new Date(new Date().getFullYear(), 0, 1, 0, 0, 0, 0) : new Date(new Date().setHours(0, 0, 0, 0));
2053
+
2054
+ var matched = void 0,
2055
+ ops = [];
2056
+
2057
+ for (var i = 0, matchIndex = 0, regexStr = ""; i < format.length; i++) {
2058
+ var token = format[i];
2059
+ var isBackSlash = token === "\\";
2060
+ var escaped = format[i - 1] === "\\" || isBackSlash;
2061
+
2062
+ if (_this2.tokenRegex[token] && !escaped) {
2063
+ regexStr += _this2.tokenRegex[token];
2064
+ var match = new RegExp(regexStr).exec(date);
2065
+ if (match && (matched = true)) {
2066
+ ops[token !== "Y" ? "push" : "unshift"]({
2067
+ fn: _this2.revFormat[token],
2068
+ val: match[++matchIndex]
2069
+ });
2070
+ }
2071
+ } else if (!isBackSlash) regexStr += "."; // don't really care
2072
+
2073
+ ops.forEach(function (_ref) {
2074
+ var fn = _ref.fn,
2075
+ val = _ref.val;
2076
+ return parsedDate = fn(parsedDate, val) || parsedDate;
2077
+ });
2226
2078
  }
2227
- } else if (!isBackSlash) regexStr += "."; // don't really care
2228
- }
2229
2079
 
2230
- date = matched ? parsedDate : null;
2080
+ date = matched ? parsedDate : null;
2081
+ })();
2082
+ }
2231
2083
  }
2232
- }
2233
2084
 
2234
2085
  /* istanbul ignore next */
2235
2086
  if (!(date instanceof Date)) {
@@ -2238,8 +2089,6 @@ Flatpickr.prototype = {
2238
2089
  return null;
2239
2090
  }
2240
2091
 
2241
- if (this.config && this.config.utc && !date.fp_isUTC) date = date.fp_toUTC();
2242
-
2243
2092
  if (timeless === true) date.setHours(0, 0, 0, 0);
2244
2093
 
2245
2094
  return date;
@@ -2252,7 +2101,14 @@ function _flatpickr(nodeList, config) {
2252
2101
  var instances = [];
2253
2102
  for (var i = 0; i < nodes.length; i++) {
2254
2103
  try {
2255
- nodes[i]._flatpickr = new Flatpickr(nodes[i], config || {});
2104
+ if (nodes[i].getAttribute("data-fp-omit") !== null) continue;
2105
+
2106
+ if (nodes[i]._flatpickr) {
2107
+ nodes[i]._flatpickr.destroy();
2108
+ nodes[i]._flatpickr = null;
2109
+ }
2110
+
2111
+ nodes[i]._flatpickr = new FlatpickrInstance(nodes[i], config || {});
2256
2112
  instances.push(nodes[i]._flatpickr);
2257
2113
  } catch (e) {
2258
2114
  console.warn(e, e.stack);
@@ -2276,9 +2132,211 @@ if (typeof HTMLElement !== "undefined") {
2276
2132
 
2277
2133
  /* istanbul ignore next */
2278
2134
  function flatpickr(selector, config) {
2279
- return _flatpickr(window.document.querySelectorAll(selector), config);
2135
+ if (selector instanceof NodeList) return _flatpickr(selector, config);else if (!(selector instanceof HTMLElement)) return _flatpickr(window.document.querySelectorAll(selector), config);
2136
+
2137
+ return _flatpickr([selector], config);
2280
2138
  }
2281
2139
 
2140
+ /* istanbul ignore next */
2141
+ flatpickr.defaultConfig = FlatpickrInstance.defaultConfig = {
2142
+ mode: "single",
2143
+
2144
+ position: "auto",
2145
+
2146
+ animate: typeof window !== "undefined" && window.navigator.userAgent.indexOf("MSIE") === -1,
2147
+
2148
+ // wrap: see https://chmln.github.io/flatpickr/examples/#flatpickr-external-elements
2149
+ wrap: false,
2150
+
2151
+ // enables week numbers
2152
+ weekNumbers: false,
2153
+
2154
+ // allow manual datetime input
2155
+ allowInput: false,
2156
+
2157
+ /*
2158
+ clicking on input opens the date(time)picker.
2159
+ disable if you wish to open the calendar manually with .open()
2160
+ */
2161
+ clickOpens: true,
2162
+
2163
+ /*
2164
+ closes calendar after date selection,
2165
+ unless 'mode' is 'multiple' or enableTime is true
2166
+ */
2167
+ closeOnSelect: true,
2168
+
2169
+ // display time picker in 24 hour mode
2170
+ time_24hr: false,
2171
+
2172
+ // enables the time picker functionality
2173
+ enableTime: false,
2174
+
2175
+ // noCalendar: true will hide the calendar. use for a time picker along w/ enableTime
2176
+ noCalendar: false,
2177
+
2178
+ // more date format chars at https://chmln.github.io/flatpickr/#dateformat
2179
+ dateFormat: "Y-m-d",
2180
+
2181
+ // date format used in aria-label for days
2182
+ ariaDateFormat: "F j, Y",
2183
+
2184
+ // altInput - see https://chmln.github.io/flatpickr/#altinput
2185
+ altInput: false,
2186
+
2187
+ // the created altInput element will have this class.
2188
+ altInputClass: "form-control input",
2189
+
2190
+ // same as dateFormat, but for altInput
2191
+ altFormat: "F j, Y", // defaults to e.g. June 10, 2016
2192
+
2193
+ // defaultDate - either a datestring or a date object. used for datetimepicker"s initial value
2194
+ defaultDate: null,
2195
+
2196
+ // the minimum date that user can pick (inclusive)
2197
+ minDate: null,
2198
+
2199
+ // the maximum date that user can pick (inclusive)
2200
+ maxDate: null,
2201
+
2202
+ // dateparser that transforms a given string to a date object
2203
+ parseDate: null,
2204
+
2205
+ // dateformatter that transforms a given date object to a string, according to passed format
2206
+ formatDate: null,
2207
+
2208
+ getWeek: function getWeek(givenDate) {
2209
+ var date = new Date(givenDate.getTime());
2210
+ var onejan = new Date(date.getFullYear(), 0, 1);
2211
+ return Math.ceil(((date - onejan) / 86400000 + onejan.getDay() + 1) / 7);
2212
+ },
2213
+
2214
+
2215
+ // see https://chmln.github.io/flatpickr/#disable
2216
+ enable: [],
2217
+
2218
+ // see https://chmln.github.io/flatpickr/#disable
2219
+ disable: [],
2220
+
2221
+ // display the short version of month names - e.g. Sep instead of September
2222
+ shorthandCurrentMonth: false,
2223
+
2224
+ // displays calendar inline. see https://chmln.github.io/flatpickr/#inline-calendar
2225
+ inline: false,
2226
+
2227
+ // position calendar inside wrapper and next to the input element
2228
+ // leave at false unless you know what you"re doing
2229
+ "static": false,
2230
+
2231
+ // DOM node to append the calendar to in *static* mode
2232
+ appendTo: null,
2233
+
2234
+ // code for previous/next icons. this is where you put your custom icon code e.g. fontawesome
2235
+ prevArrow: "<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M5.207 8.471l7.146 7.147-0.707 0.707-7.853-7.854 7.854-7.853 0.707 0.707-7.147 7.146z' /></svg>",
2236
+ nextArrow: "<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M13.207 8.472l-7.854 7.854-0.707-0.707 7.146-7.146-7.146-7.148 0.707-0.707 7.854 7.854z' /></svg>",
2237
+
2238
+ // enables seconds in the time picker
2239
+ enableSeconds: false,
2240
+
2241
+ // step size used when scrolling/incrementing the hour element
2242
+ hourIncrement: 1,
2243
+
2244
+ // step size used when scrolling/incrementing the minute element
2245
+ minuteIncrement: 5,
2246
+
2247
+ // initial value in the hour element
2248
+ defaultHour: 12,
2249
+
2250
+ // initial value in the minute element
2251
+ defaultMinute: 0,
2252
+
2253
+ // initial value in the seconds element
2254
+ defaultSeconds: 0,
2255
+
2256
+ // disable native mobile datetime input support
2257
+ disableMobile: false,
2258
+
2259
+ // default locale
2260
+ locale: "default",
2261
+
2262
+ plugins: [],
2263
+
2264
+ ignoredFocusElements: [],
2265
+
2266
+ // called every time calendar is closed
2267
+ onClose: undefined, // function (dateObj, dateStr) {}
2268
+
2269
+ // onChange callback when user selects a date or time
2270
+ onChange: undefined, // function (dateObj, dateStr) {}
2271
+
2272
+ // called for every day element
2273
+ onDayCreate: undefined,
2274
+
2275
+ // called every time the month is changed
2276
+ onMonthChange: undefined,
2277
+
2278
+ // called every time calendar is opened
2279
+ onOpen: undefined, // function (dateObj, dateStr) {}
2280
+
2281
+ // called after the configuration has been parsed
2282
+ onParseConfig: undefined,
2283
+
2284
+ // called after calendar is ready
2285
+ onReady: undefined, // function (dateObj, dateStr) {}
2286
+
2287
+ // called after input value updated
2288
+ onValueUpdate: undefined,
2289
+
2290
+ // called every time the year is changed
2291
+ onYearChange: undefined,
2292
+
2293
+ onKeyDown: undefined,
2294
+
2295
+ onDestroy: undefined
2296
+ };
2297
+
2298
+ /* istanbul ignore next */
2299
+ flatpickr.l10ns = {
2300
+ en: {
2301
+ weekdays: {
2302
+ shorthand: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
2303
+ longhand: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
2304
+ },
2305
+ months: {
2306
+ shorthand: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
2307
+ longhand: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
2308
+ },
2309
+ daysInMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
2310
+ firstDayOfWeek: 0,
2311
+ ordinal: function ordinal(nth) {
2312
+ var s = nth % 100;
2313
+ if (s > 3 && s < 21) return "th";
2314
+ switch (s % 10) {
2315
+ case 1:
2316
+ return "st";
2317
+ case 2:
2318
+ return "nd";
2319
+ case 3:
2320
+ return "rd";
2321
+ default:
2322
+ return "th";
2323
+ }
2324
+ },
2325
+ rangeSeparator: " to ",
2326
+ weekAbbreviation: "Wk",
2327
+ scrollTitle: "Scroll to increment",
2328
+ toggleTitle: "Click to toggle"
2329
+ }
2330
+ };
2331
+
2332
+ flatpickr.l10ns.default = Object.create(flatpickr.l10ns.en);
2333
+ flatpickr.localize = function (l10n) {
2334
+ return _extends(flatpickr.l10ns.default, l10n || {});
2335
+ };
2336
+ flatpickr.setDefaults = function (config) {
2337
+ return _extends(flatpickr.defaultConfig, config || {});
2338
+ };
2339
+
2282
2340
  /* istanbul ignore next */
2283
2341
  if (typeof jQuery !== "undefined") {
2284
2342
  jQuery.fn.flatpickr = function (config) {
@@ -2290,12 +2348,4 @@ Date.prototype.fp_incr = function (days) {
2290
2348
  return new Date(this.getFullYear(), this.getMonth(), this.getDate() + parseInt(days, 10));
2291
2349
  };
2292
2350
 
2293
- Date.prototype.fp_isUTC = false;
2294
- Date.prototype.fp_toUTC = function () {
2295
- var newDate = new Date(this.getUTCFullYear(), this.getUTCMonth(), this.getUTCDate(), this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds());
2296
-
2297
- newDate.fp_isUTC = true;
2298
- return newDate;
2299
- };
2300
-
2301
- if (typeof module !== "undefined") module.exports = Flatpickr;
2351
+ if (typeof module !== "undefined") module.exports = flatpickr;