mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 20:34:37 +03:00
Remove timezone from package date format (#4313)
* Use UTC date for manifest * Use intl to format package dates
This commit is contained in:
@@ -8,8 +8,16 @@ import (
|
|||||||
"github.com/stashapp/stash/pkg/sliceutil"
|
"github.com/stashapp/stash/pkg/sliceutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
const timeFormat = "2006-01-02 15:04:05 -0700"
|
const (
|
||||||
|
// TimeFormat is the format used for marshalling/unmarshalling time.Time.
|
||||||
|
// Times are stored in UTC.
|
||||||
|
TimeFormat = "2006-01-02 15:04:05"
|
||||||
|
|
||||||
|
// timeFormatLegacy is the old format that may exist in some manifests.
|
||||||
|
timeFormatLegacy = "2006-01-02 15:04:05 -0700"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Time is a wrapper around time.Time that allows for custom YAML marshalling/unmarshalling using TimeFormat.
|
||||||
type Time struct {
|
type Time struct {
|
||||||
time.Time
|
time.Time
|
||||||
}
|
}
|
||||||
@@ -19,16 +27,25 @@ func (t *Time) UnmarshalYAML(unmarshal func(interface{}) error) error {
|
|||||||
if err := unmarshal(&s); err != nil {
|
if err := unmarshal(&s); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
parsed, err := time.Parse(timeFormat, s)
|
|
||||||
|
// times are stored in UTC
|
||||||
|
parsed, err := time.Parse(TimeFormat, s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
// try to parse using the legacy format
|
||||||
|
var legacyErr error
|
||||||
|
parsed, legacyErr = time.Parse(timeFormatLegacy, s)
|
||||||
|
|
||||||
|
if legacyErr != nil {
|
||||||
|
// if we can't parse using the legacy format, return the original error
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
t.Time = parsed
|
t.Time = parsed
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t Time) MarshalYAML() (interface{}, error) {
|
func (t Time) MarshalYAML() (interface{}, error) {
|
||||||
return t.Format(timeFormat), nil
|
return t.Format(TimeFormat), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type PackageMetadata map[string]interface{}
|
type PackageMetadata map[string]interface{}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Button, Form, Table } from "react-bootstrap";
|
import { Button, Form, Table } from "react-bootstrap";
|
||||||
import React, { useState, useMemo, useEffect } from "react";
|
import React, { useState, useMemo, useEffect } from "react";
|
||||||
import { FormattedMessage, useIntl } from "react-intl";
|
import { FormattedMessage, IntlShape, useIntl } from "react-intl";
|
||||||
import * as GQL from "src/core/generated-graphql";
|
import * as GQL from "src/core/generated-graphql";
|
||||||
import { Icon } from "../Icon";
|
import { Icon } from "../Icon";
|
||||||
import {
|
import {
|
||||||
@@ -17,10 +17,19 @@ import { LoadingIndicator } from "../LoadingIndicator";
|
|||||||
import { ApolloError } from "@apollo/client";
|
import { ApolloError } from "@apollo/client";
|
||||||
import { ClearableInput } from "../ClearableInput";
|
import { ClearableInput } from "../ClearableInput";
|
||||||
|
|
||||||
function formatDate(date: string | undefined | null) {
|
function formatDate(intl: IntlShape, date: string | undefined | null) {
|
||||||
if (!date) return;
|
if (!date) return;
|
||||||
|
|
||||||
return new Date(date).toISOString();
|
const d = new Date(date);
|
||||||
|
|
||||||
|
return `${intl.formatDate(d, {
|
||||||
|
timeZone: "utc",
|
||||||
|
})} ${intl.formatTime(d, {
|
||||||
|
timeZone: "utc",
|
||||||
|
hour: "numeric",
|
||||||
|
minute: "numeric",
|
||||||
|
second: "numeric",
|
||||||
|
})}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface IPackage {
|
interface IPackage {
|
||||||
@@ -48,6 +57,8 @@ const InstalledPackageRow: React.FC<{
|
|||||||
togglePackage: () => void;
|
togglePackage: () => void;
|
||||||
updatesLoaded: boolean;
|
updatesLoaded: boolean;
|
||||||
}> = ({ loading, pkg, selected, togglePackage, updatesLoaded }) => {
|
}> = ({ loading, pkg, selected, togglePackage, updatesLoaded }) => {
|
||||||
|
const intl = useIntl();
|
||||||
|
|
||||||
function rowClassname() {
|
function rowClassname() {
|
||||||
if (pkg.upgrade?.version) {
|
if (pkg.upgrade?.version) {
|
||||||
return "package-update-available";
|
return "package-update-available";
|
||||||
@@ -69,12 +80,14 @@ const InstalledPackageRow: React.FC<{
|
|||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<span className="package-version">{pkg.version}</span>
|
<span className="package-version">{pkg.version}</span>
|
||||||
<span className="package-date">{formatDate(pkg.date)}</span>
|
<span className="package-date">{formatDate(intl, pkg.date)}</span>
|
||||||
</td>
|
</td>
|
||||||
{updatesLoaded ? (
|
{updatesLoaded ? (
|
||||||
<td>
|
<td>
|
||||||
<span className="package-version">{pkg.upgrade?.version}</span>
|
<span className="package-version">{pkg.upgrade?.version}</span>
|
||||||
<span className="package-date">{formatDate(pkg.upgrade?.date)}</span>
|
<span className="package-date">
|
||||||
|
{formatDate(intl, pkg.upgrade?.date)}
|
||||||
|
</span>
|
||||||
</td>
|
</td>
|
||||||
) : undefined}
|
) : undefined}
|
||||||
</tr>
|
</tr>
|
||||||
@@ -523,6 +536,8 @@ const AvailablePackageRow: React.FC<{
|
|||||||
togglePackage,
|
togglePackage,
|
||||||
renderDescription = () => undefined,
|
renderDescription = () => undefined,
|
||||||
}) => {
|
}) => {
|
||||||
|
const intl = useIntl();
|
||||||
|
|
||||||
function renderRequiredBy() {
|
function renderRequiredBy() {
|
||||||
if (!requiredBy.length) return;
|
if (!requiredBy.length) return;
|
||||||
|
|
||||||
@@ -551,7 +566,7 @@ const AvailablePackageRow: React.FC<{
|
|||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<span className="package-version">{pkg.version}</span>
|
<span className="package-version">{pkg.version}</span>
|
||||||
<span className="package-date">{formatDate(pkg.date)}</span>
|
<span className="package-date">{formatDate(intl, pkg.date)}</span>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{renderRequiredBy()}
|
{renderRequiredBy()}
|
||||||
|
|||||||
Reference in New Issue
Block a user