bullet_train-fields 1.3.1 → 1.3.3
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.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8d55793fe0b13a862e6df286add5f944e51ddac507d83e3771b35b839a123599
|
4
|
+
data.tar.gz: df7c6f3067c58ec7afeb9f673b2eab58bdcd53c8dbefd6d6da7a3fb44b1dbaa1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b952ed07c8cc291358ce1195b8dbeb681b914c60eb359ef18a3ead154ee114538f7526e2a26eb1d05339534103a53e25b3e819a5fbd5c329068de6ad8a9e755f
|
7
|
+
data.tar.gz: 87aa8fa81f8bc2cbaf9dda4c590860d6ab7b3adfb570f2b0fcf34c7b61346f9d6bd275caf180ac970518de87c2f5c8f976ab979f13491883d1cc5e84ea9024c5
|
@@ -2,12 +2,22 @@ module Fields::DateAndTimeSupport
|
|
2
2
|
extend ActiveSupport::Concern
|
3
3
|
|
4
4
|
def assign_date_and_time(strong_params, attribute)
|
5
|
+
deprecator = ActiveSupport::Deprecation.new("2.0", "BulletTrain::Fields")
|
6
|
+
deprecator.deprecation_warning(
|
7
|
+
"assign_date_and_time",
|
8
|
+
"Please assign an ISO8601 datetime string as form field value instead and remove all assign_date_and_time assignments,
|
9
|
+
see https://ruby-doc.org/3.2.2/exts/date/DateTime.html"
|
10
|
+
)
|
5
11
|
attribute = attribute.to_s
|
6
12
|
time_zone_attribute = "#{attribute}_time_zone"
|
7
13
|
if strong_params.dig(attribute).present?
|
8
|
-
|
9
|
-
|
10
|
-
|
14
|
+
begin
|
15
|
+
strong_params[attribute] = DateTime.iso8601(strong_params[attribute])
|
16
|
+
rescue ArgumentError
|
17
|
+
time_zone = ActiveSupport::TimeZone.new(strong_params[time_zone_attribute] || current_team.time_zone)
|
18
|
+
strong_params.delete(time_zone_attribute)
|
19
|
+
strong_params[attribute] = time_zone.strptime(strong_params[attribute], t("global.formats.date_and_time"))
|
20
|
+
end
|
11
21
|
end
|
12
22
|
end
|
13
23
|
end
|
@@ -2,11 +2,21 @@ module Fields::DateSupport
|
|
2
2
|
extend ActiveSupport::Concern
|
3
3
|
|
4
4
|
def assign_date(strong_params, attribute)
|
5
|
+
deprecator = ActiveSupport::Deprecation.new("2.0", "BulletTrain::Fields")
|
6
|
+
deprecator.deprecation_warning(
|
7
|
+
"assign_date",
|
8
|
+
"Please assign an ISO8601 date string as field value instead and remove all assign_date assignments,
|
9
|
+
see https://ruby-doc.org/3.2.2/exts/date/Date.html"
|
10
|
+
)
|
5
11
|
attribute = attribute.to_s
|
6
12
|
if strong_params.dig(attribute).present?
|
7
|
-
|
8
|
-
|
9
|
-
|
13
|
+
begin
|
14
|
+
strong_params[attribute] = Date.iso8601(strong_params[attribute])
|
15
|
+
rescue ArgumentError
|
16
|
+
parsed_value = Chronic.parse(strong_params[attribute])
|
17
|
+
return nil unless parsed_value
|
18
|
+
strong_params[attribute] = parsed_value.to_date
|
19
|
+
end
|
10
20
|
end
|
11
21
|
end
|
12
22
|
end
|
@@ -3,14 +3,18 @@ require("daterangepicker/daterangepicker.css");
|
|
3
3
|
|
4
4
|
// requires jQuery, moment, might want to consider a vanilla JS alternative
|
5
5
|
import 'daterangepicker';
|
6
|
+
import moment from 'moment-timezone'
|
6
7
|
|
7
8
|
export default class extends Controller {
|
8
|
-
static targets = [ "field", "clearButton", "currentTimeZoneWrapper", "timeZoneButtons", "timeZoneSelectWrapper", "timeZoneField" ]
|
9
|
+
static targets = [ "field", "displayField", "clearButton", "currentTimeZoneWrapper", "timeZoneButtons", "timeZoneSelectWrapper", "timeZoneField", "timeZoneSelect" ]
|
9
10
|
static values = {
|
10
11
|
includeTime: Boolean,
|
11
12
|
defaultTimeZones: Array,
|
12
|
-
|
13
|
-
|
13
|
+
dateFormat: String,
|
14
|
+
timeFormat: String,
|
15
|
+
currentTimeZone: String,
|
16
|
+
isAmPm: Boolean,
|
17
|
+
pickerLocale: { type: Object, default: {} }
|
14
18
|
}
|
15
19
|
|
16
20
|
connect() {
|
@@ -26,13 +30,33 @@ export default class extends Controller {
|
|
26
30
|
event.preventDefault()
|
27
31
|
|
28
32
|
$(this.fieldTarget).val('')
|
33
|
+
$(this.displayFieldTarget).val('')
|
34
|
+
}
|
35
|
+
|
36
|
+
currentTimeZone(){
|
37
|
+
return (
|
38
|
+
( this.hasTimeZoneSelectWrapperTarget && $(this.timeZoneSelectWrapperTarget).is(":visible") && this.timeZoneSelectTarget.value ) ||
|
39
|
+
( this.hasTimeZoneFieldTarget && this.timeZoneFieldTarget.value ) ||
|
40
|
+
this.currentTimeZoneValue
|
41
|
+
)
|
29
42
|
}
|
30
43
|
|
31
44
|
applyDateToField(event, picker) {
|
32
|
-
const format = this.includeTimeValue ?
|
33
|
-
|
45
|
+
const format = this.includeTimeValue ? this.timeFormatValue : this.dateFormatValue
|
46
|
+
const newTimeZone = this.currentTimeZone()
|
47
|
+
const momentVal = (
|
48
|
+
picker ?
|
49
|
+
moment(picker.startDate.toISOString()).tz(newTimeZone, true) :
|
50
|
+
moment.tz(moment(this.fieldTarget.value, "YYYY-MM-DDTHH:mm").format("YYYY-MM-DDTHH:mm"), newTimeZone)
|
51
|
+
)
|
52
|
+
const displayVal = momentVal.format(format)
|
53
|
+
const dataVal = this.includeTimeValue ? momentVal.toISOString(true) : momentVal.format('YYYY-MM-DD')
|
54
|
+
$(this.displayFieldTarget).val(displayVal)
|
55
|
+
$(this.fieldTarget).val(dataVal)
|
34
56
|
// bubble up a change event when the input is updated for other listeners
|
35
|
-
|
57
|
+
if(picker){
|
58
|
+
this.displayFieldTarget.dispatchEvent(new CustomEvent('change', { detail: { picker: picker }}))
|
59
|
+
}
|
36
60
|
}
|
37
61
|
|
38
62
|
showTimeZoneButtons(event) {
|
@@ -43,15 +67,18 @@ export default class extends Controller {
|
|
43
67
|
$(this.timeZoneButtonsTarget).toggleClass('hidden')
|
44
68
|
}
|
45
69
|
|
70
|
+
// triggered on other click from the timezone buttons
|
46
71
|
showTimeZoneSelectWrapper(event) {
|
47
72
|
// don't follow the anchor
|
48
73
|
event.preventDefault()
|
49
74
|
|
50
75
|
$(this.timeZoneButtonsTarget).toggleClass('hidden')
|
51
|
-
|
52
76
|
if (this.hasTimeZoneSelectWrapperTarget) {
|
53
77
|
$(this.timeZoneSelectWrapperTarget).toggleClass('hidden')
|
54
78
|
}
|
79
|
+
if(!["", null].includes(this.fieldTarget.value)){
|
80
|
+
$(this.displayFieldTarget).trigger("apply.daterangepicker");
|
81
|
+
}
|
55
82
|
}
|
56
83
|
|
57
84
|
resetTimeZoneUI(e) {
|
@@ -65,39 +92,70 @@ export default class extends Controller {
|
|
65
92
|
}
|
66
93
|
}
|
67
94
|
|
95
|
+
// triggered on selecting a new timezone using the buttons
|
68
96
|
setTimeZone(event) {
|
69
97
|
// don't follow the anchor
|
70
98
|
event.preventDefault()
|
71
|
-
|
72
99
|
const currentTimeZoneEl = this.currentTimeZoneWrapperTarget.querySelector('a')
|
73
|
-
|
74
|
-
|
75
|
-
$(this.timeZoneFieldTarget).val(value)
|
76
|
-
$(currentTimeZoneEl).text(value)
|
77
|
-
|
100
|
+
$(this.timeZoneFieldTarget).val(event.target.dataset.value)
|
101
|
+
$(currentTimeZoneEl).text(event.target.dataset.label)
|
78
102
|
$('.time-zone-button').removeClass('button').addClass('button-alternative')
|
79
103
|
$(event.target).removeClass('button-alternative').addClass('button')
|
104
|
+
this.resetTimeZoneUI()
|
105
|
+
if(!["", null].includes(this.fieldTarget.value)){
|
106
|
+
$(this.displayFieldTarget).trigger("apply.daterangepicker");
|
107
|
+
}
|
108
|
+
}
|
109
|
+
|
110
|
+
// triggered on selecting a new timezone from the timezone picker
|
111
|
+
selectTimeZoneChange(event) {
|
112
|
+
if(!["", null].includes(this.fieldTarget.value)){
|
113
|
+
$(this.displayFieldTarget).trigger("apply.daterangepicker");
|
114
|
+
}
|
115
|
+
}
|
80
116
|
|
117
|
+
// triggered on cancel click from the timezone picker
|
118
|
+
cancelSelect(event) {
|
119
|
+
event.preventDefault()
|
81
120
|
this.resetTimeZoneUI()
|
121
|
+
if(!["", null].includes(this.fieldTarget.value)){
|
122
|
+
$(this.displayFieldTarget).trigger("apply.daterangepicker")
|
123
|
+
}
|
124
|
+
}
|
125
|
+
|
126
|
+
displayFieldChange(event) {
|
127
|
+
const newTimeZone = this.currentTimeZone()
|
128
|
+
const format = this.includeTimeValue ? this.timeFormatValue : this.dateFormatValue
|
129
|
+
const momentParsed = moment(this.displayFieldTarget.value, format, false)
|
130
|
+
if(momentParsed.isValid()){
|
131
|
+
const momentVal = moment.tz(momentParsed.format("YYYY-MM-DDTHH:mm"), newTimeZone)
|
132
|
+
const dataVal = this.includeTimeValue ? momentVal.toISOString(true) : momentVal.format('YYYY-MM-DD')
|
133
|
+
$(this.fieldTarget).val(dataVal)
|
134
|
+
} else {
|
135
|
+
// nullify field value when the display format is wrong
|
136
|
+
$(this.fieldTarget).val("")
|
137
|
+
}
|
82
138
|
}
|
83
139
|
|
84
140
|
initPluginInstance() {
|
85
|
-
|
141
|
+
const localeValues = this.pickerLocaleValue
|
142
|
+
const isAmPm = this.isAmPmValue
|
143
|
+
localeValues['format'] = this.includeTimeValue ? this.timeFormatValue : this.dateFormatValue
|
144
|
+
|
145
|
+
$(this.displayFieldTarget).daterangepicker({
|
86
146
|
singleDatePicker: true,
|
87
147
|
timePicker: this.includeTimeValue,
|
88
148
|
timePickerIncrement: 5,
|
89
149
|
autoUpdateInput: false,
|
90
|
-
locale:
|
91
|
-
|
92
|
-
applyLabel: this.applyButtonLabelValue,
|
93
|
-
format: this.includeTimeValue ? 'MM/DD/YYYY h:mm A' : 'MM/DD/YYYY'
|
94
|
-
}
|
150
|
+
locale: localeValues,
|
151
|
+
timePicker24Hour: !isAmPm,
|
95
152
|
})
|
96
153
|
|
97
|
-
$(this.
|
98
|
-
$(this.
|
154
|
+
$(this.displayFieldTarget).on('apply.daterangepicker', this.applyDateToField.bind(this))
|
155
|
+
$(this.displayFieldTarget).on('cancel.daterangepicker', this.clearDate.bind(this))
|
156
|
+
$(this.displayFieldTarget).on('input', this,this.displayFieldChange.bind(this));
|
99
157
|
|
100
|
-
this.pluginMainEl = this.
|
158
|
+
this.pluginMainEl = this.displayFieldTarget
|
101
159
|
this.plugin = $(this.pluginMainEl).data('daterangepicker') // weird
|
102
160
|
|
103
161
|
// Init time zone select
|
@@ -113,7 +171,6 @@ export default class extends Controller {
|
|
113
171
|
$(this.timeZoneSelect).on('change.select2', function(event) {
|
114
172
|
const currentTimeZoneEl = self.currentTimeZoneWrapperTarget.querySelector('a')
|
115
173
|
const {value} = event.target
|
116
|
-
|
117
174
|
$(self.timeZoneFieldTarget).val(value)
|
118
175
|
$(currentTimeZoneEl).text(value)
|
119
176
|
|
@@ -126,7 +183,6 @@ export default class extends Controller {
|
|
126
183
|
} else {
|
127
184
|
// deselect any selected button
|
128
185
|
$('.time-zone-button').removeClass('button').addClass('button-alternative')
|
129
|
-
|
130
186
|
selectedOptionTimeZoneButton.text(value)
|
131
187
|
selectedOptionTimeZoneButton.attr('data-value', value).removeAttr('hidden')
|
132
188
|
selectedOptionTimeZoneButton.removeClass(['hidden', 'button-alternative']).addClass('button')
|
@@ -139,10 +195,8 @@ export default class extends Controller {
|
|
139
195
|
|
140
196
|
teardownPluginInstance() {
|
141
197
|
if (this.plugin === undefined) { return }
|
142
|
-
|
143
198
|
$(this.pluginMainEl).off('apply.daterangepicker')
|
144
199
|
$(this.pluginMainEl).off('cancel.daterangepicker')
|
145
|
-
|
146
200
|
// revert to original markup, remove any event listeners
|
147
201
|
this.plugin.remove()
|
148
202
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bullet_train-fields
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Culver
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-08-
|
11
|
+
date: 2023-08-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: standard
|