123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402 |
- import React, { useEffect, useState, useRef } from 'react';
- import {
- ProForm,
- ProFormText,
- ProFormUploadButton,
- ProFormSelect,
- ProFormDatePicker,
- ProFormRadio
- } from '@ant-design/pro-components';
- import { Form, Modal, Drawer, message, Upload, Space, Button, Switch,Input,Tooltip } from 'antd';
- import {InfoCircleOutlined} from '@ant-design/icons';
-
- import { useIntl, FormattedMessage } from '@umijs/max';
- import { DictValueEnumObj } from '@/components/DictTag';
- import Editor from '@/components/ueditor';
- import { upload } from '@/services/news/news';
- import { getDataEnumList } from '@/services/system/Enum';
- import Quill from "quill";
- import "quill/dist/quill.snow.css";
- import moment from 'moment';
- import { trim } from 'lodash';
- let editor: any;
-
- export type NewsProps = {
- onCancel: (flag?: boolean, formVals?: any) => void;
- onSubmit: (values: any) => Promise<void>;
- open: boolean;
- currentRow: any;
- date: any;
- title: string;
- content: string;
- surface: string;
- surfaceUrl: string;
- };
-
- let toolbarOptions = [
- ['bold', 'italic', 'underline', 'strike'], // 切换按钮
- ['blockquote', 'code-block'],
- ['link', 'image'],
-
-
- [{ 'header': 1 }, { 'header': 2 }], // 用户自定义按钮值
- [{ 'list': 'ordered' }, { 'list': 'bullet' }],
- [{ 'script': 'sub' }, { 'script': 'super' }], // 上标/下标
- [{ 'indent': '-1' }, { 'indent': '+1' }], // 减少缩进/缩进
- [{ 'direction': 'rtl' }], // 文本下划线
-
-
- [{ 'size': ['small', false, 'large', 'huge'] }], // 用户自定义下拉
- [{ 'header': [1, 2, 3, 4, 5, 6, false] }],
-
-
- [{ 'color': [] }, { 'background': [] }], // 主题默认下拉,使用主题提供的值
- [{ 'font': [] }],
- [{ 'align': [] }],
- // [{ 'wordBox': ['20px', '22px', '24px', '26px', '28px', '28px', '30px'] }],
- [{ wordBox: ['20px', '22px', '24px', '26px', '28px', '30px', '32px', '34px', '36px', '38px', '40px', '42px', '44px'] }],
- ['clean'], // 清除格式
-
- ];
-
- function image(){
- var _this3 = this;
-
- var fileInput = this.container.querySelector('input.ql-image[type=file]');
- fileInput = null
- if (fileInput == null) {
- fileInput = document.createElement('input');
- fileInput.setAttribute('type', 'file');
- fileInput.setAttribute('accept', 'image/png, image/gif, image/jpeg, image/bmp, image/x-icon');
- fileInput.classList.add('ql-image');
- fileInput.addEventListener('change', async function () {
- if (fileInput.files != null && fileInput.files[0] != null) {
- let index = editor.getSelection() && editor.getSelection().index ? editor.getSelection().index : 0;
-
- let file = fileInput.files[0]
- const formData = new FormData();
- formData.append('file', file, file.name);
- const res = await upload(formData)
- editor.insertEmbed(index, 'image', res.data.url);
- var reader = new FileReader();
- reader.onload = function (e) {
- fileInput.value = "";
- };
-
- }
- });
- this.container.appendChild(fileInput);
- }
- fileInput.click();
- }
- const NewsForm: React.FC<NewsProps> = (props) => {
-
- const [form] = Form.useForm();
- const intl = useIntl();
- let editorRef = useRef<HTMLDivElement>(null)
-
- useEffect(() => {
- form.resetFields();
- if(!props.open) return;
- // const { title, content, surface, surfaceUrl, date } = props;
- if(!props.currentRow) return;
- const { digest, top,key,content,surface,surfaceUrl,date,title,source} = props.currentRow;
- if (props.currentRow) {
- form.setFieldsValue({
- digest,
- top,
- key
- })
- // if (top) {
- // setCheckTop(1)
- // } else {
- // setCheckTop(0)
- // }
- }
-
- setSurface(surface)
- form.setFieldsValue({
- title: title,
- date: date,
- })
- if (surfaceUrl && surface) {
- setFileList([
- {
- uid: surface,
- thumbUrl: surfaceUrl
- }
- ])
- }
- if (editorRef && editorRef.current && editorRef.current.children[0]) {
- editorRef.current.children[0].innerHTML = content
- }
-
- }, [props.open]);
-
- useEffect(() => {
- var Parchment = Quill.import('parchment');
-
- let config = {
- scope: Parchment.Scope.INLINE,
- // 会有下拉框列表
- whitelist: ['20px', '22px', '24px', '26px', '28px', '30px', '32px', '34px', '36px', '38px', '40px', '42px', '44px']
- //可设置成没有下拉框的,但会导致无法清除样式
- // whitelist: ['1px solid #000000']
- };
-
- let wordBox = new Parchment.Attributor.Style('wordBox', 'line-height', config);
-
- Quill.register(wordBox, true);
- editor = new Quill('#editor', {
- modules: {
- toolbar: toolbarOptions,
- clipboard: {
- dangerouslyPasteHTML: true
- }
- },
- theme: 'snow'
- });
-
- // 工具栏附件按钮
- let a = document.querySelectorAll(".ql-wordBox")[0]
- let b = document.querySelectorAll(".ql-wordBox")[1]
- //添加默认显示内容
- let stit = document.createElement('span')
- stit.innerHTML = intl.formatMessage({ id: 'public.lineSpacing' });
- stit.setAttribute('style', 'margin-right:20px;line-height: 24px;')
- a.children[0].insertBefore(stit, a.children[0].children[0])
-
- // 遍历下拉框列表添加值
- let i = a.children[1].children.length
- while (i) {
- i--;
- let item = a.children[1].children[i]
- item.innerHTML = item.dataset.value ? item.dataset.value : '无'
- }
-
- // console.log('editor', editor)
- var toolbar = editor.getModule('toolbar');
-
- toolbar.image2 = image
- // console.log("toolbar.handlers.image", toolbar.handlers.image)
- toolbar.addHandler('image', (e) => {
- toolbar.image2()
- //
-
- });
-
- // toolbar.addHandler('wordBox', (e) => {
- // console.log('e-----++++', e)
- // //
-
- // });
-
- }, []);
-
-
- const [fileList, setFileList] = useState<any>([]);
- const [surface, setSurface] = useState<any>('');
-
- const [checkTop, setCheckTop] = useState<any>('')
- const handleOk = async () => {
- let data = form.getFieldsValue()
- let val = await form.validateFields()
-
- let htmlStr = editorRef.current?.children[0].innerHTML
-
- htmlStr = htmlStr?.replaceAll('"', "'")
- let content = editor.getContents()
- // console.log('htmlStr----', htmlStr)
- editor.setContents(content)
- data.date = moment(data.date).format('YYYY.MM.DD');
- if(checkTop){
- data.top = 1;
- }else{
- data.top = 0;
- }
- // data.top = checkTop;
- let formData = {
- ...data,
- surface,
- content: htmlStr
- }
- form.setFieldsValue({
- title: '',
- digest: ""
- })
- setFileList([]);
- setCheckTop(false)
- editor.clipboard.dangerouslyPasteHTML(0, '')
- editor.setContents([])
- props.onSubmit(formData);
- };
- const handleCancel = () => {
- form.setFieldsValue({
- title: '',
- digest: "",
- top: ""
- })
- setFileList([]);
- setCheckTop(false)
- editor.clipboard.dangerouslyPasteHTML(0, '')
- editor.setContents([])
- props.onCancel();
-
- };
-
- const handleChange = async (res) => {
- const { fileList } = res;
- setFileList(fileList);
- };
-
- const handleBeforeUpload = async (file: RcFile) => {
- const formData = new FormData();
- formData.append('file', file, file.name);
- const res = await upload(formData);
- if (res?.data?.uuid) {
- setSurface(res.data.uuid)
- }
- return false;
- };
-
-
- return (
- <Drawer
- width={'80%'}
- title={props.currentRow ? '新闻编辑' : '新建新闻'}
- forceRender
- open={props.open}
- destroyOnClose
- onClose={handleCancel}
- extra={
- <Space>
- <Button onClick={handleCancel}>取消</Button>
- <Button type="primary" onClick={handleOk}>确认</Button>
- </Space>
- }
- >
- <ProForm
- form={form}
- grid={true}
- submitter={false}
- layout="horizontal"
- >
- <ProFormText
- name="title"
- label='标题'
- labelCol={{
- style: { width: 95 }
- }}
- placeholder='请输入标题'
- rules={[
- {
- required: true,
- message: '请输入标题!',
- },
- ]}
- />
- <ProForm.Item
- label={'封面图'}
- extra={'图片尺寸1218*915'}
- labelCol={{
- style: { width: 95 }
- }}
- rules={[
- {
- required: true
- }
- ]
- }
- >
- <Upload
- listType="picture-card" // 设置为图片卡片模式
- fileList={fileList}
- maxCount={1}
- onChange={handleChange}
- beforeUpload={handleBeforeUpload}
- >
- {fileList?.length < 1 && '+' + intl.formatMessage({ id: 'public.uploadImg' })}
- </Upload>
- </ProForm.Item>
- <ProFormDatePicker
- name="date"
- label='日期'
- fieldProps={{
- format: (value) => value.format('YYYY.MM.DD'),
- }}
- labelCol={{
- style: { width: 95 }
- }}
- rules={[
- {
- required: true
- }
- ]
- }
- />
-
- <ProFormSelect
- name="column"
- key="column"
- label='新闻分类'
- request={() =>
- getDataEnumList({enumUuid: '2024810214616101'}).then((res) => {
- let tList = []
- res.rows.forEach(item => {
- tList.push({
- label: item.dataName,
- value: item.uuid,
- })
- })
- return tList;
- })
-
- }
- labelCol={{
- style: { width: 95 }
- }}
- placeholder={'请选择新闻分类'}
-
- />
- <ProFormText
- name="digest"
- label='摘要'
- labelCol={{
- style: { width: 95 }
- }}
- placeholder={'请输入摘要'}
- />
-
- <ProFormText
- name="key"
- label='网页关键字'
- labelCol={{
- style: { width: 95 }
- }}
- placeholder={'请输入页面关键字'}
- />
-
- <ProFormText
- name="source"
- label='来源'
- labelCol={{
- style: { width: 95 }
- }}
- placeholder={'中泽集团'}
- initialValue={'中泽集团'}
- />
-
- <ProForm.Item
- label={'新闻内容'}
- labelCol={{
- style: { width: 95 }
- }}
- >
- <div id='editor' style={{ width: '70vw', height: '500px' }} ref={editorRef}></div>
- </ProForm.Item>
- </ProForm>
- </Drawer>
- );
- };
-
- export default NewsForm;
|