Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions app/global/functions.cfm
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,37 @@
public function GetSignedInUserId(){
return structKeyExists(session, "userID") ? session.userID : 0
}

/**
* Convert a local datetime to UTC using server's timezone offset
* @localTime The datetime to convert to UTC
* @return The datetime in UTC
*/
public datetime function toUTC(required datetime localTime) {
var tzInfo = GetTimeZoneInfo();
var offsetSeconds = tzInfo.utcTotalOffset * 60;
return dateAdd("s", -offsetSeconds, arguments.localTime);
}

/**
* Safely convert a datetime string from a specific timezone to UTC
* @dateTimeStr The datetime string to convert (expected to be ISO format from JavaScript)
* @timeZone The timezone identifier (e.g., "America/New_York") - kept for compatibility but not used since JS sends UTC
* @return The datetime in UTC
*/
public datetime function toSafeUTC(required string dateTimeStr, string timeZone="") {
try {
// Since JavaScript sends ISO string (already in UTC), just parse it
if (len(trim(arguments.dateTimeStr))) {
return parseDateTime(arguments.dateTimeStr);
} else {
return toUTC(now());
}
} catch (any e) {
// Fallback: return current UTC time
return toUTC(now());
}
}
public function GetUserRoleId(){
return 3;
}
Expand Down
25 changes: 20 additions & 5 deletions app/views/layout.cfm
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,15 @@

<!--- Set og:image for key public pages --->
<cfif isHome>
<cfset ogImage = getBaseUrl() & "/images/home-og.png">
<cfset ogImage = getBaseUrl() & "/img/home-og.png">
<cfelseif isCommunity>
<cfset ogImage = getBaseUrl() & "/images/community-og.png">
<cfset ogImage = getBaseUrl() & "/img/community-og.png">
<cfelseif isGuideDocs>
<cfset ogImage = getBaseUrl() & "/images/guides-og.png">
<cfset ogImage = getBaseUrl() & "/img/guides-og.png">
<cfelseif isDocs>
<cfset ogImage = getBaseUrl() & "/images/docs-og.png">
<cfset ogImage = getBaseUrl() & "/img/docs-og.png">
<cfelseif isApi>
<cfset ogImage = getBaseUrl() & "/images/api-og.png">
<cfset ogImage = getBaseUrl() & "/img/api-og.png">
</cfif>

<cfset pageTitle = "Wheels - An open source CFML framework inspired by Ruby on Rails">
Expand Down Expand Up @@ -808,6 +808,21 @@
<script src="/js/swiper.js"></script>
<script src="/js/infinite-scroll.pkgd.min.js"></script>
<script src="/js/global.js"></script>
<script>
// Convert UTC dates to local timezone for elements with data-utc attribute
document.addEventListener("DOMContentLoaded", function() {
var utcElements = document.querySelectorAll('[data-utc]');
utcElements.forEach(function(el) {
var utcDate = el.getAttribute('data-utc');
if (utcDate) {
var date = new Date(utcDate);
if (!isNaN(date.getTime())) {
el.textContent = date.toLocaleString();
}
}
});
});
</script>
</body>
</html>
</cfif>
50 changes: 48 additions & 2 deletions app/views/web/BlogController/create.cfm
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@
<label class="form-label mb-1 fs-14 fw-medium">
Publish Date
</label>
<input class="form-control fs-14" type="datetime-local" name="postCreatedDate" id="postCreatedDate" value="<cfif isEdit>#dateFormat(blog.postCreatedDate, 'yyyy-mm-dd')#T#timeFormat(blog.postCreatedDate, 'HH:mm')#</cfif>">
<input class="form-control fs-14" type="datetime-local" name="postCreatedDate" id="postCreatedDate" value="<cfif isEdit>#dateFormat(blog.postCreatedDate, 'yyyy-mm-dd')#T#timeFormat(blog.postCreatedDate, 'HH:mm')#</cfif>" data-utc-value="<cfif isEdit>#dateFormat(blog.postCreatedDate, 'yyyy-mm-dd')#T#timeFormat(blog.postCreatedDate, 'HH:mm:ss')#</cfif>">
<small class="text-muted mt-1 d-block fs-13">Leave empty to use the current date and time</small>
</div>

Expand Down Expand Up @@ -108,4 +108,50 @@
</div>
</cfoutput>
<script src="/js/createBlog.js"></script>
</main>
<script>
// Convert UTC datetime from server to local time for display in datetime-local input
document.addEventListener("DOMContentLoaded", function() {
var postCreatedDateInput = document.getElementById('postCreatedDate');
if (postCreatedDateInput) {
var utcValue = postCreatedDateInput.getAttribute('data-utc-value');
if (utcValue) {
// Parse the UTC value from server and convert to local time
var utcDate = new Date(utcValue + 'Z');
if (!isNaN(utcDate.getTime())) {
// Convert to local datetime-local format (YYYY-MM-DDTHH:mm)
var localDate = new Date(utcDate.getTime() - (utcDate.getTimezoneOffset() * 60000));
postCreatedDateInput.value = localDate.toISOString().slice(0, 16);
}
}
}
// Set user's timezone in a hidden field for server-side use
var tzField = document.getElementById('userTimezone');
if (!tzField) {
tzField = document.createElement('input');
tzField.type = 'hidden';
tzField.name = 'userTimezone';
tzField.id = 'userTimezone';
document.getElementById('blogForm').appendChild(tzField);
}
tzField.value = Intl.DateTimeFormat().resolvedOptions().timeZone;
});

// Convert local datetime to UTC before form submission via HTMX
document.addEventListener("htmx:configRequest", function(event) {
var postCreatedDateInput = document.getElementById('postCreatedDate');
if (postCreatedDateInput && postCreatedDateInput.value) {
// Parse the local datetime and convert to UTC
var localDate = new Date(postCreatedDateInput.value);
if (!isNaN(localDate.getTime())) {
// Convert to ISO string (which is in UTC) and update the form parameter
event.detail.parameters.postCreatedDate = localDate.toISOString();
}
}
// Always send user's timezone
var tzField = document.getElementById('userTimezone');
if (tzField) {
event.detail.parameters.userTimezone = tzField.value;
}
});
</script>
</main>
Loading