Ulf Gebhardt 9668f8d417
refactor(source): svg files & heroicons (#144)
* support for svg files

Support to load svg files and include them as bas64 encoded images in
the bundle.

* navbar svgs

* replace NavBar SVGs with heroicons

* layercontrol icons

* lint fix

* quest - questionmark

* plusbutton - plus

* linkeditem - elipse-vertical - link-slash

* contactinfo - envelope & phone

* avatar - arrow-up-tray

* ActionButton - link & plus

* StartEndView - calendar x2

* HeaderView - ellipse-vertical & pencil & trash

* SidebarControl - bars-3

* SearchControl - flag & magnifying-glass

* GratitudeControl - heart

* FilterControl - funnel

* AddButton - plus

* reduce test coverage requirements

* remove wrongfully commit dummy svg

* updated obsolete package.lock

* migrate more svgs from code to file, use hero icons where it seems applicable

* moved share icons to subfolder

* fixed layout

---------

Co-authored-by: Anton Tranelis <mail@antontranelis.de>
2025-02-24 14:58:31 +00:00

129 lines
4.3 KiB
TypeScript

/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unnecessary-condition */
/* eslint-disable @typescript-eslint/restrict-template-expressions */
/* eslint-disable @typescript-eslint/no-explicit-any */
import LinkIcon from '@heroicons/react/24/outline/LinkIcon'
import PlusIcon from '@heroicons/react/24/outline/PlusIcon'
import { useState } from 'react'
import { TextInput } from '#components/Input'
import { useItems } from '#components/Map/hooks/useItems'
import { useHasUserPermission } from '#components/Map/hooks/usePermissions'
import { useGetItemTags } from '#components/Map/hooks/useTags'
import { HeaderView } from '#components/Map/Subcomponents/ItemPopupComponents/HeaderView'
import DialogModal from '#components/Templates/DialogModal'
import type { Item } from '#types/Item'
export function ActionButton({
item,
triggerAddButton,
triggerItemSelected,
existingRelations,
itemType,
collection = 'items',
customStyle,
}: {
triggerAddButton?: any
triggerItemSelected?: any
existingRelations: Item[]
itemType?: string
collection?: string
customStyle?: string
item: Item
}) {
const hasUserPermission = useHasUserPermission()
const [modalOpen, setModalOpen] = useState<boolean>(false)
const [search, setSearch] = useState<string>('')
const getItemTags = useGetItemTags()
const items = useItems()
const filterdItems = items
.filter((i) => !itemType || i.layer?.itemType.name === itemType)
.filter((i) => !existingRelations.some((s) => s.id === i.id))
.filter((i) => i.id !== item.id)
const backgroundColor =
item.color ??
(getItemTags(item) && getItemTags(item)[0] && getItemTags(item)[0].color
? getItemTags(item)[0].color
: item.layer?.markerDefaultColor)
return (
<>
{hasUserPermission(collection, 'update', item) && (
<>
<div className={`tw-absolute tw-right-4 tw-bottom-4 tw-flex tw-flex-col ${customStyle}`}>
{triggerItemSelected && (
<button
tabIndex={0}
className='tw-z-500 tw-btn tw-btn-circle tw-shadow'
onClick={() => {
setModalOpen(true)
}}
style={{
backgroundColor,
color: '#fff',
}}
>
<LinkIcon className='tw-h-5 tw-w-5 tw-stroke-[2.5]' />
</button>
)}
{triggerAddButton && (
<button
tabIndex={0}
className='tw-z-500 tw-btn tw-btn-circle tw-shadow tw-mt-2'
onClick={() => {
triggerAddButton()
}}
style={{
backgroundColor,
color: '#fff',
}}
>
<PlusIcon className='tw-w-5 tw-h-5 tw-stroke-[2.5]' />
</button>
)}
</div>
<DialogModal
title={'Select'}
isOpened={modalOpen}
onClose={() => setModalOpen(false)}
className='tw-w-xl sm:tw-w-2xl tw-min-h-80 tw-bg-base-200'
>
<TextInput
defaultValue=''
placeholder='🔍 Search'
containerStyle='lg:col-span-2 tw-m-4 '
updateFormValue={(val) => {
setSearch(val)
}}
></TextInput>
<div className='tw-grid tw-grid-cols-1 sm:tw-grid-cols-2'>
{filterdItems
.filter((item) => {
return search === ''
? item
: item.name.toLowerCase().includes(search.toLowerCase())
})
.map((i) => (
<div
key={i.id}
className='tw-cursor-pointer tw-card tw-border-[1px] tw-border-base-300 tw-card-body tw-shadow-xl tw-bg-base-100 tw-text-base-content tw-mx-4 tw-p-4 tw-mb-4 tw-h-fit'
onClick={() => {
triggerItemSelected(i.id)
setModalOpen(false)
}}
>
<HeaderView item={i} hideMenu></HeaderView>
</div>
))}
</div>
</DialogModal>
</>
)}
</>
)
}