From 329ffa71bf8b97568d61546d9b5ae3d0997c63a9 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 15 Jan 2020 22:16:05 -0300 Subject: [PATCH 1/2] Include Date Field --- .../components/date_time_picker.js | 4 ++ app/views/fields/date/_form.html.erb | 24 +++++++++ app/views/fields/date/_index.html.erb | 21 ++++++++ app/views/fields/date/_show.html.erb | 21 ++++++++ docs/customizing_attribute_partials.md | 1 + docs/customizing_dashboards.md | 5 ++ lib/administrate/base_dashboard.rb | 1 + lib/administrate/field/date.rb | 20 ++++++++ .../dashboard/dashboard_generator.rb | 2 +- spec/generators/dashboard_generator_spec.rb | 6 +-- spec/lib/fields/date_spec.rb | 50 +++++++++++++++++++ 11 files changed, 151 insertions(+), 4 deletions(-) create mode 100644 app/views/fields/date/_form.html.erb create mode 100644 app/views/fields/date/_index.html.erb create mode 100644 app/views/fields/date/_show.html.erb create mode 100644 lib/administrate/field/date.rb create mode 100644 spec/lib/fields/date_spec.rb diff --git a/app/assets/javascripts/administrate/components/date_time_picker.js b/app/assets/javascripts/administrate/components/date_time_picker.js index f6b29d1ce1..c2eb6c7659 100644 --- a/app/assets/javascripts/administrate/components/date_time_picker.js +++ b/app/assets/javascripts/administrate/components/date_time_picker.js @@ -7,4 +7,8 @@ $(function () { debug: false, format: "YYYY-MM-DD HH:mm:ss", }); + $('[data-type="date"]').datetimepicker({ + debug: false, + format: "YYYY-MM-DD", + }); }); diff --git a/app/views/fields/date/_form.html.erb b/app/views/fields/date/_form.html.erb new file mode 100644 index 0000000000..aecbcdb792 --- /dev/null +++ b/app/views/fields/date/_form.html.erb @@ -0,0 +1,24 @@ +<%# +# Date Form Partial + +This partial renders an input element for a date attribute. +By default, the input is a text field that is augmented with [DateTimePicker]. + +## Local variables: + +- `f`: + A Rails form generator, used to help create the appropriate input fields. +- `field`: + An instance of [Administrate::Field::Date][1]. + A wrapper around the Date value pulled from the database. + +[1]: http://www.rubydoc.info/gems/administrate/Administrate/Field/Date +[DateTimePicker]: https://github.com/Eonasdan/bootstrap-datetimepicker +%> + +
+ <%= f.label field.attribute %> +
+
+ <%= f.text_field field.attribute, data: { type: 'date' } %> +
diff --git a/app/views/fields/date/_index.html.erb b/app/views/fields/date/_index.html.erb new file mode 100644 index 0000000000..bf49eb54bd --- /dev/null +++ b/app/views/fields/date/_index.html.erb @@ -0,0 +1,21 @@ +<%# +# Date Index Partial + +This partial renders a date attribute, +to be displayed on a resource's index page. + +By default, the attribute is rendered +as a localized date string. + +## Local variables: + +- `field`: + An instance of [Administrate::Field::Date][1]. + A wrapper around the Date value pulled from the database. + +[1]: http://www.rubydoc.info/gems/administrate/Administrate/Field/Date +%> + +<% if field.data %> + <%= field.date %> +<% end %> diff --git a/app/views/fields/date/_show.html.erb b/app/views/fields/date/_show.html.erb new file mode 100644 index 0000000000..f1439e0e44 --- /dev/null +++ b/app/views/fields/date/_show.html.erb @@ -0,0 +1,21 @@ +<%# +# Date Show Partial + +This partial renders a date attribute, +to be displayed on a resource's show page. + +By default, the attribute is rendered +as a localized date string. + +## Local variables: + +- `field`: + An instance of [Administrate::Field::Date][1]. + A wrapper around the Date value pulled from the database. + +[1]: http://www.rubydoc.info/gems/administrate/Administrate/Field/Date +%> + +<% if field.data %> + <%= field.date %> +<% end %> diff --git a/docs/customizing_attribute_partials.md b/docs/customizing_attribute_partials.md index e6ec72f1a6..1be446e1c2 100644 --- a/docs/customizing_attribute_partials.md +++ b/docs/customizing_attribute_partials.md @@ -6,6 +6,7 @@ across all dashboards. You can customize the following built in field types: - `belongs_to` - `boolean` - `date_time` +- `date` - `email` - `has_many` - `has_one` diff --git a/docs/customizing_dashboards.md b/docs/customizing_dashboards.md index d1a535730e..c90306b322 100644 --- a/docs/customizing_dashboards.md +++ b/docs/customizing_dashboards.md @@ -190,6 +190,11 @@ objects to display as. `:timezone` - Specify which timezone `Date` and `DateTime` objects are based in. +**Field::Date** + +`:format` - Specify what format, using `strftime` you would like `Date` +objects to display as. + **Field::Select** `:collection` - Specify the array or range to select from. Defaults to `[]`. diff --git a/lib/administrate/base_dashboard.rb b/lib/administrate/base_dashboard.rb index 1b37a4fdb6..3fbac7fb57 100644 --- a/lib/administrate/base_dashboard.rb +++ b/lib/administrate/base_dashboard.rb @@ -1,6 +1,7 @@ require "administrate/field/belongs_to" require "administrate/field/boolean" require "administrate/field/date_time" +require "administrate/field/date" require "administrate/field/email" require "administrate/field/has_many" require "administrate/field/has_one" diff --git a/lib/administrate/field/date.rb b/lib/administrate/field/date.rb new file mode 100644 index 0000000000..04c89f93db --- /dev/null +++ b/lib/administrate/field/date.rb @@ -0,0 +1,20 @@ +require_relative "base" + +module Administrate + module Field + class Date < Base + def date + I18n.localize( + data.to_date, + format: format, + ) + end + + private + + def format + options.fetch(:format, :default) + end + end + end +end diff --git a/lib/generators/administrate/dashboard/dashboard_generator.rb b/lib/generators/administrate/dashboard/dashboard_generator.rb index 1b4cb70a82..0240176cdf 100644 --- a/lib/generators/administrate/dashboard/dashboard_generator.rb +++ b/lib/generators/administrate/dashboard/dashboard_generator.rb @@ -5,7 +5,7 @@ module Generators class DashboardGenerator < Rails::Generators::NamedBase ATTRIBUTE_TYPE_MAPPING = { boolean: "Field::Boolean", - date: "Field::DateTime", + date: "Field::Date", datetime: "Field::DateTime", enum: "Field::String", float: "Field::Number", diff --git a/spec/generators/dashboard_generator_spec.rb b/spec/generators/dashboard_generator_spec.rb index c5091aa2e6..6253d207d1 100644 --- a/spec/generators/dashboard_generator_spec.rb +++ b/spec/generators/dashboard_generator_spec.rb @@ -174,8 +174,8 @@ class User < ApplicationRecord end end - it "assigns dates, times, and datetimes a type of `DateTime` and - `Time`" do + it "assigns dates, times, and datetimes a type of `Date`, `DateTime` and + `Time` respectively" do begin ActiveRecord::Schema.define do create_table :events do |t| @@ -193,7 +193,7 @@ class Event < ApplicationRecord load file("app/dashboards/event_dashboard.rb") attrs = EventDashboard::ATTRIBUTE_TYPES - expect(attrs[:start_date]).to eq(Administrate::Field::DateTime) + expect(attrs[:start_date]).to eq(Administrate::Field::Date) expect(attrs[:start_time]).to eq(Administrate::Field::Time) expect(attrs[:ends_at]).to eq(Administrate::Field::DateTime) ensure diff --git a/spec/lib/fields/date_spec.rb b/spec/lib/fields/date_spec.rb new file mode 100644 index 0000000000..36a8b9bb16 --- /dev/null +++ b/spec/lib/fields/date_spec.rb @@ -0,0 +1,50 @@ +require "rails_helper" +require "administrate/field/date" + +describe Administrate::Field::Date do + let(:start_date) { Date.parse("2015-12-25") } + let(:formats) do + { + date: { + formats: { default: "%m/%d/%Y", short: "%b %d" }, + abbr_month_names: Array.new(13) { |i| "Dec" if i == 12 }, + abbr_day_names: Array.new(7) { |i| "Fri" if i == 5 }, + }, + time: { + formats: { default: "%a, %b %-d, %Y", short: "%d %b" }, + }, + } + end + + describe "#date" do + it "displays the date" do + with_translations(:en, formats) do + field = Administrate::Field::Date. + new(:start_date, start_date, :show) + expect(field.date).to eq("12/25/2015") + end + end + + context "with `prefix` option" do + it "displays the date in the requested format" do + options_field = Administrate::Field::Date. + with_options(format: :short) + field = options_field.new(:start_date, start_date, :show) + + with_translations(:en, formats) do + expect(field.date).to eq("Dec 25") + end + end + + it "displays the date using a format string" do + options_field = Administrate::Field::Date. + with_options(format: "%Y") + field = options_field.new(:start_date, start_date, :show) + + with_translations(:en, formats) do + expect(field.date).to eq("2015") + end + end + end + end +end From 0c7bf7cdf4f9ab732ca63f0319f13248cb207f2f Mon Sep 17 00:00:00 2001 From: Sebastian Herrera Date: Thu, 23 Jan 2020 17:48:38 -0300 Subject: [PATCH 2/2] change double quotes for single --- .../javascripts/administrate/components/date_time_picker.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/administrate/components/date_time_picker.js b/app/assets/javascripts/administrate/components/date_time_picker.js index c2eb6c7659..18266ea946 100644 --- a/app/assets/javascripts/administrate/components/date_time_picker.js +++ b/app/assets/javascripts/administrate/components/date_time_picker.js @@ -1,14 +1,14 @@ $(function () { $('[data-type="time"]').datetimepicker({ debug: false, - format: "HH:mm:ss", + format: 'HH:mm:ss', }); $('[data-type="datetime"]').datetimepicker({ debug: false, - format: "YYYY-MM-DD HH:mm:ss", + format: 'YYYY-MM-DD HH:mm:ss', }); $('[data-type="date"]').datetimepicker({ debug: false, - format: "YYYY-MM-DD", + format: 'YYYY-MM-DD', }); });