react-feather#Tag JavaScript Examples
The following examples show how to use
react-feather#Tag.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: Timeline.js From hivemind with Apache License 2.0 | 4 votes |
Timeline = ({ data, timestamp, jump }) => {
const timelineRef = useRef()
const timeline = useRef()
const {
cyWrapper: { cy, viewApi },
} = useContext(GlobalContext)
const [modal, setModal] = useState(false)
const [target, setTarget] = useState('timeline')
const [node, setNode] = useState(<Spinner />)
const [showJump, setShowJump] = useState('d-block')
const [showFind, setShowFind] = useState('d-none')
const [items, setItems] = useState([])
const toggle = () => setModal(!modal)
const jumpTo = async (lctime) => {
if (lctime !== timestamp) {
jump(lctime)
}
setModal(false)
}
const locate = (item) => {
if (item && item.event !== 'deleted') {
const node = cy.$id(item.nid)
viewApi.zoomToSelected(node)
viewApi.removeHighlights(cy.elements())
viewApi.highlight(node)
}
setModal(false)
}
useEffect(() => {
if (get(data, 'ok')) {
setItems(
data.data.map((event, idx) => ({
id: idx,
className: event.lctime === timestamp ? 'pinned' : '',
title: event.event,
content: '',
start: event.lctime * 1000,
style: `background-color: ${bgColors[event.event]};`,
lctime: event.lctime,
nid: event.nids[0] || event.mid,
event: event.event,
}))
)
}
}, [data, timestamp])
useEffect(() => {
if (items.length) {
if (timeline.current) {
timeline.current.setItems(items)
} else {
const container = timelineRef.current
if (container.firstChild) {
container.removeChild(container.firstChild)
}
const margin = (items[items.length - 1].start - items[0].start) * 0.05
const options = {
width: '100%',
height: '120px',
type: 'box',
stack: false,
horizontalScroll: false,
verticalScroll: false,
cluster: {
titleTemplate: '{count}',
maxItems: 1,
showStipes: true,
fitOnDoubleClick: true,
},
max: items[items.length - 1].start + margin,
min: items[0].start - margin,
selectable: false,
dataAttributes: ['id'],
zoomMin: 60000,
}
timeline.current = new VisTimeline(container, items, options)
}
timeline.current.on('click', (properties) => {
const { what, isCluster, item } = properties
if (what === 'item' && !isCluster) {
setNode(<Spinner />)
setTarget(item)
setModal(true)
if (items[item].className === 'pinned') {
setShowJump('d-none')
if (items[item].event !== 'deleted') {
setShowFind('d-block')
}
} else {
setShowJump('d-block')
setShowFind('d-none')
}
} else {
setModal(false)
setTarget('timeline')
}
})
timeline.current.on('doubleClick', (properties) => {
const { what, item, isCluster } = properties
switch (what) {
case 'background':
timeline.current.fit()
break
case 'item':
if (!isCluster) {
timeline.current.focus(item)
}
break
}
})
defer(() => { // To ensure focus/fit on first load.
if (timestamp) {
const idx = findIndex(items, { lctime: timestamp })
timeline.current.focus(idx)
} else {
timeline.current.fit()
}
})
}
}, [items, timestamp])
useEffect(
() => () => {
timeline.current.destroy()
timeline.current = null
},
[]
)
return (
<div className={'border border-secondary rounded'}>
<div id={'timeline'} ref={timelineRef} className={'m-1'} >
<Spinner/>
</div>
<Modal
isOpen={modal}
toggle={toggle}
fade={false}
centered={true}
size={'lg'}
scrollable={true}
>
<ModalHeader toggle={toggle}>
<b>{node}</b> | {get(items, [target, 'event'], 'NA')}{' '}
{new Date(get(items, [target, 'start'], Date.now())).toLocaleString()}
</ModalHeader>
<ModalBody>
{data && data.data[target] ? (
<EventDetail event={data.data[target]} setNode={setNode} />
) : null}
</ModalBody>
<ModalFooter>
<Button
className={`ml-1 ${showJump}`}
outline
color="secondary"
id="jump"
onClick={() => jumpTo(items[target].lctime)}
>
<MapPin size={16} /> Jump
</Button>
<Button
className={`ml-1 ${showFind}`}
outline
color="secondary"
id="find"
onClick={() => locate(items[target])}
>
<Search size={16} /> Find
</Button>
<ToolTippedButton
className="ml-1"
outline
color="secondary"
id="tag"
disabled={true}
tooltip={'Coming Soon'}
>
<Tag size={16} /> Tag
</ToolTippedButton>
</ModalFooter>
</Modal>
</div>
)
}
Example #2
Source File: [key].js From hivemind with Apache License 2.0 | 4 votes |
Page = () => {
const { user } = useUser()
const router = useRouter()
const [timestamp, setTimestamp] = useState(
typeof window === 'undefined'
? null
: parseFloat(new URLSearchParams(location.search).get('timestamp'))
)
const { key } = router.query
const { data, error } = useFetch(
user ? user : null,
`/api/mindmaps/${key}?timestamp=${timestamp || ''}`
)
const { data: edata, error: eerror } = useFetch(
user ? user : null,
`/api/timeline/events?key=${key}`
)
const [title, setTitle] = useState(key)
useEffect(() => {
if (user) {
mutate(
[`/api/mindmaps/${key}?timestamp=${timestamp || ''}`, user.token],
null,
true
)
}
}, [user, timestamp, key])
useEffect(() => {
if (user) {
mutate([`/api/timeline/events?key=${key}`, user.token], null, true)
}
}, [user, key])
useEffect(() => {
if (data && data.ok) {
setTitle(data.data.meta.name)
}
}, [data])
useEffect(() => {
const handleRouteChange = (url) => {
const fullURL = new URL(url, location.origin)
const toTs = fullURL.searchParams.get('timestamp')
const toTsF = parseFloat(toTs) || null
if ((!toTsF && timestamp) || toTsF !== timestamp) {
setTimestamp(toTsF)
}
}
router.events.on('routeChangeComplete', handleRouteChange)
return () => {
router.events.off('routeChangeComplete', handleRouteChange)
}
}, [router.events, timestamp])
if (typeof user === 'undefined') {
return <Spinner />
}
if (error && window.notify) {
const options = {
place: 'tr',
message: 'Failed to fetch mind map!',
type: 'danger',
autoDismiss: 7,
}
window.notify(options)
}
if (eerror && window.notify) {
const options = {
place: 'tr',
message: 'Failed to fetch events!',
type: 'danger',
autoDismiss: 7,
}
window.notify(options)
}
const gotEventData = !eerror && edata && edata.ok
const cEvents = gotEventData && edata.data
const prevDisabled = !gotEventData || timestamp === cEvents[0].lctime
const nextDisabled = !gotEventData || timestamp === last(cEvents).lctime
async function jump(to) {
if (to === 'now') {
await router.push('/mmaps/[key]', `/mmaps/${key}`, { shallow: true })
setTimestamp(null)
} else if (gotEventData) {
let toTS, idx
switch (to) {
case 'first':
toTS = cEvents[0].lctime
break
case 'prev':
idx = timestamp
? findIndex(cEvents, { lctime: timestamp })
: cEvents.length
toTS = cEvents[idx - 1].lctime
break
case 'next':
idx = timestamp
? findIndex(cEvents, { lctime: timestamp })
: cEvents.length - 2
toTS = cEvents[idx + 1].lctime
break
case 'last':
toTS = last(cEvents).lctime
break
default:
toTS = to
}
await router.push(
'/mmaps/[key]',
{
pathname: `/mmaps/${key}`,
query: { timestamp: toTS },
},
{ shallow: true }
)
setTimestamp(toTS)
}
}
if (user) {
const output = [
<Row key="title">
<Col xs="auto" md={7}>
<h3>
{title}
{timestamp ? (
<>
<small className={'text-muted'}>
{' '}
@ {new Date(timestamp * 1000).toLocaleString()}
</small>
</>
) : null}
</h3>
</Col>
<Col xs="auto" md={5} className={'text-right'}>
<ShowAll />
<Fit />
<Search />
|
<ToolTippedButton
className="ml-1"
outline
color="secondary"
id="tag"
disabled={true}
tooltip="Tag (Coming Soon)"
>
<Tag size={16} />
</ToolTippedButton>
<ToolTippedButton
className="ml-1"
outline
color="secondary"
id="first"
disabled={prevDisabled}
tooltip="First"
onClick={() => jump('first')}
>
<SkipBack size={16} />
</ToolTippedButton>
<ToolTippedButton
className="ml-1"
outline
color="secondary"
id="prev"
disabled={prevDisabled}
tooltip="Previous"
onClick={() => jump('prev')}
>
<Rewind size={16} />
</ToolTippedButton>
<ToolTippedButton
className="ml-1"
outline
color="secondary"
id="next"
disabled={nextDisabled}
tooltip="Next"
onClick={() => jump('next')}
>
<FastForward size={16} />
</ToolTippedButton>
<ToolTippedButton
className="ml-1"
outline
color="secondary"
id="last"
disabled={nextDisabled}
tooltip="Last"
onClick={() => jump('last')}
>
<SkipForward size={16} />
</ToolTippedButton>
|
<Rename
nameChangedCallBack={setTitle}
disabled={!!timestamp}
rootNode={get(data, ['data', 'meta'], {})}
/>
<ToolTippedButton
className="ml-1"
outline
color={timestamp ? 'secondary' : 'danger'}
id="now"
tooltip={timestamp ? 'Click to unlock' : 'Click to lock'}
onClick={() => jump(timestamp ? 'now' : 'last')}
>
{timestamp ? <Lock size={16} /> : <Unlock size={16} />}
</ToolTippedButton>
</Col>
</Row>,
]
if (error && data) {
output.push(
<Row key="content">
<Col>
<Error statusCode={data.status} />
</Col>
</Row>
)
} else if (eerror && edata) {
output.push(
<Row key="content">
<Col>
<Error statusCode={edata.status} />
</Col>
</Row>
)
} else {
output.push(
<Row key="content">
<Col>
<MindMap
data={data}
edata={edata}
timestamp={timestamp}
jump={jump}
/>
</Col>
</Row>
)
}
return output
}
return <AuthPrompt />
}