diff --git a/package-lock.json b/package-lock.json index 5253f9c8..06b8997b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,7 +35,7 @@ "@solid-primitives/storage": "1.3.9", "@solid-primitives/upload": "0.0.110", "@solidjs/meta": "0.28.2", - "@thisbeyond/solid-select": "0.13.0", + "@thisbeyond/solid-select": "0.14.0", "@tiptap/core": "2.0.3", "@tiptap/extension-blockquote": "2.0.3", "@tiptap/extension-bold": "2.0.3", @@ -5745,9 +5745,9 @@ } }, "node_modules/@thisbeyond/solid-select": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@thisbeyond/solid-select/-/solid-select-0.13.0.tgz", - "integrity": "sha512-eION+Xf8TGLs1NZrvRo1NRKOl4plYMbY7UswHhh5bEUY8oMltjrBhUWF0hzaFViEc1zZpkCQyafaD89iofG6Tg==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@thisbeyond/solid-select/-/solid-select-0.14.0.tgz", + "integrity": "sha512-ecq4U3Vnc/nJbU84ARuPg2scNuYt994ljF5AmBlzuZW87x43mWiGJ5hEWufIJJMpDT6CcnCIx/xbrdDkaDEHQw==", "dev": true, "peerDependencies": { "solid-js": "^1.5" @@ -24828,9 +24828,9 @@ "requires": {} }, "@thisbeyond/solid-select": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@thisbeyond/solid-select/-/solid-select-0.13.0.tgz", - "integrity": "sha512-eION+Xf8TGLs1NZrvRo1NRKOl4plYMbY7UswHhh5bEUY8oMltjrBhUWF0hzaFViEc1zZpkCQyafaD89iofG6Tg==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@thisbeyond/solid-select/-/solid-select-0.14.0.tgz", + "integrity": "sha512-ecq4U3Vnc/nJbU84ARuPg2scNuYt994ljF5AmBlzuZW87x43mWiGJ5hEWufIJJMpDT6CcnCIx/xbrdDkaDEHQw==", "dev": true, "requires": {} }, diff --git a/package.json b/package.json index 0bd48e79..a5cb701f 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "@solid-primitives/storage": "1.3.9", "@solid-primitives/upload": "0.0.110", "@solidjs/meta": "0.28.2", - "@thisbeyond/solid-select": "0.13.0", + "@thisbeyond/solid-select": "0.14.0", "@tiptap/core": "2.0.3", "@tiptap/extension-blockquote": "2.0.3", "@tiptap/extension-bold": "2.0.3", diff --git a/src/components/Editor/TopicSelect/TopicSelect.module.scss b/src/components/Editor/TopicSelect/TopicSelect.module.scss new file mode 100644 index 00000000..a2a15c1b --- /dev/null +++ b/src/components/Editor/TopicSelect/TopicSelect.module.scss @@ -0,0 +1,23 @@ +.selectedItem { + cursor: pointer; + + &.mainTopic { + cursor: default; + + &, + + :global(.solid-select-multi-value-remove) { + color: #ccc; + } + + &:before { + background: #000; + content: ''; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; + z-index: -1; + } + } +} diff --git a/src/components/Editor/TopicSelect/TopicSelect.tsx b/src/components/Editor/TopicSelect/TopicSelect.tsx index 924a4e40..ebab3d12 100644 --- a/src/components/Editor/TopicSelect/TopicSelect.tsx +++ b/src/components/Editor/TopicSelect/TopicSelect.tsx @@ -3,32 +3,77 @@ import { createOptions, Select } from '@thisbeyond/solid-select' import { useLocalize } from '../../../context/localize' import '@thisbeyond/solid-select/style.css' import './TopicSelect.scss' +import styles from './TopicSelect.module.scss' +import { clsx } from 'clsx' +import { createSignal } from 'solid-js' +import { slugify } from '../../../utils/slugify' +import { clone } from '../../../utils/clone' type TopicSelectProps = { topics: Topic[] selectedTopics: Topic[] onChange: (selectedTopics: Topic[]) => void + mainTopic?: Topic + onMainTopicChange: (mainTopic: Topic) => void } export const TopicSelect = (props: TopicSelectProps) => { const { t } = useLocalize() + const [isDisabled, setIsDisabled] = createSignal(false) + + const createValue = (title): Topic => { + const minId = Math.min(...props.selectedTopics.map((topic) => topic.id)) + const id = minId < 0 ? minId - 1 : -2 + return { id, title, slug: slugify(title) } + } + const selectProps = createOptions(props.topics, { key: 'title', disable: (topic) => { - // console.log({ selectedTopics: clone(props.selectedTopics) }) return props.selectedTopics.some((selectedTopic) => selectedTopic.slug === topic.slug) - } + }, + createable: createValue }) const handleChange = (selectedTopics: Topic[]) => { props.onChange(selectedTopics) } + const handleSelectedItemClick = (topic: Topic) => { + setIsDisabled(true) + props.onMainTopicChange(topic) + setIsDisabled(false) + } + + const format = (item, type) => { + if (type === 'option') { + return item.label + } + + const isMainTopic = item.id === props.mainTopic.id + + return ( +