diff --git a/api/package.json b/api/package.json index 69a386107..cce4aa69d 100644 --- a/api/package.json +++ b/api/package.json @@ -26,6 +26,7 @@ "test": "vitest --run" }, "dependencies": { + "@xwiki/cristal-authentication-api": "workspace:*", "inversify": "6.2.0", "vue": "3.5.13", "vue-router": "4.5.0" diff --git a/api/src/api/PageData.ts b/api/src/api/PageData.ts index eadda1362..49cb232a0 100644 --- a/api/src/api/PageData.ts +++ b/api/src/api/PageData.ts @@ -19,6 +19,7 @@ */ import type { Document } from "./document"; +import type { UserDetails } from "@xwiki/cristal-authentication-api"; export interface PageData { id: string; @@ -41,7 +42,7 @@ export interface PageData { * Name of the last user to edit this page. * @since 0.13 */ - lastAuthor: string | undefined; + lastAuthor: UserDetails | undefined; // TODO: remove any toObject(): any; // eslint-disable-line diff --git a/api/src/components/DefaultPageData.ts b/api/src/components/DefaultPageData.ts index 9c1966a4b..3f88319a4 100644 --- a/api/src/components/DefaultPageData.ts +++ b/api/src/components/DefaultPageData.ts @@ -21,6 +21,7 @@ import { JSONLDDocument } from "./JSONLDDocument"; import type { PageData } from "../api/PageData"; import type { Document } from "../api/document"; +import type { UserDetails } from "@xwiki/cristal-authentication-api"; export class DefaultPageData implements PageData { id: string; @@ -36,7 +37,7 @@ export class DefaultPageData implements PageData { headline: string = ""; headlineRaw: string = ""; lastModificationDate: Date | undefined; - lastAuthor: string | undefined; + lastAuthor: UserDetails | undefined; public constructor( id: string = "", diff --git a/core/authentication/authentication-api/package.json b/core/authentication/authentication-api/package.json index 08120cbca..e81abc42d 100644 --- a/core/authentication/authentication-api/package.json +++ b/core/authentication/authentication-api/package.json @@ -22,10 +22,6 @@ "clean": "rimraf dist", "lint": "eslint \"./src/**/*.{ts,tsx,vue}\" --max-warnings=0" }, - "dependencies": { - "@xwiki/cristal-api": "workspace:*", - "inversify": "6.2.0" - }, "peerDependencies": { "reflect-metadata": "0.2.2" }, diff --git a/core/authentication/authentication-api/src/index.ts b/core/authentication/authentication-api/src/index.ts index 5bfb547bd..7bb4f029d 100644 --- a/core/authentication/authentication-api/src/index.ts +++ b/core/authentication/authentication-api/src/index.ts @@ -18,24 +18,8 @@ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ -import { DefaultAuthenticationManagerProvider } from "./defaultAuthenticationManagerProvider"; -import { Container } from "inversify"; import type { AuthenticationManager } from "./authenticationManager"; import type { AuthenticationManagerProvider } from "./authenticationManagerProvider"; import type { UserDetails } from "./userDetails"; -class ComponentInit { - constructor(container: Container) { - container - .bind("AuthenticationManagerProvider") - .to(DefaultAuthenticationManagerProvider) - .inSingletonScope(); - } -} - -export { - AuthenticationManager, - AuthenticationManagerProvider, - ComponentInit, - UserDetails, -}; +export { AuthenticationManager, AuthenticationManagerProvider, UserDetails }; diff --git a/core/authentication/authentication-default/package.json b/core/authentication/authentication-default/package.json new file mode 100644 index 000000000..5efceed3d --- /dev/null +++ b/core/authentication/authentication-default/package.json @@ -0,0 +1,49 @@ +{ + "name": "@xwiki/cristal-authentication-default", + "version": "0.12.0", + "license": "LGPL 2.1", + "author": "XWiki Org Community ", + "homepage": "https://cristal.xwiki.org/", + "repository": { + "type": "git", + "directory": "/core/authentication/authentication-default", + "url": "https://github.com/xwiki-contrib/cristal/" + }, + "bugs": { + "url": "https://jira.xwiki.org/projects/CRISTAL/" + }, + "type": "module", + "exports": { + ".": "./src/index.ts" + }, + "main": "./src/index.ts", + "scripts": { + "build": "tsc --project tsconfig.json && vite build", + "clean": "rimraf dist", + "lint": "eslint \"./src/**/*.{ts,tsx,vue}\" --max-warnings=0" + }, + "dependencies": { + "@xwiki/cristal-api": "workspace:*", + "@xwiki/cristal-authentication-api": "workspace:*", + "inversify": "6.2.0" + }, + "peerDependencies": { + "reflect-metadata": "0.2.2" + }, + "devDependencies": { + "reflect-metadata": "0.2.2", + "typescript": "5.6.3", + "vite": "6.0.3" + }, + "publishConfig": { + "exports": { + ".": { + "import": "./dist/index.es.js", + "require": "./dist/index.umd.js", + "types": "./dist/index.d.ts" + } + }, + "main": "./dist/index.es.js", + "types": "./dist/index.d.ts" + } +} diff --git a/core/authentication/authentication-api/src/defaultAuthenticationManagerProvider.ts b/core/authentication/authentication-default/src/defaultAuthenticationManagerProvider.ts similarity index 92% rename from core/authentication/authentication-api/src/defaultAuthenticationManagerProvider.ts rename to core/authentication/authentication-default/src/defaultAuthenticationManagerProvider.ts index e17724266..e7cd9a617 100644 --- a/core/authentication/authentication-api/src/defaultAuthenticationManagerProvider.ts +++ b/core/authentication/authentication-default/src/defaultAuthenticationManagerProvider.ts @@ -18,8 +18,10 @@ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ -import { AuthenticationManager } from "./authenticationManager"; -import { AuthenticationManagerProvider } from "./authenticationManagerProvider"; +import { + AuthenticationManager, + AuthenticationManagerProvider, +} from "@xwiki/cristal-authentication-api"; import { inject, injectable } from "inversify"; import type { CristalApp } from "@xwiki/cristal-api"; diff --git a/core/authentication/authentication-default/src/index.ts b/core/authentication/authentication-default/src/index.ts new file mode 100644 index 000000000..63d9b3ef4 --- /dev/null +++ b/core/authentication/authentication-default/src/index.ts @@ -0,0 +1,32 @@ +/* + * See the LICENSE file distributed with this work for additional + * information regarding copyright ownership. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this software; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. + */ + +import { DefaultAuthenticationManagerProvider } from "./defaultAuthenticationManagerProvider"; +import { Container } from "inversify"; +import type { AuthenticationManagerProvider } from "@xwiki/cristal-authentication-api"; + +export class ComponentInit { + constructor(container: Container) { + container + .bind("AuthenticationManagerProvider") + .to(DefaultAuthenticationManagerProvider) + .inSingletonScope(); + } +} diff --git a/core/authentication/authentication-default/tsconfig.json b/core/authentication/authentication-default/tsconfig.json new file mode 100644 index 000000000..9ea278a11 --- /dev/null +++ b/core/authentication/authentication-default/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "rootDir": "src", + "outDir": "dist", + "resolveJsonModule": true + }, + "extends": "../../../tsconfig.json", + "include": [ + "./src/index.ts", + "./src/**/*" + ] +} \ No newline at end of file diff --git a/core/authentication/authentication-default/tsdoc.json b/core/authentication/authentication-default/tsdoc.json new file mode 100644 index 000000000..81c5a8a2a --- /dev/null +++ b/core/authentication/authentication-default/tsdoc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "extends": ["../../../tsdoc.json"] +} diff --git a/core/authentication/authentication-default/vite.config.ts b/core/authentication/authentication-default/vite.config.ts new file mode 100644 index 000000000..c31aed033 --- /dev/null +++ b/core/authentication/authentication-default/vite.config.ts @@ -0,0 +1,23 @@ +/* + * See the LICENSE file distributed with this work for additional + * information regarding copyright ownership. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this software; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. + */ + +import { generateConfig } from "../../../vite.config"; + +export default generateConfig(import.meta.url); diff --git a/core/backends/backend-nextcloud/package.json b/core/backends/backend-nextcloud/package.json index ccb807eaf..6dc10d4ba 100644 --- a/core/backends/backend-nextcloud/package.json +++ b/core/backends/backend-nextcloud/package.json @@ -23,6 +23,7 @@ }, "dependencies": { "@xwiki/cristal-api": "workspace:*", + "@xwiki/cristal-authentication-api": "workspace:*", "@xwiki/cristal-backend-api": "workspace:*", "inversify": "6.2.0" }, diff --git a/core/backends/backend-nextcloud/src/nextcloudStorage.ts b/core/backends/backend-nextcloud/src/nextcloudStorage.ts index a1fdee34a..9deb4f920 100644 --- a/core/backends/backend-nextcloud/src/nextcloudStorage.ts +++ b/core/backends/backend-nextcloud/src/nextcloudStorage.ts @@ -27,6 +27,7 @@ import { import { AbstractStorage } from "@xwiki/cristal-backend-api"; import { inject, injectable } from "inversify"; import type { Logger } from "@xwiki/cristal-api"; +import type { UserDetails } from "@xwiki/cristal-authentication-api"; // TODO: To be replaced by an actual authentication with CRISTAL-267 const USERNAME = "test"; @@ -71,7 +72,7 @@ export class NextcloudStorage extends AbstractStorage { ); if (response.status >= 200 && response.status < 300) { - let lastAuthor: string | undefined; + let lastAuthor: UserDetails | undefined; let lastModificationDate: Date | undefined; const propResponse = await fetch( `${this.getWikiConfig().baseRestURL}/${USERNAME}/.cristal/${page}/page.json`, @@ -102,8 +103,10 @@ export class NextcloudStorage extends AbstractStorage { if (modifiedProp) { lastModificationDate = new Date(Date.parse(modifiedProp)); } - lastAuthor = propData.getElementsByTagName("oc:owner-display-name")[0] - ?.innerHTML; + lastAuthor = { + name: propData.getElementsByTagName("oc:owner-display-name")[0] + ?.innerHTML, + }; } const json = await response.json(); diff --git a/core/backends/backend-xwiki/src/xwikiStorage.ts b/core/backends/backend-xwiki/src/xwikiStorage.ts index b3f3b256d..c04eb4756 100644 --- a/core/backends/backend-xwiki/src/xwikiStorage.ts +++ b/core/backends/backend-xwiki/src/xwikiStorage.ts @@ -185,7 +185,7 @@ export class XWikiStorage extends AbstractStorage { pageContentData.lastModificationDate = new Date( Date.parse(json.dateModified), ); - pageContentData.lastAuthor = json.editor; + pageContentData.lastAuthor = { name: json.editor }; return pageContentData; } diff --git a/electron/storage/src/electron/main/index.ts b/electron/storage/src/electron/main/index.ts index 78337b0b7..0f6cad1b6 100644 --- a/electron/storage/src/electron/main/index.ts +++ b/electron/storage/src/electron/main/index.ts @@ -86,7 +86,7 @@ async function readPage(path: string): Promise { parse.name = basename(dirname(path)); } parse.lastModificationDate = new Date(pageStats.mtimeMs); - parse.lastAuthor = os.userInfo().username; + parse.lastAuthor = { name: os.userInfo().username }; return parse; } else { return undefined; diff --git a/lib/package.json b/lib/package.json index 4233f93eb..d89dcb1a6 100644 --- a/lib/package.json +++ b/lib/package.json @@ -32,6 +32,7 @@ "@xwiki/cristal-attachments-default": "workspace:*", "@xwiki/cristal-attachments-ui": "workspace:*", "@xwiki/cristal-authentication-api": "workspace:*", + "@xwiki/cristal-authentication-default": "workspace:*", "@xwiki/cristal-authentication-ui": "workspace:*", "@xwiki/cristal-backend-api": "workspace:*", "@xwiki/cristal-backend-dexie": "workspace:*", diff --git a/lib/src/staticBuild.ts b/lib/src/staticBuild.ts index 611c643bf..4f7ce4e98 100644 --- a/lib/src/staticBuild.ts +++ b/lib/src/staticBuild.ts @@ -21,7 +21,7 @@ import { ComponentInit as AlertsDefaultComponentInit } from "@xwiki/cristal-alerts-default"; import { ComponentInit as AttachmentsDefaultComponentInit } from "@xwiki/cristal-attachments-default"; import { ComponentInit as AttachmentsUIComponentInit } from "@xwiki/cristal-attachments-ui"; -import { ComponentInit as AuthenticationAPIComponentInit } from "@xwiki/cristal-authentication-api"; +import { ComponentInit as AuthenticationDefaultComponentInit } from "@xwiki/cristal-authentication-default"; import { ComponentInit as AuthenticationUIComponentInit } from "@xwiki/cristal-authentication-ui"; import { ComponentInit as BackendAPIComponentInit } from "@xwiki/cristal-backend-api"; import { ComponentInit as DexieBackendComponentInit } from "@xwiki/cristal-backend-dexie"; @@ -98,7 +98,7 @@ export class StaticBuild { new UIExtensionDefaultComponentInit(container); new AuthenticationUIComponentInit(container); new BackendAPIComponentInit(container); - new AuthenticationAPIComponentInit(container); + new AuthenticationDefaultComponentInit(container); new LinkSuggestComponentInit(container); new XWikiLinkSuggestComponentInit(container); new NextcloudLinkSuggestComponentInit(container); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 86c01bd26..4deadea10 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -97,6 +97,9 @@ importers: api: dependencies: + '@xwiki/cristal-authentication-api': + specifier: workspace:* + version: link:../core/authentication/authentication-api inversify: specifier: 6.2.0 version: 6.2.0(reflect-metadata@0.2.2) @@ -313,10 +316,25 @@ importers: version: 2.1.10(typescript@5.6.3) core/authentication/authentication-api: + devDependencies: + reflect-metadata: + specifier: 0.2.2 + version: 0.2.2 + typescript: + specifier: 5.6.3 + version: 5.6.3 + vite: + specifier: 6.0.3 + version: 6.0.3(@types/node@22.10.2)(tsx@4.19.2)(yaml@2.6.1) + + core/authentication/authentication-default: dependencies: '@xwiki/cristal-api': specifier: workspace:* version: link:../../../api + '@xwiki/cristal-authentication-api': + specifier: workspace:* + version: link:../authentication-api inversify: specifier: 6.2.0 version: 6.2.0(reflect-metadata@0.2.2) @@ -488,6 +506,9 @@ importers: '@xwiki/cristal-api': specifier: workspace:* version: link:../../../api + '@xwiki/cristal-authentication-api': + specifier: workspace:* + version: link:../../authentication/authentication-api '@xwiki/cristal-backend-api': specifier: workspace:* version: link:../backend-api @@ -2426,6 +2447,9 @@ importers: '@xwiki/cristal-authentication-api': specifier: workspace:* version: link:../core/authentication/authentication-api + '@xwiki/cristal-authentication-default': + specifier: workspace:* + version: link:../core/authentication/authentication-default '@xwiki/cristal-authentication-ui': specifier: workspace:* version: link:../core/authentication/authentication-ui @@ -2734,9 +2758,9 @@ importers: '@xwiki/cristal-api': specifier: workspace:* version: link:../../api - '@xwiki/cristal-authentication-api': + '@xwiki/cristal-authentication-default': specifier: workspace:* - version: link:../../core/authentication/authentication-api + version: link:../../core/authentication/authentication-default '@xwiki/cristal-backend-dexie': specifier: workspace:* version: link:../../core/backends/backend-dexie @@ -2801,6 +2825,9 @@ importers: '@xwiki/cristal-backend-api': specifier: workspace:* version: link:../core/backends/backend-api + '@xwiki/cristal-date-ui': + specifier: workspace:* + version: link:../core/date/date-ui '@xwiki/cristal-document-api': specifier: workspace:* version: link:../core/document/document-api @@ -2843,6 +2870,9 @@ importers: '@xwiki/cristal-uiextension-ui': specifier: workspace:* version: link:../core/uiextension/uiextension-ui + '@xwiki/cristal-user-ui': + specifier: workspace:* + version: link:../core/user/user-ui inversify: specifier: 6.2.0 version: 6.2.0(reflect-metadata@0.2.2) @@ -3685,10 +3715,6 @@ packages: resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.16.0': - resolution: {integrity: sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.17.0': resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -8912,8 +8938,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.16.0': {} - '@eslint/js@9.17.0': {} '@eslint/object-schema@2.1.5': {} diff --git a/sharedworker/impl/package.json b/sharedworker/impl/package.json index 76fab23a0..02a2cbf8c 100644 --- a/sharedworker/impl/package.json +++ b/sharedworker/impl/package.json @@ -27,7 +27,7 @@ "types": "dist/index.d.ts", "dependencies": { "@xwiki/cristal-api": "workspace:*", - "@xwiki/cristal-authentication-api": "workspace:*", + "@xwiki/cristal-authentication-default": "workspace:*", "@xwiki/cristal-backend-dexie": "workspace:*", "@xwiki/cristal-backend-github": "workspace:*", "@xwiki/cristal-backend-nextcloud": "workspace:*", diff --git a/sharedworker/impl/src/components/worker.ts b/sharedworker/impl/src/components/worker.ts index dcd047124..23d76dffe 100644 --- a/sharedworker/impl/src/components/worker.ts +++ b/sharedworker/impl/src/components/worker.ts @@ -22,7 +22,7 @@ import "reflect-metadata"; import { WorkerCristalApp } from "./workerCristalApp"; import WorkerQueueWorker from "./workerQueueWorker"; import { CristalApp, WrappingStorage } from "@xwiki/cristal-api"; -import { ComponentInit as AuthenticationAPIComponentInit } from "@xwiki/cristal-authentication-api"; +import { ComponentInit as AuthenticationDefaultComponentInit } from "@xwiki/cristal-authentication-default"; import { ComponentInit as DexieBackendComponentInit } from "@xwiki/cristal-backend-dexie"; import { ComponentInit as GithubBackendComponentInit } from "@xwiki/cristal-backend-github"; import { ComponentInit as NextcloudBackendComponentInit } from "@xwiki/cristal-backend-nextcloud"; @@ -219,7 +219,7 @@ export class Worker implements MyWorker { new GithubBackendComponentInit(cristalLoader.container); new NextcloudBackendComponentInit(cristalLoader.container); new XWikiBackendComponentInit(cristalLoader.container); - new AuthenticationAPIComponentInit(cristalLoader.container); + new AuthenticationDefaultComponentInit(cristalLoader.container); console.log("Loading storage components"); this.initialized = true; console.log("Finished initialize"); diff --git a/skin/langs/translation-en.json b/skin/langs/translation-en.json index 2493df14b..70ba4a2c5 100644 --- a/skin/langs/translation-en.json +++ b/skin/langs/translation-en.json @@ -6,7 +6,8 @@ "page.creation.menu.field.name": "Name", "page.creation.menu.submit": "Create", "page.creation.menu.title": "New Page", - "page.edited.details": "Edited on {date} | {user} edited on {date}", + "page.edited.details": "Edited on {date}", + "page.edited.details.user": "{user} edited on {date}", "information.extraTabs.title": "Information", "history.alert.content": "You are currently viewing version {revision} of {pageName}. Edition is disabled.", "history.alert.link.label": "Click here to go back to the latest version.", diff --git a/skin/langs/translation-fr.json b/skin/langs/translation-fr.json index ab7b2faf6..a8ec03529 100644 --- a/skin/langs/translation-fr.json +++ b/skin/langs/translation-fr.json @@ -6,7 +6,8 @@ "page.creation.menu.field.name": "Nom", "page.creation.menu.submit": "Créer", "page.creation.menu.title": "Nouvelle page", - "page.edited.details": "Édité le {date} | {user} a édité le {date}", + "page.edited.details": "Édité le {date}", + "page.edited.details.user": "{user} a édité le {date}", "information.extraTabs.title": "Informations", "history.alert.content": "Vous consultez actuellement la version {revision} de {pageName}. L'édition est désactivée.", "history.alert.link.label": "Ciquez ici pour retourner à la dernière version." diff --git a/skin/package.json b/skin/package.json index 3c7f9728e..ac2882751 100644 --- a/skin/package.json +++ b/skin/package.json @@ -31,6 +31,7 @@ "@xwiki/cristal-alerts-ui": "workspace:*", "@xwiki/cristal-api": "workspace:*", "@xwiki/cristal-backend-api": "workspace:*", + "@xwiki/cristal-date-ui": "workspace:*", "@xwiki/cristal-document-api": "workspace:*", "@xwiki/cristal-extra-tabs-api": "workspace:*", "@xwiki/cristal-extra-tabs-ui": "workspace:*", @@ -45,6 +46,7 @@ "@xwiki/cristal-page-actions-ui": "workspace:*", "@xwiki/cristal-uiextension-api": "workspace:*", "@xwiki/cristal-uiextension-ui": "workspace:*", + "@xwiki/cristal-user-ui": "workspace:*", "inversify": "6.2.0", "marked": "15.0.3", "reflect-metadata": "0.2.2", diff --git a/skin/src/vue/c-article.vue b/skin/src/vue/c-article.vue index 7f5caec2f..c3594d0fe 100644 --- a/skin/src/vue/c-article.vue +++ b/skin/src/vue/c-article.vue @@ -2,9 +2,11 @@ import messages from "../translations"; import { AlertsToasts } from "@xwiki/cristal-alerts-ui"; import { PageData } from "@xwiki/cristal-api"; +import { Date } from "@xwiki/cristal-date-ui"; import { ExtraTabs } from "@xwiki/cristal-extra-tabs-ui"; import { InfoActions } from "@xwiki/cristal-info-actions-ui"; import { UIExtensions } from "@xwiki/cristal-uiextension-ui"; +import { User } from "@xwiki/cristal-user-ui"; import { Ref, inject, ref, watch } from "vue"; import { useI18n } from "vue-i18n"; import type { CristalApp } from "@xwiki/cristal-api"; @@ -72,24 +74,27 @@ watch(
- {{ - currentPage?.lastModificationDate - ? t( - "page.edited.details", - { - date: currentPage?.lastModificationDate.toLocaleString( - undefined, - { - dateStyle: "short", - timeStyle: "short", - }, - ), - user: currentPage?.lastAuthor, - }, - currentPage?.lastAuthor ? 2 : 1, - ) - : "" - }} + + + + + + +