SldHomeSetting.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648
  1. /*
  2. * 单图选择器
  3. * */
  4. import React, { Component, Fragment } from 'react';
  5. import { connect } from 'dva';
  6. import {
  7. Form, Select, Icon, Button, Input, Table, Upload, InputNumber, DatePicker, Switch, Radio,
  8. } from 'antd';
  9. import global from '../../global.less';
  10. import {
  11. sldTsvgBotText,
  12. sldBeforeUpload,
  13. sldComLanguage,
  14. getLocalStorageStingVal,
  15. isEmptyObject,
  16. } from '@/utils/utils';
  17. import { diy_link_type, pc_home_modaladv_sele_data } from '@/utils/util_data';
  18. import { apiUrl } from '@/utils/sldconfig.js';
  19. import styles from '@/pages/decorate/pc/pcdecorate.less';
  20. import SldSelGoodsSingleDiy from '@/components/SldSelGoodsSingleDiy';
  21. import { Scrollbars } from 'react-custom-scrollbars';
  22. const FormItem = Form.Item;
  23. const Option = Select.Option;
  24. const RadioGroup = Radio.Group;
  25. const { RangePicker } = DatePicker;
  26. let sthis = '';
  27. @connect(({ product, global }) => ({
  28. product, global,
  29. }))
  30. @Form.create()
  31. export default class SldHomeSetting extends Component {
  32. constructor(props) {
  33. super(props);
  34. sthis = this;
  35. const {
  36. form: { getFieldDecorator },
  37. } = props;
  38. this.state = {
  39. source: '',//来源,主要处理特殊数据用
  40. link_type: '',//当前链接的操作类型
  41. img_width: 150,//图片的宽度
  42. img_height: 150,//图片的高度
  43. sele_index: 0,//当前选中的index
  44. selectedRowKeys: [],
  45. cur_data: [],//当前
  46. modal_tip: [],//弹框提示内容
  47. data: [{
  48. key: 'img',
  49. name: '',
  50. value: 'https://img.alicdn.com/simba/img/TB1jsBeKYPpK1RjSZFFSuu5PpXa.jpg',
  51. imgPath: '/images/brand/3e56e20d-453d-4cf8-906f-a928de37ce6a.png',
  52. type: 'img',
  53. required: true,
  54. }, {
  55. key: 'link_type',
  56. name: `${sldComLanguage('操作')}`
  57. ,
  58. value: '',
  59. type: 'link_type',
  60. },
  61. ],//数据
  62. columns: [{
  63. align: 'right',
  64. width: 150,
  65. dataIndex: 'name',
  66. render: (text, record) => {
  67. return <div>
  68. <span className={styles.table_left_con}>{text}</span>
  69. {record.required != undefined && record.required &&
  70. <span className={styles.table_left_require}>*</span>
  71. }
  72. </div>;
  73. },
  74. }, {
  75. align: 'left',
  76. dataIndex: 'type',
  77. render: (text, record) => {
  78. let content = '';
  79. if (record.type == 'img') {
  80. content = <div className={styles.modal_img}>
  81. <div className={styles.adv_01_img_thumb} style={{
  82. width: this.state.img_width * 0.5 > 800 ? 800 : this.state.img_width * 0.5,
  83. height: this.state.img_height == 0 ? 'auto' : (this.state.img_width * 0.5 > 800 ? (800 * this.state.img_height / this.state.img_width) : this.state.img_height * 0.5),
  84. }}>
  85. {record.value != ''
  86. ? <img className={styles.adv_01_img} src={record.value}/>
  87. : sldTsvgBotText('kehubiaoqian', '', 0, '', '', '#999', 30, 30, '#999')
  88. }
  89. </div>
  90. <span
  91. className={styles.modal_tip_color}>{sldComLanguage('此处要求宽度为')}{this.state.img_width}{sldComLanguage('像素、高度')}{this.state.img_height == 0 ? `${sldComLanguage('不限制')}` : this.state.img_height + `${sldComLanguage('像素')}`}{sldComLanguage('的图片;支持格式gif,jpg,png。')}</span>
  92. <Upload
  93. beforeUpload={sldBeforeUpload}
  94. withCredentials={true}
  95. accept={'.gif, .jpeg, .png,.jpg,'}
  96. showUploadList={false}
  97. name={'file'}
  98. action={`${apiUrl}v3/oss/common/upload?source=adminDeco`}
  99. onChange={(info) => this.setImg(info)}
  100. headers={{
  101. Authorization: 'Bearer ' + getLocalStorageStingVal('sld_token')
  102. }}
  103. >
  104. <Button>
  105. <Icon type="upload"/> {sldComLanguage('上传图片')}
  106. </Button>
  107. </Upload>
  108. </div>;
  109. } else if (record.type == 'link_type') {
  110. content = <div>
  111. <Select
  112. value={record.value}
  113. style={{ width: 120 }}
  114. placeholder={`${sldComLanguage('请选择链接类型')}`}
  115. onSelect={this.sldHandSeleChange}
  116. getPopupContainer={triggerNode => triggerNode.parentNode}
  117. >
  118. {diy_link_type().map((item, index) =>
  119. <Option key={index} value={item.key}>{item.name}</Option>,
  120. )}
  121. </Select>
  122. </div>;
  123. } else if (record.type == 'url') {
  124. content = <FormItem
  125. style={{ width: 300 }}
  126. >
  127. {getFieldDecorator(`link_type`, {
  128. initialValue: record.value, rules: [{
  129. required: true,
  130. whitespace: true,
  131. message: `${sldComLanguage('请输入链接地址')}`
  132. ,
  133. }],
  134. })(
  135. <Input
  136. maxLength={250}
  137. style={{ width: 300 }}
  138. onChange={e => this.handleFieldChange(e, 'url', 'link_value')}
  139. placeholder={`${sldComLanguage('请输入链接地址')}`
  140. }/>,
  141. )}
  142. </FormItem>;
  143. } else if (record.type == 'keyword') {
  144. content = <FormItem
  145. style={{ width: 300 }}
  146. >
  147. {getFieldDecorator(`keyword`, {
  148. initialValue: record.value, rules: [{
  149. required: true,
  150. whitespace: true,
  151. message: `${sldComLanguage('请输入关键字')}`
  152. ,
  153. }],
  154. })(
  155. <Input
  156. maxLength={250}
  157. style={{ width: 300 }}
  158. onChange={e => this.handleFieldChange(e, 'keyword', 'link_value')}
  159. placeholder={`${sldComLanguage('请输入关键字')}`
  160. }/>,
  161. )}
  162. </FormItem>;
  163. } else if (record.type == 'goods' || record.type == 'category' || record.type == 'topic') {
  164. content = <div>
  165. <span>{record.value}</span>
  166. </div>;
  167. }
  168. if (this.state.source != undefined) {
  169. //首页开屏图数据处理
  170. if (this.state.source == 'home_modal_adv') {
  171. if (record.type == 'home_modal_adv_switch') {
  172. //弹出广告开关
  173. content = <FormItem
  174. style={{ width: 300 }}
  175. >
  176. {getFieldDecorator(`${record.type}`, {
  177. valuePropName: 'checked',
  178. initialValue: record.value,
  179. })(
  180. <Switch/>,
  181. )}
  182. </FormItem>;
  183. } else if (record.type == 'home_modal_adv_radio') {
  184. //弹出方式
  185. content = <FormItem
  186. style={{ width: 300 }}
  187. >
  188. {getFieldDecorator(`${record.type}`, {
  189. valuePropName: 'checked',
  190. initialValue: record.value,
  191. })(
  192. <RadioGroup options={pc_home_modaladv_sele_data()} defaultValue={record.value}/>,
  193. )}
  194. </FormItem>;
  195. }
  196. }
  197. //首页轮播图数据处理
  198. if (this.state.source == 'home_flash') {
  199. if (record.type == 'home_flash_title') {
  200. //标题
  201. content = <FormItem
  202. style={{ width: 300 }}
  203. >
  204. {getFieldDecorator(`home_flash_title`, {
  205. initialValue: record.value, rules: [{
  206. required: true,
  207. whitespace: true,
  208. message: `${sldComLanguage('请输入标题')}`
  209. ,
  210. }],
  211. })(
  212. <Input
  213. maxLength={250}
  214. style={{ width: 300 }}
  215. onChange={e => this.handleFieldChange(e, 'home_flash_title', 'home_flash_title')}
  216. placeholder={`${sldComLanguage('请输入标题')}`
  217. }/>,
  218. )}
  219. </FormItem>;
  220. } else if (record.type == 'home_flash_sort') {
  221. //排序
  222. content = <FormItem
  223. style={{ width: 300 }}
  224. >
  225. {getFieldDecorator(`home_flash_sort`, {
  226. initialValue: record.value, rules: [{
  227. required: true,
  228. message: `${sldComLanguage('请输入排序')}`
  229. ,
  230. }],
  231. })(
  232. <InputNumber
  233. min={0}
  234. style={{ width: 300 }}
  235. onChange={e => this.handleFieldChange(e, 'home_flash_sort', 'home_flash_sort', 'inputnum')}
  236. placeholder={`${sldComLanguage('请输入排序')}`
  237. }/>,
  238. )}
  239. </FormItem>;
  240. } else if (record.type == 'home_flash_range_picker') {
  241. //展示时间
  242. content = <FormItem
  243. style={{ width: 300 }}
  244. >
  245. {getFieldDecorator(`home_flash_range_picker`, {
  246. initialValue: record.value,
  247. // rules:[{
  248. // required: true,
  249. // whitespace: true,
  250. // message: "请选择展示时间",
  251. // }]
  252. })(
  253. <RangePicker
  254. style={{ width: 300 }}
  255. placeholder={[`${sldComLanguage('开始时间')}`
  256. , `${sldComLanguage('结束时间')}`
  257. ,
  258. ]}
  259. onChange={e => this.handleFieldChange(e, 'home_flash_range_picker', 'home_flash_range_picker', 'range_picker')}
  260. getCalendarContainer={(triggerNode)=>{
  261. return triggerNode.parentNode
  262. }}
  263. />)}
  264. </FormItem>;
  265. }
  266. }
  267. }
  268. return content;
  269. },
  270. }],
  271. };
  272. }
  273. first_flag = false;
  274. componentDidMount() {
  275. this.props.dispatch({
  276. type: 'global/getLayoutCollapsed',
  277. });
  278. }
  279. componentWillReceiveProps(nextProps, nextContext) {
  280. if (!nextProps.modalVisible && !this.props.modalVisible) {
  281. //防止别的模板发生变化,影响数据报错
  282. return false;
  283. }
  284. if (!this.first_flag && !isEmptyObject(nextProps.content)) {
  285. let ope_data = nextProps.content.data;
  286. let tmp_info = [];
  287. tmp_info.push({
  288. key: 'img',
  289. name: `${sldComLanguage('图片')}`
  290. ,
  291. value: ope_data.imgUrl != undefined ? ope_data.imgUrl : '',
  292. imgPath: ope_data.imgPath != undefined ? ope_data.imgPath : '',
  293. type: 'img',
  294. required: true,
  295. });
  296. tmp_info.push({
  297. key: 'link_type',
  298. name: `${sldComLanguage('操作')}`
  299. ,
  300. value: ope_data.link_type,
  301. type: 'link_type',
  302. });
  303. if (ope_data.link_value != undefined && ope_data.link_value) {
  304. let tmp_info_new = {
  305. key: 'link_value',
  306. name: `${sldComLanguage('关键字')}`
  307. ,
  308. value: ope_data.link_value,
  309. type: ope_data.link_type,
  310. info: ope_data.info != undefined ? ope_data.info : {},
  311. required: true,
  312. };
  313. if (ope_data.link_type == 'url') {
  314. tmp_info_new.name = `${sldComLanguage('链接地址')}`
  315. ;
  316. tmp_info_new.required = true;
  317. } else if (ope_data.link_type == 'keyword') {
  318. tmp_info_new.name = `${sldComLanguage('关键字')}`
  319. ;
  320. tmp_info_new.required = true;
  321. } else if (ope_data.link_type == 'goods') {
  322. tmp_info_new.name = `${sldComLanguage('商品名称')}`
  323. ;
  324. tmp_info_new.required = true;
  325. } else if (ope_data.link_type == 'category') {
  326. tmp_info_new.name = `${sldComLanguage('分类名称')}`
  327. ;
  328. tmp_info_new.required = true;
  329. } else if (ope_data.link_type == 'topic') {
  330. tmp_info_new.name = `${sldComLanguage('专题名称')}`
  331. ;
  332. tmp_info_new.required = true;
  333. }
  334. tmp_info.push(tmp_info_new);
  335. }
  336. //首页开屏图单独处理
  337. if (nextProps.content.source != undefined && nextProps.content.source == 'home_modal_adv') {
  338. if (ope_data.show_switch != undefined) {
  339. tmp_info.push({
  340. key: 'home_modal_adv_switch',
  341. type: 'home_modal_adv_switch',
  342. name: `${sldComLanguage('广告开关')}`,
  343. value: ope_data.show_switch,
  344. });
  345. }
  346. if (ope_data.show_radio_sele != undefined) {
  347. tmp_info.push({
  348. key: 'home_modal_adv_radio',
  349. type: 'home_modal_adv_radio',
  350. name: `${sldComLanguage('显示方式')}`,
  351. value: ope_data.show_radio_sele,
  352. });
  353. }
  354. }
  355. //首页轮播图数据单独处理
  356. if (nextProps.content.source != undefined && nextProps.content.source == 'home_flash') {
  357. //显示标题
  358. if (ope_data.show_title != undefined) {
  359. tmp_info.push({
  360. key: 'home_flash_title',
  361. type: 'home_flash_title',
  362. name: `${sldComLanguage('标题')}`
  363. ,
  364. value: ope_data.show_title,
  365. required: true,
  366. });
  367. }
  368. //显示排序
  369. if (ope_data.sort != undefined) {
  370. tmp_info.push({
  371. key: 'home_flash_sort',
  372. type: 'home_flash_sort',
  373. name: `${sldComLanguage('排序')}`
  374. ,
  375. value: ope_data.sort + '',
  376. required: true,
  377. });
  378. }
  379. //显示展示时间
  380. if (ope_data.range_picker != undefined) {
  381. tmp_info.push({
  382. key: 'home_flash_range_picker',
  383. type: 'home_flash_range_picker',
  384. name: `${sldComLanguage('展示时间')}`
  385. ,
  386. value: ope_data.range_picker,
  387. required: true,
  388. });
  389. }
  390. }
  391. this.first_flag = true;
  392. this.setState({
  393. modal_tip: nextProps.modal_tip,
  394. data: tmp_info,
  395. img_width: nextProps.content.width,
  396. img_height: nextProps.content.height,
  397. source: nextProps.content.source != undefined ? nextProps.content.source : '',
  398. });
  399. }
  400. }
  401. //上传图片
  402. setImg = (info) => {
  403. let { data } = this.state;
  404. if (info.file.response != undefined) {
  405. let img_data = info.file.response;
  406. if (info.file.status != undefined && info.file.status != 'error') {
  407. if (img_data.state == 200) {
  408. data.map(item => {
  409. if (item.key == 'img') {
  410. item.value = img_data.data.url;
  411. item.imgPath = img_data.data.path;
  412. }
  413. });
  414. }
  415. }
  416. this.setState({ data });
  417. }
  418. };
  419. //操作类型选择事件
  420. sldHandSeleChange = (val) => {
  421. this.props.form.resetFields();
  422. let { data } = this.state;
  423. let cur_data = [];
  424. for (let i in data) {
  425. if (data[i].key != 'link_value') {
  426. if (data[i].key == 'link_type') {
  427. data[i].value = val;
  428. }
  429. cur_data.push(data[i]);
  430. }
  431. }
  432. for (let i = 0; i < cur_data.length; i++) {
  433. if (cur_data[i].key == 'link_type') {
  434. if (val == 'url') {
  435. cur_data.splice(i + 1, 0, {
  436. key: 'link_value',
  437. name: `${sldComLanguage('链接地址')}`
  438. ,
  439. value: '',
  440. type: 'url',
  441. required: true,
  442. });
  443. } else if (val == 'keyword') {
  444. cur_data.splice(i + 1, 0, {
  445. key: 'link_value',
  446. name: `${sldComLanguage('关键字')}`
  447. ,
  448. value: '',
  449. type: 'keyword',
  450. required: true,
  451. });
  452. } else if (val == 'goods') {
  453. cur_data.splice(i + 1, 0, {
  454. key: 'link_value',
  455. name: `${sldComLanguage('商品名称')}`
  456. ,
  457. value: '',
  458. info: {},
  459. type: 'goods',
  460. required: true,
  461. });
  462. } else if (val == 'category') {
  463. cur_data.splice(i + 1, 0, {
  464. key: 'link_value',
  465. name: `${sldComLanguage('分类名称')}`
  466. ,
  467. value: '',
  468. info: {},
  469. type: 'category',
  470. required: true,
  471. });
  472. } else if (val == 'topic') {
  473. cur_data.splice(i + 1, 0, {
  474. key: 'link_value',
  475. name: `${sldComLanguage('专题名称')}`
  476. ,
  477. value: '',
  478. info: {},
  479. type: 'topic',
  480. required: true,
  481. });
  482. }
  483. }
  484. }
  485. data = cur_data;
  486. this.setState({ data, link_type: val });
  487. };
  488. /*
  489. * input编辑事件 e为组件的值,type为数据的key,key为数据的key,com_type 为组件类型,不同的组件对数据的处理不一样
  490. * com_type为input 则为e.target.value
  491. * com_type为inputnum 则为e
  492. * com_type为range_picker 则为moment对象
  493. * */
  494. handleFieldChange(e, type, key, com_type = '') {
  495. this.first_flag = true;
  496. let { data } = this.state;
  497. for (let i in data) {
  498. if (data[i].key == key) {
  499. let tmp_val = '';
  500. if (com_type == 'inputnum') {
  501. tmp_val = e + '';
  502. } else if (com_type == 'range_picker') {
  503. tmp_val = e;//moment 对象
  504. } else {
  505. tmp_val = e.target.value;
  506. }
  507. data[i].value = tmp_val;
  508. }
  509. }
  510. this.setState({ data });
  511. }
  512. //确定事件
  513. sldConfirm = (e) => {
  514. this.props.form.validateFieldsAndScroll((err, values) => {
  515. if (!err) {
  516. //将数据组装,返回给上级页面
  517. const { data, source } = this.state;
  518. let tmp_info = {};
  519. for (let i in data) {
  520. if (data[i].key == 'img') {
  521. tmp_info.imgUrl = data[i].value;
  522. tmp_info.imgPath = data[i].imgPath;
  523. } else if (data[i].key == 'link_type') {
  524. tmp_info.link_type = data[i].value;
  525. tmp_info.link_value = '';
  526. tmp_info.info = {};
  527. } else if (data[i].key == 'link_value') {
  528. tmp_info.link_type = data[i].type;
  529. tmp_info.link_value = data[i].value;
  530. tmp_info.info = data[i].info;
  531. }
  532. if (source != undefined) {
  533. //首页轮播图数据处理
  534. if (source == 'home_flash') {
  535. tmp_info.show_title = values.home_flash_title;
  536. tmp_info.sort = values.home_flash_sort;
  537. tmp_info.range_picker = values.home_flash_range_picker;
  538. }
  539. //首页开屏图数据处理
  540. if (source == 'home_modal_adv') {
  541. tmp_info.show_switch = values.home_modal_adv_switch;
  542. tmp_info.show_radio_sele = values.home_modal_adv_radio;
  543. }
  544. }
  545. }
  546. this.props.sldHandleConfirm(tmp_info);
  547. this.sldCancle();
  548. }
  549. });
  550. };
  551. //取消事件-清空表单
  552. sldCancle = () => {
  553. this.first_flag = false;
  554. this.props.form.resetFields();
  555. this.props.sldHandleCancle();
  556. };
  557. //关闭modal之后重置数据
  558. closeReset = () => {
  559. this.props.form.resetFields();
  560. };
  561. //选择商品或者分类取消事件
  562. sldHandleLinkCancle = () => {
  563. let { data } = this.state;
  564. let cur_data = [];
  565. for (let i in data) {
  566. if (data[i].key != 'link_value') {
  567. if (data[i].key == 'link_type') {
  568. data[i].value = '';
  569. }
  570. cur_data.push(data[i]);
  571. }
  572. }
  573. data = cur_data;
  574. this.setState({ data, link_type: '' });
  575. };
  576. //商品或分类选中事件
  577. seleSku = (val) => {
  578. let { data } = this.state;
  579. data.map(item => {
  580. if (item.type == 'goods') {
  581. item.value = val.goodsName;
  582. item.info = val;
  583. } else if (item.type == 'category') {
  584. item.value = val.categoryName;
  585. item.info = val;
  586. } else if (item.type == 'topic') {
  587. item.value = val.decoName;
  588. item.info = val;
  589. }
  590. });
  591. this.setState({ data, link_type: '' });
  592. };
  593. render() {
  594. const { data, columns, link_type } = this.state;
  595. return <Fragment>
  596. <Form
  597. layout="horizontal"
  598. onSubmit={(e) => this.sldConfirm(e)}
  599. >
  600. <Scrollbars
  601. autoHeight
  602. autoHeightMin={50}
  603. autoHeightMax={document.body.clientHeight - 340}>
  604. <Table
  605. showHeader={false}
  606. columns={columns}
  607. dataSource={data}
  608. bordered
  609. pagination={false}
  610. />
  611. </Scrollbars>
  612. <div className={global.m_diy_bottom_wrap}
  613. style={{ position: 'fixed', left: this.props.global.collapsed ? 90 : 160 }}>
  614. <Button className={global.btn_fixed_bottom} key="submit" style={{
  615. width: 80, height: 32, borderRadius: 3,
  616. }}
  617. type="primary" loading={this.props.submiting}
  618. onClick={this.sldConfirm}>
  619. {sldComLanguage('保存')}
  620. </Button>
  621. </div>
  622. </Form>
  623. <SldSelGoodsSingleDiy link_type={link_type} seleSku={this.seleSku} sldHandleCancle={this.sldHandleLinkCancle}/>
  624. </Fragment>;
  625. }
  626. }