Skip to content

Commit 48ce6fa

Browse files
authored
🧑‍💻 Update Article datepicker (#128)
1 parent 4db4b49 commit 48ce6fa

File tree

12 files changed

+231
-215
lines changed

12 files changed

+231
-215
lines changed

app/Http/Livewire/Articles/Create.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
use App\Models\User;
1212
use App\Traits\WithArticleAttributes;
1313
use App\Traits\WithTagsAssociation;
14+
use Carbon\Carbon;
15+
use DateTimeInterface;
1416
use Illuminate\Contracts\View\View;
1517
use Illuminate\Support\Facades\Auth;
1618
use Livewire\Component;
@@ -50,6 +52,13 @@ public function store(): void
5052
/** @var User $user */
5153
$user = Auth::user();
5254

55+
if ($this->published_at && ! ($this->published_at instanceof DateTimeInterface)) {
56+
$this->published_at = new Carbon(
57+
time: $this->published_at,
58+
tz: config('app.timezone')
59+
);
60+
}
61+
5362
/** @var Article $article */
5463
$article = Article::create([
5564
'title' => $this->title,
@@ -64,7 +73,7 @@ public function store(): void
6473
]);
6574

6675
if (collect($this->associateTags)->isNotEmpty()) {
67-
$article->syncTags($this->associateTags);
76+
$article->syncTags(tags: $this->associateTags);
6877
}
6978

7079
if ($this->file) {

public/css/app.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

public/js/app.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

public/mix-manifest.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
{
2-
"/js/app.js": "/js/app.js?id=e624a82705e66ddf8f8774361377693b",
3-
"/css/app.css": "/css/app.css?id=3542b9735c706c26665a33113b79c212"
2+
"/js/app.js": "/js/app.js?id=b3926f80205eb8b77d68a280462d061f",
3+
"/css/app.css": "/css/app.css?id=e1f5ef9f7dd1d6ba4334d8eb1f233620"
44
}

resources/js/app.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import Tooltip from '@ryangjchandler/alpine-tooltip'
55

66
import NotificationsAlpinePlugin from '../../vendor/filament/notifications/dist/module.esm'
77
import internationalNumber from './plugins/internationalNumber'
8+
import datepicker from './plugins/datepicker'
89
import { registerHeader } from '@helpers/header'
910
import '@helpers/helpers'
1011
import '@helpers/scrollspy'
@@ -20,6 +21,7 @@ Alpine.plugin(intersect)
2021
Alpine.plugin(NotificationsAlpinePlugin)
2122
Alpine.plugin(Tooltip)
2223
Alpine.data('internationalNumber', internationalNumber)
24+
Alpine.data('datepicker', datepicker)
2325

2426
window.Alpine = Alpine
2527

resources/js/components/Button.jsx

Lines changed: 0 additions & 37 deletions
This file was deleted.

resources/js/components/Form.jsx

Lines changed: 0 additions & 137 deletions
This file was deleted.

resources/js/components/Loader.jsx

Lines changed: 0 additions & 8 deletions
This file was deleted.

resources/js/elements/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import preactCustomElement from '@helpers/preact.js'
22

3-
import { Testimonies} from '@components/Testimonies'
3+
import { Testimonies } from '@components/Testimonies'
44
import { Confetti } from './Confetti'
55
import { TimeAgo } from './TimeAgo'
66
import { TimeCountdown } from './TimeCountdown'

resources/js/plugins/datepicker.js

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
export default () => ({
2+
datePickerOpen: false,
3+
datePickerValue: '',
4+
datePickerRealValue: '',
5+
datePickerFormat: 'd M, Y',
6+
datePickerMonth: '',
7+
datePickerYear: '',
8+
datePickerDay: '',
9+
datePickerDaysInMonth: [],
10+
datePickerBlankDaysInMonth: [],
11+
datePickerMonthNames: ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Aout', 'Septembre', 'Octobre', 'Novembre', 'Décembre'],
12+
datePickerDays: ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'],
13+
14+
datePickerDayClicked(day) {
15+
let selectedDate = new Date(Date.UTC(this.datePickerYear, this.datePickerMonth, day))
16+
this.datePickerDay = day
17+
this.datePickerValue = this.datePickerFormatDate(selectedDate, this.datePickerFormat)
18+
this.datePickerRealValue = selectedDate
19+
this.datePickerIsSelectedDate(day)
20+
this.datePickerOpen = false
21+
},
22+
23+
datePickerPreviousMonth() {
24+
if (this.datePickerMonth === 0) {
25+
this.datePickerYear--
26+
this.datePickerMonth = 12
27+
}
28+
this.datePickerMonth--
29+
this.datePickerCalculateDays()
30+
},
31+
32+
datePickerNextMonth() {
33+
if (this.datePickerMonth === 11) {
34+
this.datePickerMonth = 0
35+
this.datePickerYear++
36+
} else {
37+
this.datePickerMonth++
38+
}
39+
this.datePickerCalculateDays()
40+
},
41+
42+
datePickerIsSelectedDate(day) {
43+
const d = new Date(Date.UTC(this.datePickerYear, this.datePickerMonth, day))
44+
return this.datePickerValue === this.datePickerFormatDate(d, this.datePickerFormat)
45+
},
46+
47+
datePickerIsToday(day) {
48+
const today = new Date()
49+
const d = new Date(Date.UTC(this.datePickerYear, this.datePickerMonth, day))
50+
return today.toDateString() === d.toDateString()
51+
},
52+
53+
datePickerCalculateDays() {
54+
let daysInMonth = new Date(Date.UTC(this.datePickerYear, this.datePickerMonth + 1, 0)).getUTCDate();
55+
// find where to start calendar day of week
56+
let dayOfWeek = new Date(Date.UTC(this.datePickerYear, this.datePickerMonth)).getUTCDay();
57+
let blankDaysArray = [];
58+
for (let i = 1; i <= dayOfWeek; i++) {
59+
blankDaysArray.push(i);
60+
}
61+
let daysArray = [];
62+
for (let i = 1; i <= daysInMonth; i++) {
63+
daysArray.push(i);
64+
}
65+
this.datePickerBlankDaysInMonth = blankDaysArray;
66+
this.datePickerDaysInMonth = daysArray;
67+
},
68+
69+
datePickerFormatDate(date, format = null) {
70+
let formattedDay = this.datePickerDays[date.getUTCDay()];
71+
let formattedDate = ('0' + date.getUTCDate()).slice(-2); // appends 0 (zero) in single digit date
72+
let formattedMonth = this.datePickerMonthNames[date.getUTCMonth()];
73+
let formattedMonthShortName = this.datePickerMonthNames[date.getUTCMonth()].substring(0, 3);
74+
let formattedMonthInNumber = ('0' + (parseInt(date.getUTCMonth()) + 1)).slice(-2);
75+
let formattedYear = date.getUTCFullYear();
76+
77+
if (format && format === 'd M, Y') {
78+
return `${formattedDate} ${formattedMonthShortName}, ${formattedYear}`
79+
}
80+
81+
if (format && format === 'MM-DD-YYYY') {
82+
return `${formattedMonthInNumber}-${formattedDate}-${formattedYear}`
83+
}
84+
85+
if (format && format === 'DD-MM-YYYY') {
86+
return `${formattedDate}-${formattedMonthInNumber}-${formattedYear}`
87+
}
88+
89+
if (format && format === 'YYYY-MM-DD') {
90+
return `${formattedYear}-${formattedMonthInNumber}-${formattedDate}`
91+
}
92+
93+
if (format && format === 'D d M, Y') {
94+
return `${formattedDay} ${formattedDate} ${formattedMonthShortName} ${formattedYear}`
95+
}
96+
97+
return `${formattedMonth} ${formattedDate}, ${formattedYear}`
98+
},
99+
100+
init() {
101+
let currentDate = new Date()
102+
103+
if (this.datePickerValue) {
104+
currentDate = new Date(Date.parse(this.datePickerValue))
105+
}
106+
107+
this.datePickerMonth = currentDate.getUTCMonth()
108+
this.datePickerYear = currentDate.getUTCFullYear()
109+
this.datePickerDay = currentDate.getUTCDay()
110+
this.datePickerValue = this.datePickerFormatDate(currentDate, this.datePickerFormat)
111+
this.datePickerCalculateDays()
112+
113+
this.$watch('datePickerValue', () => {
114+
this.datePickerRealValue = new Date(Date.UTC(this.datePickerYear, this.datePickerMonth, this.datePickerDay))
115+
})
116+
}
117+
})
Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import intlTelInput from 'intl-tel-input';
1+
import intlTelInput from 'intl-tel-input'
22

33
export default (element) => ({
44
input: element, // '#myID' selector css
@@ -9,18 +9,18 @@ export default (element) => ({
99
nationalMode: true,
1010
geoIpLookup: function(success, failure) {
1111
fetch('https://ipinfo.io').then(response => {
12-
let countryCode = (response && response.country) ? response.country : 'CM';
13-
success(countryCode);
12+
let countryCode = (response && response.country) ? response.country : 'CM'
13+
success(countryCode)
1414
})
1515
},
1616
utilsScript: 'https://unpkg.com/intl-tel-input@17.0.3/build/js/utils.js'
17-
});
17+
})
1818
let handleChange = () => {
1919
if (iti.isValidNumber()) {
20-
phoneNumber.value = iti.getNumber();
20+
phoneNumber.value = iti.getNumber()
2121
}
22-
};
23-
phoneNumber.addEventListener('change', handleChange);
24-
phoneNumber.addEventListener('keyup', handleChange);
22+
}
23+
phoneNumber.addEventListener('change', handleChange)
24+
phoneNumber.addEventListener('keyup', handleChange)
2525
}
2626
})

0 commit comments

Comments
 (0)