1
0
Fork 0
freesewing/sites/shared/components/workbench/views/flags.mjs

133 lines
3.7 KiB
JavaScript
Raw Normal View History

2023-09-07 10:29:19 +02:00
// Dependencies
import { flagTypes } from 'plugins/plugin-annotations/src/flag.mjs'
import mustache from 'mustache'
import { nsMerge } from 'shared/utils.mjs'
// Hooks
import { useTranslation } from 'next-i18next'
// Components
import {
ChatIcon,
TipIcon,
WarningIcon,
ErrorIcon,
2023-09-08 13:36:13 +02:00
WrenchIcon as FixmeIcon,
2023-09-07 10:29:19 +02:00
ExpandIcon,
2023-09-09 15:31:53 +02:00
FlagIcon,
OptionsIcon,
2023-09-07 10:29:19 +02:00
} from 'shared/components/icons.mjs'
import Markdown from 'react-markdown'
2023-09-09 15:31:53 +02:00
import { SubAccordion } from 'shared/components/accordion.mjs'
2023-09-07 10:29:19 +02:00
const flagIcons = {
note: ChatIcon,
tip: TipIcon,
warn: WarningIcon,
error: ErrorIcon,
fixme: FixmeIcon,
// Used in content
expand: ExpandIcon,
options: OptionsIcon,
2023-09-07 10:29:19 +02:00
}
2023-09-10 11:22:27 +02:00
export const Flag = ({ data, t, handleUpdate }) => {
2023-09-07 10:29:19 +02:00
const BtnIcon = data.suggest?.icon ? flagIcons[data.suggest.icon] : false
const button =
data.suggest?.text && data.suggest?.update ? (
<button
2023-09-09 15:31:53 +02:00
className={`btn btn-secondary btn-outline flex flex-row items-center ${
2023-09-07 10:29:19 +02:00
BtnIcon ? 'gap-6' : ''
}`}
onClick={() => handleUpdate(data.suggest.update)}
>
{BtnIcon && <BtnIcon className="w-5 h-6 sm:w-6 h-6" />}
{t(data.suggest.text)}
</button>
) : null
2023-09-09 15:31:53 +02:00
const desc = data.replace ? mustache.render(t(data.desc), data.replace) : t(data.desc)
2023-09-07 10:29:19 +02:00
return (
2023-09-09 15:31:53 +02:00
<div className="flex flex-col gap-2 items-start">
<div className="first:mt-0 grow md flag">
2023-09-10 11:08:31 +02:00
<Markdown>{desc}</Markdown>
2023-09-07 10:29:19 +02:00
</div>
2023-09-09 15:31:53 +02:00
{button ? <div className="mt-2 w-full flex flex-row justify-end">{button}</div> : null}
2023-09-07 10:29:19 +02:00
</div>
)
}
2023-09-09 15:31:53 +02:00
const flattenFlags = (flags) => {
const all = {}
const ns = ['flag']
for (const type of flagTypes) {
let i = 0
if (flags[type]) {
2023-09-10 11:08:31 +02:00
for (const flag of Object.values(flags[type])) {
2023-09-09 15:31:53 +02:00
i++
all[`${type}-${i}`] = { ...flag, type }
if (flag.ns) ns.push(flag.ns)
if (flag.title.includes(':')) ns.push(flag.title.split(':').shift())
if (flag.desc.includes(':')) ns.push(flag.desc.split(':').shift())
}
}
}
return [all, ns]
}
export const FlagsAccordionTitle = ({ flags }) => {
const { t } = useTranslation(['flag'])
const [flagList] = flattenFlags(flags)
if (Object.keys(flagList).length < 1) return null
return (
<>
<h5 className="flex flex-row gap-2 items-center justify-between w-full">
<span className="text-left">
2023-09-09 15:31:53 +02:00
{t('flag:flagMenu.t')} ({Object.keys(flagList).length})
</span>
<FlagIcon className="w-8 h-8" />
</h5>
<p className="text-left">
{Object.keys(flagList).length > 1 ? t('flag:flagMenuMany.d') : t('flag:flagMenuOne.d')}
</p>
</>
)
}
export const FlagsAccordionEntries = ({ flags, update }) => {
const [flagList, ns] = flattenFlags(flags)
const { t } = useTranslation(nsMerge(ns))
if (Object.keys(flagList).length < 1) return null
const handleUpdate = (config) => {
if (config.settings) update.settings(...config.settings)
if (config.ui) update.ui(...config.settings)
}
return (
<SubAccordion
2023-09-10 11:08:31 +02:00
items={Object.entries(flagList).map(([key, flag], i) => {
2023-09-09 15:31:53 +02:00
const Icon = flagIcons[flag.type]
const title = flag.replace ? mustache.render(t(flag.title), flag.replace) : t(flag.title)
return [
<div className="w-full flex flex-row gap2 justify-between" key={i}>
<div className="flex flex-row items-center gap-2">
<div className="no-shrink">
<Icon />
</div>
<span className="font-medium text-left">{title}</span>
2023-09-09 15:31:53 +02:00
</div>
<span className="uppercase font-bold">{flag.type}</span>
</div>,
2023-09-10 11:22:27 +02:00
<Flag key={key} t={t} data={flag} handleUpdate={handleUpdate} />,
2023-09-09 15:31:53 +02:00
]
})}
/>
)
}