Skip to content
Merged
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
11 changes: 8 additions & 3 deletions apps/files_versions/src/components/VersionEntry.vue
Original file line number Diff line number Diff line change
Expand Up @@ -139,8 +139,7 @@ import type { Version } from '../utils/versions.ts'
import { getCurrentUser } from '@nextcloud/auth'
import { formatFileSize, Permission } from '@nextcloud/files'
import { loadState } from '@nextcloud/initial-state'
import { t } from '@nextcloud/l10n'
import moment from '@nextcloud/moment'
import { getCanonicalLocale, t } from '@nextcloud/l10n'
import { getRootUrl } from '@nextcloud/router'
import { computed, nextTick, ref } from 'vue'
import NcActionButton from '@nextcloud/vue/components/NcActionButton'
Expand Down Expand Up @@ -233,7 +232,13 @@ const versionAuthor = computed(() => {
})

const versionHumanExplicitDate = computed(() => {
return moment(props.version.mtime).format('LLLL')
return new Date(props.version.mtime).toLocaleString(
[getCanonicalLocale(), getCanonicalLocale().split('-')[0]!],
{
timeStyle: 'long',
dateStyle: 'long',
},
)
})

const downloadURL = computed(() => {
Expand Down
12 changes: 9 additions & 3 deletions apps/files_versions/src/utils/versions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import type { FileStat, ResponseDataDetailed } from 'webdav'
import { getCurrentUser } from '@nextcloud/auth'
import axios from '@nextcloud/axios'
import { getClient } from '@nextcloud/files/dav'
import moment from '@nextcloud/moment'
import { getCanonicalLocale } from '@nextcloud/l10n'
import { encodePath, join } from '@nextcloud/paths'
import { generateRemoteUrl, generateUrl } from '@nextcloud/router'
import davRequest from '../utils/davRequest.ts'
Expand Down Expand Up @@ -97,7 +97,7 @@ export async function restoreVersion(version: Version) {
* @param node - The original node
*/
function formatVersion(version: Required<FileStat>, node: INode): Version {
const mtime = moment(version.lastmod).unix() * 1000
const mtime = Date.parse(version.lastmod)
let previewUrl = ''

if (mtime === node.mtime?.getTime()) { // Version is the current one
Expand All @@ -119,7 +119,13 @@ function formatVersion(version: Required<FileStat>, node: INode): Version {
author: version.props['version-author'] ? String(version.props['version-author']) : null,
authorName: null,
filename: version.filename,
basename: moment(mtime).format('LLL'),
basename: new Date(mtime).toLocaleString(
[getCanonicalLocale(), getCanonicalLocale().split('-')[0]!],
{
timeStyle: 'long',
dateStyle: 'medium',
},
),
mime: version.mime,
etag: `${version.props.getetag}`,
size: version.size,
Expand Down
38 changes: 25 additions & 13 deletions apps/user_status/src/services/clearAtService.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

import { t } from '@nextcloud/l10n'
import moment from '@nextcloud/moment'
import { formatRelativeTime, t } from '@nextcloud/l10n'
import { dateFactory } from './dateService.js'

/**
Expand All @@ -13,7 +12,7 @@ import { dateFactory } from './dateService.js'
* @param {object | null} clearAt The clear-at config
* @return {number | null}
*/
function getTimestampForClearAt(clearAt) {
export function getTimestampForClearAt(clearAt) {
if (clearAt === null) {
return null
}
Expand All @@ -27,8 +26,9 @@ function getTimestampForClearAt(clearAt) {
if (clearAt.type === 'end-of') {
switch (clearAt.time) {
case 'day':
return Math.floor(getEndOfDay(date).getTime() / 1000)
case 'week':
return Number(moment(date).endOf(clearAt.time).format('X'))
return Math.floor(getEndOfWeek(date).getTime() / 1000)
}
}
// This is not an officially supported type
Expand All @@ -47,7 +47,7 @@ function getTimestampForClearAt(clearAt) {
* @param {object} clearAt The clearAt object
* @return {string|null}
*/
function clearAtFormat(clearAt) {
export function clearAtFormat(clearAt) {
if (clearAt === null) {
return t('user_status', 'Don\'t clear')
}
Expand All @@ -65,23 +65,35 @@ function clearAtFormat(clearAt) {
}

if (clearAt.type === 'period') {
return moment.duration(clearAt.time * 1000).humanize()
return formatRelativeTime(Date.now() + clearAt.time * 1000)
}

// This is not an officially supported type
// but only used internally to show the remaining time
// in the Set Status Modal
if (clearAt.type === '_time') {
const momentNow = moment(dateFactory())
const momentClearAt = moment(clearAt.time, 'X')

return moment.duration(momentNow.diff(momentClearAt)).humanize()
return formatRelativeTime(clearAt.time * 1000)
}

return null
}

export {
clearAtFormat,
getTimestampForClearAt,
/**
* @param {Date} date - The date to calculate the end of the day for
*/
function getEndOfDay(date) {
const endOfDay = new Date(date)
endOfDay.setHours(23, 59, 59, 999)
return endOfDay
}

/**
* Calculates the end of the week for a given date
*
* @param {Date} date - The date to calculate the end of the week for
*/
function getEndOfWeek(date) {
const endOfWeek = getEndOfDay(date)
endOfWeek.setDate(date.getDate() + ((endOfWeek.getFirstDay() - 1 - endOfWeek.getDay() + 7) % 7))
return endOfWeek
}
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
import{b as g,p as y,q as v,c as p,u as o,o as n,N as h,w as _,g as V,t as k,r as x,s as M,j as d,e as f,F as q,C as w,E as U,G as j}from"./runtime-dom.esm-bundler-BrYCUcZF.chunk.mjs";import{c as C}from"./index-FffHbzvj.chunk.mjs";import{a as E}from"./index-JpgrUA2Z-BU0x-nEh.chunk.mjs";import{t as s}from"./translation-DoG5ZELJ-Cr5LJw9O.chunk.mjs";import{g as N}from"./createElementId-DhjFt1I9-CmaX6aVQ.chunk.mjs";import{c as S}from"./NcNoteCard-CVhtNL04-DvQ-q8jC.chunk.mjs";import{N as A}from"./NcSelect-Czzsi3P_-DYeov0Mn.chunk.mjs";import{N as K}from"./NcCheckboxRadioSwitch-BCSKF7Tk-BfYgMYeK.chunk.mjs";import{N as z}from"./NcPasswordField-djttkA5Q-PPKLVftl.chunk.mjs";import{_ as B}from"./TrashCanOutline-Dy-u-_ok.chunk.mjs";import{a as c,C as b}from"./types-enGIHWiM.chunk.mjs";import{l as G}from"./logger-CrDakPzW.chunk.mjs";const P=g({__name:"ConfigurationEntry",props:y({configKey:{},configOption:{}},{modelValue:{type:[String,Boolean],default:""},modelModifiers:{}}),emits:["update:modelValue"],setup(e){const a=v(e,"modelValue");return(t,i)=>e.configOption.type!==o(c).Boolean?(n(),p(h(e.configOption.type===o(c).Password?o(z):o(B)),{key:0,modelValue:a.value,"onUpdate:modelValue":i[0]||(i[0]=l=>a.value=l),name:e.configKey,required:!(e.configOption.flags&o(b).Optional),label:e.configOption.value,title:e.configOption.tooltip},null,8,["modelValue","name","required","label","title"])):(n(),p(o(K),{key:1,modelValue:a.value,"onUpdate:modelValue":i[1]||(i[1]=l=>a.value=l),type:"switch",title:e.configOption.tooltip},{default:_(()=>[V(k(e.configOption.value),1)]),_:1},8,["modelValue","title"]))}}),R=g({__name:"AuthMechanismRsa",props:y({authMechanism:{}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(e){const a=v(e,"modelValue"),t=x();M(t,()=>{t.value&&(a.value.private_key="",a.value.public_key="")});async function i(){try{const{data:l}=await C.post(N("/apps/files_external/ajax/public_key.php"),{keyLength:t.value});a.value.private_key=l.data.private_key,a.value.public_key=l.data.public_key}catch(l){G.error("Error generating RSA key pair",{error:l}),E(s("files_external","Error generating key pair"))}}return(l,m)=>(n(),d("div",null,[(n(!0),d(q,null,w(e.authMechanism.configuration,(r,u)=>U((n(),p(P,{key:r.value,modelValue:a.value[u],"onUpdate:modelValue":O=>a.value[u]=O,"config-key":u,"config-option":r},null,8,["modelValue","onUpdate:modelValue","config-key","config-option"])),[[j,!(r.flags&o(b).Hidden)]])),128)),f(o(A),{modelValue:t.value,"onUpdate:modelValue":m[0]||(m[0]=r=>t.value=r),clearable:!1,"input-label":o(s)("files_external","Key size"),options:[1024,2048,4096],required:""},null,8,["modelValue","input-label"]),f(o(S),{disabled:!t.value,wide:"",onClick:i},{default:_(()=>[V(k(o(s)("files_external","Generate keys")),1)]),_:1},8,["disabled"])]))}}),$=Object.freeze(Object.defineProperty({__proto__:null,default:R},Symbol.toStringTag,{value:"Module"}));export{$ as A,P as _};
//# sourceMappingURL=AuthMechanismRsa-C7Dhz5x5.chunk.mjs.map
import{b as g,p as y,q as v,c as p,u as o,o as n,N as h,w as _,g as V,t as k,r as x,s as M,j as d,e as f,F as q,C as w,E as U,G as j}from"./runtime-dom.esm-bundler-BrYCUcZF.chunk.mjs";import{c as C}from"./index-BfylblLb.chunk.mjs";import{a as E}from"./index-JpgrUA2Z-BFiKKJ1W.chunk.mjs";import{t as s}from"./translation-DoG5ZELJ-gw0g4US-.chunk.mjs";import{g as N}from"./createElementId-DhjFt1I9--Zqj3wLs.chunk.mjs";import{c as S}from"./NcNoteCard-CVhtNL04-hwuc093N.chunk.mjs";import{N as A}from"./NcSelect-Czzsi3P_-DLFUGW7z.chunk.mjs";import{N as K}from"./NcCheckboxRadioSwitch-BCSKF7Tk-yPckcGKs.chunk.mjs";import{N as z}from"./NcPasswordField-djttkA5Q-2g87vOpY.chunk.mjs";import{_ as B}from"./TrashCanOutline-CvWRJ8GE.chunk.mjs";import{a as c,C as b}from"./types-BoPN4zt3.chunk.mjs";import{l as G}from"./logger-CrDakPzW.chunk.mjs";const P=g({__name:"ConfigurationEntry",props:y({configKey:{},configOption:{}},{modelValue:{type:[String,Boolean],default:""},modelModifiers:{}}),emits:["update:modelValue"],setup(e){const a=v(e,"modelValue");return(t,i)=>e.configOption.type!==o(c).Boolean?(n(),p(h(e.configOption.type===o(c).Password?o(z):o(B)),{key:0,modelValue:a.value,"onUpdate:modelValue":i[0]||(i[0]=l=>a.value=l),name:e.configKey,required:!(e.configOption.flags&o(b).Optional),label:e.configOption.value,title:e.configOption.tooltip},null,8,["modelValue","name","required","label","title"])):(n(),p(o(K),{key:1,modelValue:a.value,"onUpdate:modelValue":i[1]||(i[1]=l=>a.value=l),type:"switch",title:e.configOption.tooltip},{default:_(()=>[V(k(e.configOption.value),1)]),_:1},8,["modelValue","title"]))}}),R=g({__name:"AuthMechanismRsa",props:y({authMechanism:{}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(e){const a=v(e,"modelValue"),t=x();M(t,()=>{t.value&&(a.value.private_key="",a.value.public_key="")});async function i(){try{const{data:l}=await C.post(N("/apps/files_external/ajax/public_key.php"),{keyLength:t.value});a.value.private_key=l.data.private_key,a.value.public_key=l.data.public_key}catch(l){G.error("Error generating RSA key pair",{error:l}),E(s("files_external","Error generating key pair"))}}return(l,m)=>(n(),d("div",null,[(n(!0),d(q,null,w(e.authMechanism.configuration,(r,u)=>U((n(),p(P,{key:r.value,modelValue:a.value[u],"onUpdate:modelValue":O=>a.value[u]=O,"config-key":u,"config-option":r},null,8,["modelValue","onUpdate:modelValue","config-key","config-option"])),[[j,!(r.flags&o(b).Hidden)]])),128)),f(o(A),{modelValue:t.value,"onUpdate:modelValue":m[0]||(m[0]=r=>t.value=r),clearable:!1,"input-label":o(s)("files_external","Key size"),options:[1024,2048,4096],required:""},null,8,["modelValue","input-label"]),f(o(S),{disabled:!t.value,wide:"",onClick:i},{default:_(()=>[V(k(o(s)("files_external","Generate keys")),1)]),_:1},8,["disabled"])]))}}),$=Object.freeze(Object.defineProperty({__proto__:null,default:R},Symbol.toStringTag,{value:"Module"}));export{$ as A,P as _};
//# sourceMappingURL=AuthMechanismRsa-e40gyg0q.chunk.mjs.map
Loading
Loading