diff --git a/src/components/tabitems/template/CreateTemplateByCss.tsx b/src/components/tabitems/template/CreateTemplateByCss.tsx index 6856979..fc0f3e8 100644 --- a/src/components/tabitems/template/CreateTemplateByCss.tsx +++ b/src/components/tabitems/template/CreateTemplateByCss.tsx @@ -1,12 +1,19 @@ import styled from 'styled-components'; import React, { useContext, useEffect, useState } from 'react'; -import { Button, Input, Modal, Select } from 'antd'; +import { Button, Input, List, Modal, Select, Typography, message } from 'antd'; +import { EditOutlined, DeleteOutlined } from '@ant-design/icons'; + import Section from '../common/Section'; import SubTitle from '../common/SubTitle'; -import { saveUserTemplates } from '../../../features/userTemplates'; +import { + deleteUserTemplates, + saveUserTemplates, + templateStyleToCssText, +} from '../../../features/userTemplates'; import { PropsContext } from '../../../contexts/PropsContext'; import type { SelectProps } from 'antd'; import t from '../../../features/translator'; +import { Template } from '../../../types/Template'; export const CreateTemplateByCss = () => { const Description = styled.p` font-size: 10pt; @@ -33,48 +40,135 @@ export const CreateTemplateByCss = () => { { value: 'h3', label: 'h3' }, ]; - const [isModalOpen, setIsModalOpen] = useState(false); + const [messageApi, contextHolder] = message.useMessage(); + + const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); + const [isEditModalOpen, setIsEditModalOpen] = useState(false); + + // テンプレートの作成 + const onCreateOk = async () => { + if (css === '') { + alert('CSSを入力してください'); + return; + } + if (templateName === '') { + alert('テンプレート名を入力してください'); + return; + } + const templates = prop.userTemplates; + if (templates.findIndex((t) => t.name === templateName) > -1) { + const ok = confirm( + '同じ名前のテンプレートが存在します。上書きしますか?', + ); + if (!ok) { + return; + } + } + if (templateName) { + try { + await saveUserTemplates(css, templateName, tags, prop); + setIsCreateModalOpen(false); + messageApi.open({ + type: 'success', + content: 'テンプレートを作成しました', + duration: 5, + }); + } catch (e) { + alert(e); + } + } + }; + + // テンプレートの編集 + const edit = (template: Template) => { + setTemplateName(template.name); + setTags(template.tags); + setCss(templateStyleToCssText(template.styles)); + setIsEditModalOpen(true); + }; + + const onEditOk = async () => { + try { + await saveUserTemplates(css, templateName, tags, prop); + setIsEditModalOpen(false); + messageApi.open({ + type: 'success', + content: 'テンプレートを作成しました', + duration: 5, + }); + } catch (e) { + alert(e); + } + }; + + // テンプレートの削除 + const deleteTemplate = async (template: Template) => { + const ok = confirm('テンプレートを削除しますか?'); + if (ok) { + await deleteUserTemplates(template.name, prop); + } + }; + + const onCancel = () => { + setTemplateName(''); + setCss(''); + setTags([]); + setIsCreateModalOpen(false); + setIsEditModalOpen(false); + }; useEffect(() => { setCss(''); setTemplateName(''); setTags([]); - }, [isModalOpen]); + }, [isCreateModalOpen]); return ( -
- - {'CSSを入力してテンプレートを作成します'} - + <> + {contextHolder} +
+ + CSSを入力してテンプレートを作成します + +
+
+ + ( + + {item.name} +
+
+
+ )} + /> +
{ - if (css === '') { - alert('CSSを入力してください'); - return; - } - if (templateName === '') { - alert('テンプレート名を入力してください'); - return; - } - saveUserTemplates(css, templateName, tags, prop) - .then(() => { - setIsModalOpen(false); - }) - .catch((e) => { - alert(e); - }); - }} - onCancel={() => setIsModalOpen(false)} + open={isCreateModalOpen} + onOk={onCreateOk} + onCancel={onCancel} zIndex={99999} >
@@ -87,7 +181,7 @@ export const CreateTemplateByCss = () => { />
- 対象とする要素のタグ名(入力しない場合は全ての要素に適用されます) + 対象とする要素のタグ名(入力しない場合は全ての要素に適用されます)