diff --git a/resources/js/components/ui/index.js b/resources/js/components/ui/index.js
index 86fe6575db1..1d3c3ff2700 100644
--- a/resources/js/components/ui/index.js
+++ b/resources/js/components/ui/index.js
@@ -5,5 +5,6 @@ import { default as DatePicker } from './Datepicker/Index.vue';
import { default as DateRangePicker } from './DateRangePicker/Index.vue';
import { default as TimePicker } from './TimePicker/Index.vue';
import { default as Button } from './Button/Index.vue';
+import { default as Widget } from './Widget.vue';
-export { WithField, Calendar, Card, DatePicker, DateRangePicker, TimePicker, Button };
+export { WithField, Calendar, Card, DatePicker, DateRangePicker, TimePicker, Button, Widget };
diff --git a/resources/js/tests/components/DateFormatter.test.js b/resources/js/tests/components/DateFormatter.test.js
index 0bb73363493..77472d922a0 100644
--- a/resources/js/tests/components/DateFormatter.test.js
+++ b/resources/js/tests/components/DateFormatter.test.js
@@ -208,3 +208,106 @@ test.each([
test('an invalid preset throws an error', () => {
expect(() => new DateFormatter().options('foo')).toThrow('Invalid date format: foo');
});
+
+test.each([
+ // All the different diffs of time. It defaults to 'year' specificity.
+ ['now', 'en', { relative: true }, '2021-12-25T12:13:14Z', 'now'],
+ ['seconds ago', 'en', { relative: true }, '2021-12-25T12:13:12Z', '2 seconds ago'],
+ ['minute ago', 'en', { relative: true }, '2021-12-25T12:12:14Z', '1 minute ago'],
+ ['minutes ago', 'en', { relative: true }, '2021-12-25T12:11:14Z', '2 minutes ago'],
+ ['hour ago', 'en', { relative: true }, '2021-12-25T11:13:14Z', '1 hour ago'],
+ ['hours ago', 'en', { relative: true }, '2021-12-25T10:13:14Z', '2 hours ago'],
+ ['day ago', 'en', { relative: true }, '2021-12-24T12:13:14Z', 'yesterday'],
+ ['days ago', 'en', { relative: true }, '2021-12-23T12:13:14Z', '2 days ago'],
+ ['week ago', 'en', { relative: true }, '2021-12-18T12:13:14Z', 'last week'],
+ ['weeks ago', 'en', { relative: true }, '2021-12-11T12:13:14Z', '2 weeks ago'],
+ ['month ago', 'en', { relative: true }, '2021-11-25T12:13:14Z', 'last month'],
+ ['months ago', 'en', { relative: true }, '2021-10-25T12:13:14Z', '2 months ago'],
+ ['year ago', 'en', { relative: true }, '2020-12-25T12:13:14Z', 'last year'],
+ ['years ago', 'en', { relative: true }, '2019-12-25T12:13:14Z', '2 years ago'],
+
+ // Same in another locale
+ ['de, now', 'de', { relative: true }, '2021-12-25T12:13:14Z', 'jetzt'],
+ ['de, seconds ago', 'de', { relative: true }, '2021-12-25T12:13:12Z', 'vor 2 Sekunden'],
+ ['de, minute ago', 'de', { relative: true }, '2021-12-25T12:12:14Z', 'vor 1 Minute'],
+ ['de, minutes ago', 'de', { relative: true }, '2021-12-25T12:11:14Z', 'vor 2 Minuten'],
+ ['de, hour ago', 'de', { relative: true }, '2021-12-25T11:13:14Z', 'vor 1 Stunde'],
+ ['de, hours ago', 'de', { relative: true }, '2021-12-25T10:13:14Z', 'vor 2 Stunden'],
+ ['de, day ago', 'de', { relative: true }, '2021-12-24T12:13:14Z', 'gestern'],
+ ['de, days ago', 'de', { relative: true }, '2021-12-23T12:13:14Z', 'vorgestern'],
+ ['de, week ago', 'de', { relative: true }, '2021-12-18T12:13:14Z', 'letzte Woche'],
+ ['de, weeks ago', 'de', { relative: true }, '2021-12-11T12:13:14Z', 'vor 2 Wochen'],
+ ['de, month ago', 'de', { relative: true }, '2021-11-25T12:13:14Z', 'letzten Monat'],
+ ['de, months ago', 'de', { relative: true }, '2021-10-25T12:13:14Z', 'vor 2 Monaten'],
+ ['de, year ago', 'de', { relative: true }, '2020-12-25T12:13:14Z', 'letztes Jahr'],
+ ['de, years ago', 'de', { relative: true }, '2019-12-25T12:13:14Z', 'vor 2 Jahren'],
+
+ // All different specificities
+ ['years ago, spec year', 'en', { relative: 'year' }, '2019-12-25T12:13:14Z', '2 years ago'],
+ ['years ago, spec month', 'en', { relative: 'month' }, '2019-12-25T12:13:14Z', '12/25/2019, 12:13 PM'],
+ ['years ago, spec week', 'en', { relative: 'week' }, '2019-12-25T12:13:14Z', '12/25/2019, 12:13 PM'],
+ ['years ago, spec day', 'en', { relative: 'day' }, '2019-12-25T12:13:14Z', '12/25/2019, 12:13 PM'],
+ ['years ago, spec hour', 'en', { relative: 'hour' }, '2019-12-25T12:13:14Z', '12/25/2019, 12:13 PM'],
+ ['years ago, spec minute', 'en', { relative: 'minute' }, '2019-12-25T12:13:14Z', '12/25/2019, 12:13 PM'],
+ ['years ago, spec second', 'en', { relative: 'second' }, '2019-12-25T12:13:14Z', '12/25/2019, 12:13 PM'],
+ ['months ago, spec year', 'en', { relative: 'year' }, '2021-10-25T12:13:14Z', '2 months ago'],
+ ['months ago, spec month', 'en', { relative: 'month' }, '2021-10-25T12:13:14Z', '2 months ago'],
+ ['months ago, spec week', 'en', { relative: 'week' }, '2021-10-25T12:13:14Z', '10/25/2021, 12:13 PM'],
+ ['months ago, spec day', 'en', { relative: 'day' }, '2021-10-25T12:13:14Z', '10/25/2021, 12:13 PM'],
+ ['months ago, spec hour', 'en', { relative: 'hour' }, '2021-10-25T12:13:14Z', '10/25/2021, 12:13 PM'],
+ ['months ago, spec minute', 'en', { relative: 'minute' }, '2021-10-25T12:13:14Z', '10/25/2021, 12:13 PM'],
+ ['months ago, spec second', 'en', { relative: 'second' }, '2021-10-25T12:13:14Z', '10/25/2021, 12:13 PM'],
+ ['weeks ago, spec year', 'en', { relative: 'year' }, '2021-12-11T12:13:14Z', '2 weeks ago'],
+ ['weeks ago, spec month', 'en', { relative: 'month' }, '2021-12-11T12:13:14Z', '2 weeks ago'],
+ ['weeks ago, spec week', 'en', { relative: 'week' }, '2021-12-11T12:13:14Z', '2 weeks ago'],
+ ['weeks ago, spec day', 'en', { relative: 'day' }, '2021-12-11T12:13:14Z', '12/11/2021, 12:13 PM'],
+ ['weeks ago, spec hour', 'en', { relative: 'hour' }, '2021-12-11T12:13:14Z', '12/11/2021, 12:13 PM'],
+ ['weeks ago, spec minute', 'en', { relative: 'minute' }, '2021-12-11T12:13:14Z', '12/11/2021, 12:13 PM'],
+ ['weeks ago, spec second', 'en', { relative: 'second' }, '2021-12-11T12:13:14Z', '12/11/2021, 12:13 PM'],
+ ['days ago, spec year', 'en', { relative: 'year' }, '2021-12-23T12:13:14Z', '2 days ago'],
+ ['days ago, spec month', 'en', { relative: 'month' }, '2021-12-23T12:13:14Z', '2 days ago'],
+ ['days ago, spec week', 'en', { relative: 'week' }, '2021-12-23T12:13:14Z', '2 days ago'],
+ ['days ago, spec day', 'en', { relative: 'day' }, '2021-12-23T12:13:14Z', '2 days ago'],
+ ['days ago, spec hour', 'en', { relative: 'hour' }, '2021-12-23T12:13:14Z', '12/23/2021, 12:13 PM'],
+ ['days ago, spec minute', 'en', { relative: 'minute' }, '2021-12-23T12:13:14Z', '12/23/2021, 12:13 PM'],
+ ['days ago, spec second', 'en', { relative: 'second' }, '2021-12-23T12:13:14Z', '12/23/2021, 12:13 PM'],
+ ['hours ago, spec year', 'en', { relative: 'year' }, '2021-12-25T10:13:14Z', '2 hours ago'],
+ ['hours ago, spec month', 'en', { relative: 'month' }, '2021-12-25T10:13:14Z', '2 hours ago'],
+ ['hours ago, spec week', 'en', { relative: 'week' }, '2021-12-25T10:13:14Z', '2 hours ago'],
+ ['hours ago, spec day', 'en', { relative: 'day' }, '2021-12-25T10:13:14Z', '2 hours ago'],
+ ['hours ago, spec hour', 'en', { relative: 'hour' }, '2021-12-25T10:13:14Z', '2 hours ago'],
+ ['hours ago, spec minute', 'en', { relative: 'minute' }, '2021-12-25T10:13:14Z', '12/25/2021, 10:13 AM'],
+ ['hours ago, spec second', 'en', { relative: 'second' }, '2021-12-25T10:13:14Z', '12/25/2021, 10:13 AM'],
+ ['minutes ago, spec year', 'en', { relative: 'year' }, '2021-12-25T12:11:14Z', '2 minutes ago'],
+ ['minutes ago, spec month', 'en', { relative: 'month' }, '2021-12-25T12:11:14Z', '2 minutes ago'],
+ ['minutes ago, spec week', 'en', { relative: 'week' }, '2021-12-25T12:11:14Z', '2 minutes ago'],
+ ['minutes ago, spec day', 'en', { relative: 'day' }, '2021-12-25T12:11:14Z', '2 minutes ago'],
+ ['minutes ago, spec hour', 'en', { relative: 'hour' }, '2021-12-25T12:11:14Z', '2 minutes ago'],
+ ['minutes ago, spec minute', 'en', { relative: 'minute' }, '2021-12-25T12:11:14Z', '2 minutes ago'],
+ ['minutes ago, spec second', 'en', { relative: 'second' }, '2021-12-25T12:11:14Z', '12/25/2021, 12:11 PM'],
+ ['seconds ago, spec year', 'en', { relative: 'year' }, '2021-12-25T12:13:12Z', '2 seconds ago'],
+ ['seconds ago, spec month', 'en', { relative: 'month' }, '2021-12-25T12:13:12Z', '2 seconds ago'],
+ ['seconds ago, spec week', 'en', { relative: 'week' }, '2021-12-25T12:13:12Z', '2 seconds ago'],
+ ['seconds ago, spec day', 'en', { relative: 'day' }, '2021-12-25T12:13:12Z', '2 seconds ago'],
+ ['seconds ago, spec hour', 'en', { relative: 'hour' }, '2021-12-25T12:13:12Z', '2 seconds ago'],
+ ['seconds ago, spec minute', 'en', { relative: 'minute' }, '2021-12-25T12:13:12Z', '2 seconds ago'],
+ ['seconds ago, spec second', 'en', { relative: 'second' }, '2021-12-25T12:13:12Z', '2 seconds ago'],
+ [
+ 'fallback of datetime preset',
+ 'en',
+ { relative: 'second', fallback: 'datetime' },
+ '2021-12-20T12:13:14Z',
+ '12/20/2021, 12:13 PM',
+ ],
+ ['fallback of time preset', 'en', { relative: 'second', fallback: 'time' }, '2021-12-20T12:13:14Z', '12:13 PM'],
+ [
+ 'fallback of options',
+ 'en',
+ { relative: 'second', fallback: { dateStyle: 'long', timeStyle: 'long' } },
+ '2021-12-20T12:13:14Z',
+ 'December 20, 2021 at 12:13:14 PM UTC',
+ ],
+])('it can use relative format (%s)', (label, locale, options, date, expected) => {
+ setNavigatorLanguage(locale);
+ expect(new DateFormatter().format(date, options)).toBe(expected);
+});
diff --git a/resources/views/forms/widget.blade.php b/resources/views/forms/widget.blade.php
index df87af3a13b..48cedab6ee6 100644
--- a/resources/views/forms/widget.blade.php
+++ b/resources/views/forms/widget.blade.php
@@ -1,45 +1,6 @@
-@php
- use function Statamic\trans as __;
-@endphp
-
-@php
- use Statamic\Support\Arr;
-@endphp
-
-
-
-
- @if (! $submissions)
-
{{ __('This form is awaiting responses') }}
- @else
-
- @foreach ($submissions as $submission)
-
- @foreach ($fields as $key => $field)
- |
-
- {{ Arr::get($submission, $field) }}
-
- |
- @endforeach
-
-
- {{ $submission['date']->diffInDays() <= 14 ? $submission['date']->diffForHumans() : $submission['date']->asVueComponent() }}
- |
-
- @endforeach
-
- @endif
-
-
+
diff --git a/src/Forms/Widget.php b/src/Forms/Widget.php
index 604a7decedd..3d9c879ccf3 100644
--- a/src/Forms/Widget.php
+++ b/src/Forms/Widget.php
@@ -27,6 +27,7 @@ public function html()
'fields' => $this->config('fields', []),
'submissions' => collect($form->submissions())->reverse()->take((int) $this->config('limit', 5))->toArray(),
'title' => $this->config('title', $form->title()),
+ 'limit' => $this->config('limit', 5),
]);
}
}