From 01f33413eb4c2a0f05eebef94298351f5c9a61a5 Mon Sep 17 00:00:00 2001
From: bniwredyc
Date: Wed, 10 May 2023 22:20:53 +0200
Subject: [PATCH] main topic select, save topics WiP
---
package-lock.json | 14 ++--
package.json | 2 +-
.../TopicSelect/TopicSelect.module.scss | 13 +++
.../Editor/TopicSelect/TopicSelect.tsx | 45 ++++++++++-
src/components/Views/Edit.module.scss | 4 +
src/components/Views/Edit.tsx | 39 +++++++--
src/context/editor.tsx | 79 ++++++++++---------
src/graphql/query/topics-all.ts | 1 +
src/graphql/types.gen.ts | 7 +-
src/pages/edit.page.tsx | 11 ++-
src/utils/slugify.ts | 7 ++
11 files changed, 165 insertions(+), 57 deletions(-)
create mode 100644 src/components/Editor/TopicSelect/TopicSelect.module.scss
create mode 100644 src/utils/slugify.ts
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..2cc41d65
--- /dev/null
+++ b/src/components/Editor/TopicSelect/TopicSelect.module.scss
@@ -0,0 +1,13 @@
+.selectedItem {
+ cursor: pointer;
+
+ &.mainTopic {
+ cursor: default;
+ background: #000;
+ color: #ccc;
+
+ + :global(.solid-select-multi-value-remove) {
+ background: #000;
+ }
+ }
+}
diff --git a/src/components/Editor/TopicSelect/TopicSelect.tsx b/src/components/Editor/TopicSelect/TopicSelect.tsx
index 924a4e40..b84984aa 100644
--- a/src/components/Editor/TopicSelect/TopicSelect.tsx
+++ b/src/components/Editor/TopicSelect/TopicSelect.tsx
@@ -3,32 +3,73 @@ 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'
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 (
+ handleSelectedItemClick(item)}
+ >
+ {item.title}
+
+ )
+ }
+
return (
*/}
-
+ }
+ >
}>
diff --git a/src/utils/slugify.ts b/src/utils/slugify.ts
new file mode 100644
index 00000000..5edb0c94
--- /dev/null
+++ b/src/utils/slugify.ts
@@ -0,0 +1,7 @@
+import { translit } from './ru2en'
+
+export const slugify = (text) => {
+ return translit(text.toLowerCase())
+ .replaceAll(/[^\da-z]/g, '')
+ .replaceAll(' ', '-')
+}