Handling creation metadata (creator, created, modified)
This commit is contained in:
parent
213c53fa4e
commit
15dd1374db
|
@ -1,3 +1,8 @@
|
||||||
|
/**
|
||||||
|
* Difference between server time and client time, in milliseconds
|
||||||
|
*/
|
||||||
|
let serverTimeDifference = 0;
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -14,4 +19,13 @@ export default {
|
||||||
* avatarURL .... OPTIONAL + not supported at the moment
|
* avatarURL .... OPTIONAL + not supported at the moment
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// Sets a server time to
|
||||||
|
setServerTime: serverNow => {
|
||||||
|
const browserNow = Date.now()
|
||||||
|
serverTimeDifference = serverNow - browserNow;
|
||||||
|
},
|
||||||
|
|
||||||
|
getCurrentTimeAdjusted: () =>
|
||||||
|
(new Date(Date.now() + serverTimeDifference)).toISOString()
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
import React from 'preact/compat';
|
import React from 'preact/compat';
|
||||||
import { useState, useRef, useEffect } from 'preact/hooks';
|
import { useState, useRef, useEffect } from 'preact/hooks';
|
||||||
|
import Environment from '../Environment';
|
||||||
import setPosition from './setPosition';
|
import setPosition from './setPosition';
|
||||||
import i18n from '../i18n';
|
import i18n from '../i18n';
|
||||||
|
|
||||||
|
@ -63,15 +64,36 @@ const Editor = props => {
|
||||||
return () => resizeObserver.disconnect();
|
return () => resizeObserver.disconnect();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
// Creator and created/modified timestamp metadata
|
||||||
|
const creationMeta = body => {
|
||||||
|
const meta = {};
|
||||||
|
|
||||||
|
// No point in adding meta while we're in draft state
|
||||||
|
if (!body.draft) {
|
||||||
|
const { user } = Environment;
|
||||||
|
if (user) meta.creator = {};
|
||||||
|
if (user.id) meta.creator.id = user.id;
|
||||||
|
if (user.displayName) meta.creator.name = user.displayName;
|
||||||
|
|
||||||
|
if (body.created)
|
||||||
|
body.modified = Environment.getCurrentTimeAdjusted();
|
||||||
|
else
|
||||||
|
body.created = Environment.getCurrentTimeAdjusted();
|
||||||
|
}
|
||||||
|
|
||||||
|
return meta;
|
||||||
|
}
|
||||||
|
|
||||||
const onAppendBody = body => setCurrentAnnotation(
|
const onAppendBody = body => setCurrentAnnotation(
|
||||||
currentAnnotation.clone({
|
currentAnnotation.clone({
|
||||||
body: [ ...currentAnnotation.bodies, body ]
|
body: [ ...currentAnnotation.bodies, { ...body, ...creationMeta(body) } ]
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
const onUpdateBody = (previous, updated) => setCurrentAnnotation(
|
const onUpdateBody = (previous, updated) => setCurrentAnnotation(
|
||||||
currentAnnotation.clone({
|
currentAnnotation.clone({
|
||||||
body: currentAnnotation.bodies.map(body => body === previous ? updated : body)
|
body: currentAnnotation.bodies.map(body =>
|
||||||
|
body === previous ? { ...updated, ...creationMeta(updated) } : body)
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -84,7 +106,8 @@ const Editor = props => {
|
||||||
const onOk = _ => {
|
const onOk = _ => {
|
||||||
// Removes the 'draft' flag from all bodies
|
// Removes the 'draft' flag from all bodies
|
||||||
const undraft = annotation => annotation.clone({
|
const undraft = annotation => annotation.clone({
|
||||||
body : annotation.bodies.map(({ draft, ...rest }) => rest)
|
body : annotation.bodies.map(({ draft, ...rest }) =>
|
||||||
|
draft ? { ...rest, ...creationMeta(rest) } : rest )
|
||||||
});
|
});
|
||||||
|
|
||||||
// Current annotation is either a selection (if it was created from
|
// Current annotation is either a selection (if it was created from
|
||||||
|
|
|
@ -26,7 +26,10 @@ const Comment = props => {
|
||||||
|
|
||||||
return props.readOnly ? (
|
return props.readOnly ? (
|
||||||
<div className="r6o-widget comment">
|
<div className="r6o-widget comment">
|
||||||
{props.body.value}
|
<div className="value">{props.body.value}</div>
|
||||||
|
<div className="lastmodified">
|
||||||
|
<div className="lastmodified-by">{props.body.creator?.name}</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div className={ isEditable ? "r6o-widget comment editable" : "r6o-widget comment"}>
|
<div className={ isEditable ? "r6o-widget comment editable" : "r6o-widget comment"}>
|
||||||
|
@ -36,6 +39,12 @@ const Comment = props => {
|
||||||
onChange={onUpdateComment}
|
onChange={onUpdateComment}
|
||||||
onSaveAndClose={props.onSaveAndClose}
|
onSaveAndClose={props.onSaveAndClose}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
{ props.body.creator &&
|
||||||
|
<div className="lastmodified">
|
||||||
|
<div className="lastmodified-by">{props.body.creator.name}</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
<div
|
<div
|
||||||
className={isMenuVisible ? "icon arrow-down menu-open" : "icon arrow-down"}
|
className={isMenuVisible ? "icon arrow-down menu-open" : "icon arrow-down"}
|
||||||
|
|
|
@ -1,10 +1,19 @@
|
||||||
.r6o-widget.comment {
|
.r6o-widget.comment {
|
||||||
font-size:14px;
|
font-size:14px;
|
||||||
min-height:3em;
|
min-height:1em;
|
||||||
background-color:#fff;
|
background-color:#fff;
|
||||||
position:relative;
|
position:relative;
|
||||||
padding:8px 10px;
|
padding:8px 10px;
|
||||||
|
|
||||||
|
.lastmodified {
|
||||||
|
border:1px solid $lightgrey-border;
|
||||||
|
display:inline-block;
|
||||||
|
border-radius:2px;
|
||||||
|
padding:4px 5px;
|
||||||
|
line-height:100%;
|
||||||
|
font-size:12px;
|
||||||
|
}
|
||||||
|
|
||||||
.arrow-down {
|
.arrow-down {
|
||||||
position:absolute;
|
position:absolute;
|
||||||
height: 20px;
|
height: 20px;
|
||||||
|
|
Loading…
Reference in New Issue