index.js 93 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274
  1. import React, { Component, Fragment } from 'react';
  2. import {
  3. Form,
  4. Select,
  5. Radio,
  6. Input,
  7. Slider,
  8. Upload,
  9. Button,
  10. Icon,
  11. } from 'antd';
  12. import global from '@/global.less';
  13. import {
  14. sldTsvg,
  15. sldBeforeUpload,
  16. failTip,
  17. sldSvgIcon,
  18. getLocalStorageStingVal,
  19. quillEscapeToHtml,
  20. } from '@/utils/utils';
  21. import SldSelGoodsSingleDiy from '@/components/spreader/SldSelGoodsSingleDiy';
  22. import {
  23. m_diy_spreader_link_type,
  24. sld_m_diy_tpzh_style,
  25. sld_com_empty_arrar_2,
  26. sld_com_empty_arrar_3,
  27. sld_com_empty_arrar_4,
  28. sld_com_empty_arrar_5,
  29. sld_m_diy_svideo_style,
  30. sld_m_diy_live_style,
  31. sld_m_diy_activity_style,
  32. sld_m_diy_notice_style,
  33. } from '@/utils/util_data';
  34. import { SketchPicker } from 'react-color';
  35. import styles from './index.less';
  36. import { connect } from 'dva';
  37. import { apiUrl } from '@/utils/sldconfig.js';
  38. import SldSelMoreLeftRightGoods from '@/components/spreader/SldSelMoreLeftRightGoods';
  39. import SldReactQuill from '@/components/SldReactQuill';
  40. import ALibbSvg from '@/components/ALibbSvg';
  41. import defaultSettings from '@/defaultSettings';
  42. const FormItem = Form.Item;
  43. const Option = Select.Option;
  44. const formItemLayoutModal = {
  45. labelCol: {
  46. span: 2,
  47. },
  48. wrapperCol: {
  49. span: 18,
  50. },
  51. };
  52. //设置富文本可以有的内容
  53. const toolbarOptions = [
  54. ['bold', 'italic', 'underline', 'strike'], // toggled buttons
  55. [{'header': 1}, {'header': 2}], // custom button values
  56. [{'list': 'ordered'}, {'list': 'bullet'}],
  57. [{'script': 'sub'}, {'script': 'super'}], // superscript/subscript
  58. [{'indent': '-1'}, {'indent': '+1'}], // outdent/indent
  59. [{'direction': 'rtl'}], // text direction
  60. [{'size': ['small', false, 'large', 'huge']}], // custom dropdown
  61. [{'header': [1, 2, 3, 4, 5, 6, false]}],
  62. [{'color': ['#000','#e60000','#ff9900','#ffff00','#008a00','#0066cc','#9933ff','#fff','#facccc','#ffebcc','#ffffcc','#cce8cc','#cce0f5','#ebd6ff','#bbbbbb','#f06666','#ffc266','#ffff66','#66b966','#66a3e0','#c285ff','#888888','#a10000','#b26b00','#b2b200','#006100','#0047b2','#6b24b2','#444444','#5c0000','#663d00','#666600','#003700','#002966','#3d1466']}, {'background': []}], // dropdown with defaults from theme
  63. [{'font': []}],
  64. [{'align': []}],
  65. ['clean'] // remove formatting button
  66. ];
  67. @connect(({ mdecorate, pc_home }) => ({
  68. mdecorate,
  69. pc_home,
  70. }))
  71. @Form.create()
  72. export default class MDiyItem extends Component {
  73. state = {
  74. showColorPicker: false,//是否展示颜色选择器,默认不展示
  75. showColorPicker2: false,//是否展示颜色选择器,默认不展示
  76. link_type: '',//链接选择的类型,用于选择商品/分类/专题
  77. modalSpuShow: false,//是否展示商品多选modal框,默认不显示
  78. modalVisible: false,//是否展示短视频多选modal框,默认不显示
  79. modalVisibleLive: false,//是否展示直播多选modal框,默认不显示
  80. modalVisibleGoods: false,//是否展示商品多选modal框,默认不显示
  81. modalVisibleActivityGoods: false,//是否展示促销商品多选modal框,默认不显示
  82. activityType: '',//促销互动类型
  83. sle_more_title: '',//多选组件title
  84. };
  85. componentDidMount() {
  86. }
  87. componentWillReceiveProps(nextProps, nextContext) {
  88. if (nextProps.isReset != undefined && nextProps.isReset) {
  89. this.props.form.resetFields();
  90. }
  91. }
  92. sele_more_svideo = {
  93. info: [],//选择的短视频数组
  94. ids: [],//选择的短视频id数组
  95. min_num: 1,//最小数量,0为不限制
  96. max_num: 30,//最多选择30个
  97. };
  98. sele_more_live = {
  99. info: [],//选择的直播数组
  100. ids: [],//选择的直播id数组
  101. min_num: 1,//最小数量,0为不限制
  102. max_num: 30,//最多选择30个
  103. };
  104. sele_more_goods = {
  105. info: [],//选择的商品数组
  106. ids: [],//选择的商品id数组
  107. min_num: 3,//最小数量,0为不限制
  108. max_num: 9,//最多选择30个
  109. };
  110. oprate_more_tab_index = 0;//TAB切换当前操作的数据index
  111. //是否显示取色器
  112. showColorPicker = (type, flag) => {
  113. this.setState({
  114. [type]: flag,
  115. });
  116. };
  117. //slodon_获取富文本返回的内容
  118. handleGetContent = (val, type) => {
  119. this.onChange(val, type);
  120. };
  121. //图片组合选择样式事件
  122. handleTuPianZuHeStyle = (val) => {
  123. let { select_data } = this.props;
  124. //图片组合里面如果是选择了图片的展现形式,需要重新组装数据
  125. let tmp_data = [];
  126. if (val == 0) {
  127. tmp_data = sld_com_empty_arrar_2;
  128. } else if (val == 1) {
  129. tmp_data = sld_com_empty_arrar_2;
  130. } else if (val == 2) {
  131. tmp_data = sld_com_empty_arrar_2;
  132. } else if (val == 3) {
  133. tmp_data = sld_com_empty_arrar_3;
  134. } else if (val == 4) {
  135. tmp_data = sld_com_empty_arrar_3;
  136. } else if (val == 5) {
  137. tmp_data = sld_com_empty_arrar_4;
  138. } else if (val == 6) {
  139. tmp_data = sld_com_empty_arrar_4;
  140. } else if (val == 7) {
  141. tmp_data = sld_com_empty_arrar_5;
  142. } else if (val == 8) {
  143. tmp_data = sld_com_empty_arrar_4;
  144. }
  145. select_data.data = [];
  146. if(val<8){
  147. for (let i in tmp_data) {
  148. select_data.data.push({
  149. img: '',
  150. img_path: '',
  151. title: '',
  152. url: '',
  153. url_type: '',
  154. info: '',
  155. width: '100%',
  156. height: 150,
  157. });
  158. }
  159. }else{
  160. for (let i in sld_com_empty_arrar_4) {
  161. let temp = []
  162. for(let j in sld_com_empty_arrar_2){
  163. temp.push({
  164. img: '',
  165. img_path: '',
  166. name: '',
  167. url: '',
  168. url_type: '',
  169. info: '',
  170. });
  171. }
  172. select_data.data.push({
  173. main_title: '',
  174. sub_title: '',
  175. url: '',
  176. url_type: '',
  177. info: '',
  178. img:temp
  179. });
  180. }
  181. }
  182. select_data.sele_style = val;
  183. this.props.handleCurSelData(select_data);
  184. };
  185. //短视频展示风格选择事件
  186. handleVideoStyle = (val) => {
  187. let { select_data } = this.props;
  188. select_data.show_style = val;
  189. //清空选择的商品
  190. this.sele_more_svideo.ids = [];
  191. this.sele_more_svideo.info = [];
  192. select_data.data.ids = [];
  193. select_data.data.info = [];
  194. this.props.handleCurSelData(select_data);
  195. };
  196. //公告展示风格选择事件
  197. handleNoticeStyle = (val) => {
  198. let { select_data } = this.props;
  199. select_data.show_style = val;
  200. this.props.handleCurSelData(select_data);
  201. };
  202. //直播展示风格选择事件
  203. handleLiveStyle = (val) => {
  204. let { select_data } = this.props;
  205. select_data.show_style = val;
  206. //清空选择的商品
  207. this.sele_more_live.ids = [];
  208. this.sele_more_live.info = [];
  209. select_data.data.ids = [];
  210. select_data.data.info = [];
  211. this.props.handleCurSelData(select_data);
  212. };
  213. //活动组活动类型选择事件
  214. handleActivityStyle = (val) => {
  215. let { select_data } = this.props;
  216. select_data.show_style = val;
  217. //清空选择的商品
  218. this.sele_more_goods.ids = [];
  219. this.sele_more_goods.info = [];
  220. select_data.data.ids = [];
  221. select_data.data.info = [];
  222. select_data.border_radius = 8;
  223. select_data.bg_color = '#fff';
  224. select_data.tag_bg_color = '#FF5C00';
  225. select_data.title = '';
  226. select_data.sub_title = '';
  227. this.props.handleCurSelData(select_data);
  228. };
  229. /*
  230. * 输入框内容更改事件
  231. * val组件传回来的值,
  232. * type 修改值对应的键名
  233. * index 多个数据的序号,主要用于轮播/导航/图片组合
  234. * parent_index 父级的index。默认为-1
  235. * */
  236. onChange = (val, type, tar_index = 0,parent_index=-1) => {
  237. let { select_data } = this.props;
  238. if ((select_data.type == 'lunbo') || (select_data.type == 'nav' && (type != 'icon_set' && type != 'style_set' && type != 'slide')) || select_data.type == 'tupianzuhe' || (select_data.type == 'more_tab' && type != 'border_radius')||(select_data.type == 'top_cat_nav' && type != 'swiper_bg_style')) {
  239. if (select_data.type == 'more_tab') {
  240. if (type == 'data_type') {
  241. //TAB切换数据类型的时候需要清空商品信息
  242. this.saveCurSelData([], 'info', tar_index, 'more');
  243. this.saveCurSelData([], 'ids', tar_index, 'more');
  244. }
  245. }
  246. this.saveCurSelData(val, type, tar_index, 'more',parent_index);
  247. return false;
  248. }
  249. if (select_data.type == 'fzx' || select_data.type == 'fzkb' || select_data.type == 'fuwenben' || select_data.type == 'dapei' || select_data.type == 'tuijianshangpin' || select_data.type == 'kefu' || select_data.type == 'gonggao' || (select_data.type == 'nav' && (type == 'icon_set' || type == 'style_set' || type == 'slide')) || (select_data.type == 'tupianzuhe' && type == 'sele_style') || select_data.type == 'svideo' || select_data.type == 'live' || (select_data.type == 'more_tab' && type == 'border_radius') || select_data.type == 'activity'||(select_data.type == 'top_cat_nav' && type == 'swiper_bg_style')) {
  250. //辅助线/辅助空白/客服/富文本/图片组合的展现样式
  251. this.saveCurSelData(val, type, tar_index, 'single');
  252. }
  253. };
  254. //修改内容,数据根节点的操作,parent_index为父级的index
  255. saveCurSelData = (val, type, tar_index = 0, flag,parent_index=-1) => {
  256. let { select_data } = this.props;
  257. if (flag == 'single') {
  258. //辅助线/辅助空白/富文本/客服操作, 导航的根节点样式
  259. this.props.handleCurSelData({ [type]: val });
  260. } else if (flag == 'more') {
  261. //每个数组下面的操作
  262. let tar_data = [];
  263. if(parent_index>-1){
  264. if(select_data.type == 'tupianzuhe'&&select_data.sele_style == 8){
  265. tar_data = select_data.data[parent_index].img.filter((item, index) => index == tar_index)[0];
  266. }
  267. }else{
  268. tar_data = select_data.data.filter((item, index) => index == tar_index)[0];
  269. }
  270. tar_data[type] = val;
  271. this.props.handleCurSelData(select_data);
  272. }
  273. };
  274. //链接选择器选择之后渲染页面
  275. getDetailItem = (data, index = 0) => {
  276. let render_con = '';
  277. if (data.url_type == '') {
  278. render_con = null;
  279. } else if (data.url_type == 'url') {
  280. render_con = <div className={`${styles.sub_part}`} style={{ borderBottomWidth: 0 }}>
  281. <div className={`${styles.subtitle}`}>链接地址</div>
  282. <FormItem
  283. key={`link_url_${index}`}
  284. {...formItemLayoutModal}
  285. label={''}
  286. >
  287. <Input style={{ width: 300 }} maxLength={250} defaultValue={data.url} placeholder={'请输入链接地址'}
  288. onChange={(e) => this.onChange(e.target.value, 'url', index)}/>
  289. </FormItem>
  290. </div>;
  291. } else if (data.url_type == 'keyword') {
  292. render_con = <div className={`${styles.sub_part}`} style={{ borderBottomWidth: 0 }}>
  293. <div className={`${styles.subtitle}`}>关键词</div>
  294. <FormItem
  295. key={`link_keyword_${index}`}
  296. {...formItemLayoutModal}
  297. label={''}
  298. >
  299. <Input maxLength={250} style={{ width: 300 }} defaultValue={data.url} placeholder={'请输入关键词'}
  300. onChange={(e) => this.onChange(e.target.value, 'url', index)}/>
  301. </FormItem>
  302. </div>;
  303. } else if (data.url_type == 'goods') {
  304. render_con = <div className={`${styles.sub_part}`} style={{ borderBottomWidth: 0 }}>
  305. <div className={`${styles.subtitle}`}>商品名称</div>
  306. <FormItem
  307. key={`link_goods_${index}`}
  308. {...formItemLayoutModal}
  309. label={''}
  310. >
  311. <Input maxLength={250} style={{ width: 300 }} value={data.info.goodsName} disabled={true}/>
  312. </FormItem>
  313. </div>;
  314. } else if (data.url_type == 'category') {
  315. render_con = <div className={`${styles.sub_part}`} style={{ borderBottomWidth: 0 }}>
  316. <div className={`${styles.subtitle}`}>分类名称</div>
  317. <FormItem
  318. key={`link_category_${index}`}
  319. {...formItemLayoutModal}
  320. label={''}
  321. >
  322. <Input style={{ width: 300 }} value={data.info.labelName} disabled={true}/>
  323. </FormItem>
  324. </div>;
  325. }
  326. return render_con;
  327. };
  328. //链接选择器选择之后渲染页面不显示label,parent_index为父级的index
  329. getDetailItemHideLabel = (data, index = 0,parent_index=-1) => {
  330. let render_con = '';
  331. const { select_data } = this.props;
  332. if (data.url_type == '') {
  333. render_con = null;
  334. } else if (data.url_type == 'url') {
  335. render_con = <Input maxLength={250} key={`${select_data.type}_${select_data.id}_url_${parent_index}_${index}`}
  336. className={styles.more_link_input}
  337. defaultValue={data.url} placeholder={'请输入链接地址'}
  338. onChange={(e) => this.onChange(e.target.value, 'url', index,parent_index)}/>;
  339. } else if (data.url_type == 'keyword') {
  340. render_con =
  341. <Input maxLength={15} key={`${select_data.type}_${select_data.id}_keyword_${parent_index}_${index}`}
  342. className={styles.more_link_input}
  343. defaultValue={data.url} placeholder={'请输入关键词'}
  344. onChange={(e) => this.onChange(e.target.value, 'url', index,parent_index)}/>;
  345. } else if (data.url_type == 'goods') {
  346. render_con = <Input key={`${select_data.type}_${select_data.id}_goods_${parent_index}_${index}`} className={styles.more_link_input}
  347. value={data.info.goodsName} disabled={true} title={data.info.goodsName}/>;
  348. } else if (data.url_type == 'category') {
  349. render_con =
  350. <Input key={`${select_data.type}_${select_data.id}_category${index}`} className={styles.more_link_input}
  351. value={data.info.labelName} disabled={true} title={data.info.labelName}/>;
  352. }
  353. return render_con;
  354. };
  355. /*
  356. * 链接选择器选择事件
  357. * tar_index为多条数据的角标,(用于轮播/导航/图片组合)
  358. * parent_index为父级的index
  359. * */
  360. sldHandSeleLink = (val, tar_index = 0, parent_index=-1) => {
  361. let data = {};
  362. let { select_data } = this.props;
  363. if (select_data.type == 'lunbo' || select_data.type == 'nav' || select_data.type == 'tupianzuhe' || select_data.type == 'top_cat_nav') {
  364. if(parent_index>-1){
  365. if(select_data.type == 'tupianzuhe'&&select_data.sele_style == 8){
  366. data = select_data.data[parent_index].img.filter((item, index) => index == tar_index)[0];
  367. }
  368. }else{
  369. data = select_data.data.filter((item, index) => index == tar_index)[0];
  370. }
  371. }
  372. if (val == '') {
  373. //无操作
  374. data.url = '';//公告链接
  375. data.url_type = '';//公告链接类型
  376. data.info = '';//用于存放额外信息
  377. } else if (val == 'url') {
  378. //链接地址
  379. data.url = '';//公告链接
  380. data.url_type = 'url';//公告链接类型
  381. data.info = '';//用于存放额外信息
  382. } else if (val == 'keyword') {
  383. //关键词
  384. data.url = '';//关键词
  385. data.url_type = 'keyword';//关键词类型
  386. data.info = '';//用于存放额外信息
  387. } else if (val == 'goods') {
  388. //商品
  389. data.url = '';//商品gid
  390. data.url_type = 'goods';//商品类型
  391. data.info = '';//用于存放额外信息
  392. } else if (val == 'category') {
  393. //分类
  394. data.url = '';//分类id
  395. data.url_type = 'category';//分类类型
  396. data.info = '';//用于存放额外信息
  397. }else {
  398. //签到、店铺街、领券中心、推手系统、O2O、短视频、直播、积分商城、【促销】团购、【促销】限时折扣、【促销】拼团、【促销】预售、【促销】阶梯团
  399. data.url = '';
  400. data.url_type = val;//链接类型
  401. data.info = '';//用于存放额外信息
  402. }
  403. this.cur_index = tar_index;//当前操作数据的序号
  404. this.parent_index = parent_index;//当前操作数据的父级的序号
  405. this.setState({ link_type: val });
  406. if (select_data.type == 'lunbo' || select_data.type == 'nav' || select_data.type == 'tupianzuhe' || select_data.type == 'top_cat_nav') {
  407. //轮播导航
  408. this.props.handleCurSelData(select_data);
  409. } else {
  410. //目前用于搭配
  411. this.props.handleCurSelData(data);
  412. }
  413. };
  414. //商品或分类选中事件
  415. seleSku = (val) => {
  416. const { select_data } = this.props;
  417. let data = {};
  418. if (select_data.type == 'lunbo' || select_data.type == 'nav' || select_data.type == 'tupianzuhe' || select_data.type == 'top_cat_nav') {
  419. if(this.parent_index!=undefined&&this.parent_index>-1){
  420. data = select_data.data[this.parent_index].img.filter((item, index) => index == this.cur_index)[0];
  421. }else{
  422. data = select_data.data.filter((item, index) => index == this.cur_index)[0];
  423. }
  424. } else {
  425. data = { ...select_data };
  426. }
  427. if (data.url_type == 'goods') {
  428. data.url = val.goodsId;
  429. data.info = val;
  430. } else if (data.url_type == 'category') {
  431. data.url = val.labelId;
  432. data.info = val;
  433. }
  434. if (select_data.type == 'lunbo' || select_data.type == 'nav') {
  435. this.props.handleCurSelData(select_data);
  436. } else {
  437. this.props.handleCurSelData(data);
  438. }
  439. this.setState({ link_type: '' });
  440. };
  441. //选择商品或者分类取消事件
  442. sldHandleLinkCancle = () => {
  443. const { select_data } = this.props;
  444. let data = { ...select_data };
  445. if (data.type == 'lunbo' || data.type == 'nav') {
  446. //轮播
  447. let tar_data = data.data.filter((item, index) => index == this.cur_index)[0];
  448. tar_data.url = '';
  449. tar_data.url_type = '';
  450. tar_data.info = '';
  451. } else {
  452. data.url = '';//公告链接
  453. data.url_type = '';//公告链接类型
  454. data.info = '';//用于存放额外信息
  455. }
  456. this.props.handleCurSelData(data);
  457. this.setState({ link_type: '' });
  458. };
  459. /*
  460. * 上传图片
  461. * tar_index标示多个图片的时候图片下标((用于轮播/导航/图片组合)
  462. * */
  463. setImg = (info, tar_index = 0,tar_parent_index=-1) => {
  464. const { select_data } = this.props;
  465. let data = { ...select_data };
  466. let img_data = info.file.response;
  467. if (info.file.status === 'done') {
  468. if (select_data.type == 'lunbo' || select_data.type == 'nav' || select_data.type == 'tupianzuhe' || select_data.type == 'top_cat_nav') {
  469. //轮播
  470. let target_data = [];
  471. if(tar_parent_index > -1){
  472. if(select_data.type == 'tupianzuhe'&&select_data.sele_style == 8){
  473. target_data = data.data[tar_parent_index].img.filter((item, index) => index == tar_index)[0];
  474. }
  475. }else{
  476. target_data = data.data.filter((item, index) => index == tar_index)[0];
  477. }
  478. target_data.img = img_data.data.url;
  479. target_data.img_path = img_data.data.path;
  480. target_data.width = img_data.data.width;
  481. target_data.height = img_data.data.height;
  482. data.width = img_data.data.width;
  483. if (data.data.length == 1) {
  484. data.height = img_data.data.height;
  485. } else if (data.data.length > 1) {
  486. if (img_data.data.height > data.height) {
  487. data.height = img_data.data.height;
  488. }
  489. }
  490. } else {
  491. //搭配
  492. data.dapei_img = img_data.data.url;
  493. data.img_path = img_data.data.path;
  494. data.width = img_data.data.width;
  495. data.height = img_data.data.height;
  496. }
  497. }
  498. this.props.handleCurSelData(data);
  499. };
  500. //删除搭配图片
  501. delImg = () => {
  502. const { select_data } = this.props;
  503. let data = { ...select_data };
  504. data.dapei_img = '';
  505. data.img_path = '';
  506. this.props.handleCurSelData(data);
  507. };
  508. //删除选中的短视频
  509. delSvideo = (svideoId, tar_index = 0) => {
  510. const { select_data } = this.props;
  511. let data = { ...select_data };
  512. if (data.type == 'more_tab') {
  513. let tar_data = data.data.filter((item, index) => index == tar_index)[0];
  514. tar_data.ids = tar_data.ids.filter(item => item != svideoId);
  515. tar_data.info = tar_data.info.filter(item => item.video_id != svideoId);
  516. } else {
  517. data.data.ids = data.data.ids.filter(item => item != svideoId);
  518. data.data.info = data.data.info.filter(item => item.video_id != svideoId);
  519. }
  520. this.props.handleCurSelData(data);
  521. };
  522. //删除选中的直播
  523. delLive = (liveId, tar_index = 0) => {
  524. const { select_data } = this.props;
  525. let data = { ...select_data };
  526. if (data.type == 'more_tab') {
  527. let tar_data = data.data.filter((item, index) => index == tar_index)[0];
  528. tar_data.ids = tar_data.ids.filter(item => item != liveId);
  529. tar_data.info = tar_data.info.filter(item => item.live_id != liveId);
  530. } else {
  531. data.data.ids = data.data.ids.filter(item => item != liveId);
  532. data.data.info = data.data.info.filter(item => item.live_id != liveId);
  533. }
  534. this.props.handleCurSelData(data);
  535. };
  536. //删除单个商品
  537. delGoods = (goodsId, tar_index = 0) => {
  538. const { select_data } = this.props;
  539. let data = { ...select_data };
  540. if (data.type == 'dapei' || data.type == 'tuijianshangpin'|| data.type == 'activity') {
  541. data.data.ids = data.data.ids.filter(item => item != goodsId);
  542. data.data.info = data.data.info.filter(item => item.goodsId != goodsId);
  543. } else if (data.type == 'more_tab') {
  544. let tar_data = data.data.filter((item, index) => index == tar_index)[0];
  545. tar_data.ids = tar_data.ids.filter(item => item != goodsId);
  546. tar_data.info = tar_data.info.filter(item => item.goodsId != goodsId);
  547. }
  548. this.props.handleCurSelData(data);
  549. };
  550. //短视频多选-回调事件
  551. seleSvideo = (selectedRows, selectedRowKeys) => {
  552. const { select_data } = this.props;
  553. let data = { ...select_data };
  554. this.sele_more_svideo.ids = [...selectedRowKeys];
  555. this.sele_more_svideo.info = JSON.parse(JSON.stringify(selectedRows));
  556. if (data.type == 'svideo') {
  557. data.data.ids = JSON.parse(JSON.stringify(selectedRowKeys));
  558. data.data.info = JSON.parse(JSON.stringify(selectedRows));
  559. } else if (data.type == 'more_tab') {
  560. let tar_data = data.data.filter((item, index) => index == this.oprate_more_tab_index)[0];
  561. tar_data.ids = JSON.parse(JSON.stringify(selectedRowKeys));
  562. tar_data.info = JSON.parse(JSON.stringify(selectedRows));
  563. }
  564. this.props.handleCurSelData(data);
  565. this.sldHandleCancle();
  566. };
  567. //直播多选-回调事件
  568. seleLive = (selectedRows, selectedRowKeys) => {
  569. const { select_data } = this.props;
  570. let data = { ...select_data };
  571. this.sele_more_live.ids = [...selectedRowKeys];
  572. this.sele_more_live.info = JSON.parse(JSON.stringify(selectedRows));
  573. if (data.type == 'live') {
  574. data.data.ids = JSON.parse(JSON.stringify(selectedRowKeys));
  575. data.data.info = JSON.parse(JSON.stringify(selectedRows));
  576. } else if (data.type == 'more_tab') {
  577. let tar_data = data.data.filter((item, index) => index == this.oprate_more_tab_index)[0];
  578. tar_data.ids = JSON.parse(JSON.stringify(selectedRowKeys));
  579. tar_data.info = JSON.parse(JSON.stringify(selectedRows));
  580. }
  581. this.props.handleCurSelData(data);
  582. this.sldHandleCancle();
  583. };
  584. //商品多选-回调事件
  585. seleGoods = (selectedRows, selectedRowKeys) => {
  586. const { select_data } = this.props;
  587. let data = { ...select_data };
  588. this.sele_more_goods.ids = [...selectedRowKeys];
  589. this.sele_more_goods.info = JSON.parse(JSON.stringify(selectedRows));
  590. if (data.type == 'dapei' || data.type == 'activity' || data.type == 'tuijianshangpin') {
  591. data.data.ids = JSON.parse(JSON.stringify(selectedRowKeys));
  592. data.data.info = JSON.parse(JSON.stringify(selectedRows));
  593. } else if (data.type == 'more_tab') {
  594. let tar_data = data.data.filter((item, index) => index == this.oprate_more_tab_index)[0];
  595. tar_data.ids = JSON.parse(JSON.stringify(selectedRowKeys));
  596. tar_data.info = JSON.parse(JSON.stringify(selectedRows));
  597. }
  598. this.props.handleCurSelData(data);
  599. this.sldHandleCancle();
  600. };
  601. sldHandleCancle = () => {
  602. this.setState({
  603. modalSpuShow: false,
  604. modalVisible: false,
  605. modalVisibleLive: false,
  606. modalVisibleGoods: false,
  607. modalVisibleActivityGoods: false,
  608. });
  609. };
  610. renderDaPeiGoods = (data) => {
  611. return <div className={`${styles.sel_goods} ${global.flex_com_row_start_center}`} style={{ flexWrap: 'wrap' }}>
  612. {data.data.info.map((item, index) => {
  613. return <div key={index} className={`${styles.goods_info} ${global.flex_com_row_center}`}>
  614. <img src={item.goodsImage} title={item.name1}/>
  615. <div className={styles.img_mask}>
  616. <span className={styles.img_del} onClick={() => this.delGoods(item.id)}>
  617. {sldTsvg('shanchu3', '#fff', 15, 15)}
  618. </span>
  619. </div>
  620. </div>;
  621. })}
  622. </div>;
  623. };
  624. /*
  625. * 图片组合8图片模块
  626. * upload_img_tip 上传图片的提示
  627. * */
  628. renderTPZH8Img = (item, index, upload_img_tip = '',parent_index=-1) => {
  629. let limintLength = 15;//限制内容长度
  630. const { select_data } = this.props;
  631. //标题的label 标题的key 标题的placeholder
  632. let title_key = 'title';
  633. let title_placeholder = '请输入图片标题';
  634. let content = <Fragment key={`${select_data.type}_${select_data.id}_img${index}`}>
  635. <div className={`${global.flex_com_row_start_center} ${styles.sld_com_img}`}>
  636. <div className={`${styles.common_img_part} ${global.flex_com_column_center_center}`}>
  637. <div className={`${styles.upload_img} ${global.flex_column_center_center}`}>
  638. <Upload
  639. withCredentials={true}
  640. beforeUpload={sldBeforeUpload}
  641. accept={'.gif, .jpeg, .png,.jpg,'}
  642. showUploadList={false}
  643. name={'file'}
  644. action={`${apiUrl}v3/oss/common/upload?source=adminDeco`}
  645. onChange={(info) => this.setImg(info, index,parent_index)}
  646. headers={{
  647. Authorization: 'Bearer ' + getLocalStorageStingVal('sld_token'),
  648. }}
  649. >
  650. <div className={`${global.flex_column_center_center}`}>
  651. {item.img
  652. ? <img src={item.img}/>
  653. : sldSvgIcon(defaultSettings.primaryColor, 40, 40, 'ziyuan110')
  654. }
  655. <span className={styles.upload_btn}>选择图片</span>
  656. </div>
  657. </Upload>
  658. </div>
  659. <span className={styles.upload_img_tip}>{upload_img_tip}</span>
  660. </div>
  661. <div className={`${styles.img_con} ${global.flex_com_column_center_flex_start}`}>
  662. <Input maxLength={limintLength} className={styles.title} placeholder={title_placeholder}
  663. onChange={(e) => this.onChange(e.target.value, title_key, index,parent_index)} value={item[title_key]}/>
  664. <Select
  665. value={item.url_type}
  666. style={{ width: 232 }}
  667. placeholder={'请选择链接类型'}
  668. onSelect={(e) => this.sldHandSeleLink(e, index,parent_index)}
  669. getPopupContainer={triggerNode => triggerNode.parentNode}
  670. >
  671. {m_diy_spreader_link_type().map((items, index) =>
  672. <Option key={index} value={items.key}>{items.name}</Option>,
  673. )}
  674. </Select>
  675. {this.getDetailItemHideLabel(item, index,parent_index)}
  676. </div>
  677. </div>
  678. </Fragment>
  679. return content;
  680. };
  681. /*
  682. *
  683. * upload_img_tip 上传图片的提示
  684. * */
  685. renderLunBo = (item, index, upload_img_tip = '',parent_index=-1) => {
  686. let limintLength = 15;//限制内容长度
  687. const { select_data } = this.props;
  688. //标题的label 标题的key 标题的placeholder 显示删除图标show_del_icon
  689. let title_key, title_placeholder, show_color_picker = false, show_del_icon = true;
  690. if (select_data.type == 'lunbo') {
  691. //轮播
  692. show_del_icon = true;
  693. }
  694. if (select_data.type == 'top_cat_nav') {
  695. //顶部分类导航
  696. show_del_icon = true;
  697. show_color_picker = true;//显示颜色选择器
  698. } else if (select_data.type == 'nav') {
  699. //导航
  700. limintLength = 5;
  701. show_del_icon = true;
  702. title_key = 'name';
  703. title_placeholder = '请输入导航名称';
  704. } else if (select_data.type == 'tupianzuhe') {
  705. //图片组合
  706. if (select_data.sele_style < 4) {
  707. show_del_icon = true;
  708. } else {
  709. show_del_icon = false;
  710. }
  711. title_key = 'title';
  712. title_placeholder = '请输入图片标题';
  713. }
  714. let content = '';
  715. content = <Fragment key={`${select_data.type}_${select_data.id}_img${index}`}>
  716. <div className={`${global.flex_com_row_start_center} ${styles.sld_com_img}`}>
  717. <div className={`${styles.common_img_part} ${global.flex_com_column_center_center}`}>
  718. <div className={`${styles.upload_img} ${global.flex_column_center_center}`}>
  719. <Upload
  720. withCredentials={true}
  721. beforeUpload={sldBeforeUpload}
  722. accept={'.gif, .jpeg, .png,.jpg,'}
  723. showUploadList={false}
  724. name={'file'}
  725. action={`${apiUrl}v3/oss/common/upload?source=adminDeco`}
  726. onChange={(info) => this.setImg(info, index,parent_index)}
  727. headers={{
  728. Authorization: 'Bearer ' + getLocalStorageStingVal('sld_token')
  729. }}
  730. >
  731. <div className={`${global.flex_column_center_center}`}>
  732. {item.img
  733. ?<img src={item.img}/>
  734. :sldSvgIcon(defaultSettings.primaryColor,40,40,'ziyuan110')
  735. }
  736. <span className={styles.upload_btn}>选择图片</span>
  737. </div>
  738. </Upload>
  739. </div>
  740. <span className={styles.upload_img_tip}>{upload_img_tip}</span>
  741. </div>
  742. <div className={`${styles.img_con} ${global.flex_com_column_center_flex_start}`}>
  743. {show_color_picker &&
  744. <Fragment>
  745. <div className={`${global.flex_row_start_center}`} style={{ marginBottom: 8 }}>
  746. <span className={`${styles.selected_color_tip}`}>选择背景色:</span>
  747. {/*<span className={`${styles.clear_color} ${item.bg_color == '' ? styles.bg_color_current : null}`}></span>*/}
  748. <span className={`${styles.selected_color} ${item.bg_color ? styles.bg_color_current : null}`}
  749. style={{ background: item.bg_color }}
  750. onClick={() => this.showTopCatNavColorPicker(true, index)}></span>
  751. </div>
  752. {item.show_color_picker && (
  753. <div className={styles.color_picker_wrap}>
  754. <div className={styles.color_picker_mask}
  755. onClick={() => this.showTopCatNavColorPicker(false, index)}/>
  756. <SketchPicker
  757. color={item.bg_color}
  758. onChangeComplete={(e) => this.onChange('rgba(' + e.rgb.r + ',' + e.rgb.g + ',' + e.rgb.b + ',' + e.rgb.a + ')', 'bg_color', index)}/>
  759. </div>
  760. )}
  761. </Fragment>
  762. }
  763. {(select_data.type != 'top_cat_nav' && select_data.type != 'lunbo') &&
  764. <Input maxLength={limintLength} className={styles.title} placeholder={title_placeholder}
  765. onChange={(e) => this.onChange(e.target.value, title_key, index)} value={item[title_key]}/>
  766. }
  767. <Select
  768. value={item.url_type}
  769. style={{ width: 232 }}
  770. placeholder={'请选择链接类型'}
  771. onSelect={(e) => this.sldHandSeleLink(e, index)}
  772. getPopupContainer={triggerNode => triggerNode.parentNode}
  773. >
  774. {m_diy_spreader_link_type().map((items, index) =>
  775. <Option key={index} value={items.key}>{items.name}</Option>,
  776. )}
  777. </Select>
  778. {this.getDetailItemHideLabel(item, index)}
  779. </div>
  780. {show_del_icon &&
  781. <div className={`${global.flex_com_column_flex_end} ${styles.del_sld_com_img}`}
  782. onClick={() => this.delSldComImg(index)}>
  783. {sldTsvg('qingchu', '#666', 16, 16)}
  784. </div>
  785. }
  786. </div>
  787. </Fragment>;
  788. return content;
  789. };
  790. //删除图片item,针对于多条数据的处理(用于轮播/导航/图片组合)
  791. delSldComImg = (tar_index) => {
  792. let { select_data } = this.props;
  793. let data = select_data.data.filter((item, index) => index != tar_index);
  794. select_data.data = data;
  795. this.props.handleCurSelData(select_data);
  796. };
  797. //添加轮播图片
  798. addLunbo = (data) => {
  799. data.data.push({
  800. img: '',//图片绝对地址
  801. img_path: '',//图片相对地址
  802. title: '',//图片标题
  803. url: '', //链接值
  804. url_type: '',//链接类型
  805. info: '',//用于存放额外信息
  806. width: '100%',
  807. height: 285.5,
  808. });
  809. this.props.handleCurSelData(data);
  810. };
  811. //添加顶部分类导航轮播
  812. addTopCatNav = (data) => {
  813. if(data.data.length == 8){
  814. failTip('最多支持8张轮播图');
  815. return false;
  816. }
  817. data.data.push({
  818. img: '',//图片绝对地址
  819. img_path: '',//图片相对地址
  820. title: '',//图片标题
  821. url: '', //链接值
  822. url_type: '',//链接类型
  823. info: '',//用于存放额外信息
  824. width: '355',
  825. height: 140,
  826. bg_color: '#FC1C1C',//轮播背景色
  827. show_color_picker:false,//是否显示颜色选择器,默认不显示
  828. swiper_bg_style:1,//轮播背景风格,1为纯色弧度,2为渐变
  829. });
  830. this.props.handleCurSelData(data);
  831. };
  832. //顶部分类——颜色选择器的显示与否
  833. showTopCatNavColorPicker = (flag,index) =>{
  834. let { select_data } = this.props;
  835. select_data.data[index].show_color_picker = flag;
  836. this.props.handleCurSelData(select_data);
  837. }
  838. //添加导航item
  839. addNav = (data) => {
  840. if (data.type == 'nav' && data.data.length >= 5) {
  841. failTip('最多添加5个导航,否则页面展示效果不佳');
  842. return false;
  843. } else if (data.type == 'tupianzuhe' && data.data.length >= 30) {
  844. failTip('最多添加30张图片');
  845. return false;
  846. } else {
  847. data.data.push({
  848. img: '',//图片绝对地址
  849. img_path: '',//图片相对地址
  850. name: '',//导航名称
  851. url: '', //链接值
  852. url_type: '',//链接类型
  853. info: '',//用于存放额外信息
  854. width: '100%',
  855. height: 150,
  856. });
  857. this.props.handleCurSelData(data);
  858. }
  859. };
  860. //添加TAB切换分类导航,最多15个
  861. addMoreTabNav = (data) => {
  862. if (data.data.length >= 15) {
  863. failTip('最多添加15个tab导航');
  864. return false;
  865. } else {
  866. if (data.data.length == 0) {
  867. data.nav_current = 0;
  868. }
  869. data.data.push({
  870. title: '',//分类标题
  871. sub_title: '',//子标题
  872. data_type: 'goods',//商品类型
  873. cart_icon_type: 5,//商品的话显示的购物车图标
  874. ids: [],//数据id集合
  875. info: [],//数据信息
  876. });
  877. this.props.handleCurSelData(data);
  878. }
  879. };
  880. //短视频添加事件
  881. selMoreSvideo = (data) => {
  882. let { sle_more_title } = this.state;
  883. this.sele_more_svideo.info = data.data.info;
  884. this.sele_more_svideo.ids = data.data.ids;
  885. if (data.show_style == 'four' || data.show_style == 'five') {
  886. this.sele_more_svideo = {
  887. info: this.sele_more_svideo.info,//选择的短视频数组
  888. ids: this.sele_more_svideo.ids,//选择的短视频id数组
  889. min_num: 3,//最小数量,0为不限制
  890. max_num: 15,//最多选择15个
  891. };
  892. sle_more_title = '选择短视频(最少选择3个,最多选择15个)';
  893. } else if (data.show_style == 'two') {
  894. this.sele_more_svideo = {
  895. info: this.sele_more_svideo.info,//选择的短视频数组
  896. ids: this.sele_more_svideo.ids,//选择的短视频id数组
  897. total_num: 3,//只能选择3个
  898. };
  899. sle_more_title = '选择短视频(只能选择3个)';
  900. } else {
  901. this.sele_more_svideo = {
  902. info: this.sele_more_svideo.info,//选择的短视频数组
  903. ids: this.sele_more_svideo.ids,//选择的短视频id数组
  904. total_num: 2,//只能选择2个
  905. };
  906. sle_more_title = '选择短视频(只能选择2个)';
  907. }
  908. this.setState({
  909. modalVisible: true,
  910. sle_more_title,
  911. });
  912. };
  913. //选择商品事件-多选
  914. selMoreGoods = (data) => {
  915. let { activityType, sle_more_title, modalVisibleGoods, modalVisibleActivityGoods } = this.state;
  916. if (data.type == 'dapei') {
  917. //搭配
  918. this.sele_more_goods = {
  919. info: data.data.info,
  920. ids: data.data.ids,
  921. min_num: 3,
  922. max_num: 15,
  923. };
  924. sle_more_title = '选择商品(最少选择3个,最多选择9个)';
  925. modalVisibleGoods = true;
  926. } else if (data.type == 'tuijianshangpin') {
  927. //商品推荐
  928. this.sele_more_goods = {
  929. info: data.data.info,
  930. ids: data.data.ids,
  931. min_num: 1,
  932. };
  933. sle_more_title = '选择商品(最少选择1个)';
  934. modalVisibleGoods = true;
  935. } else if (data.type == 'activity') {
  936. if (data.show_style == 'group_buy') {
  937. //团购
  938. this.sele_more_goods = {
  939. info: data.data.info,
  940. ids: data.data.ids,
  941. total_num: 2,//只能选择2个
  942. };
  943. sle_more_title = '选择团购商品(只能选择2个)';
  944. } else {
  945. //拼团、限时折扣
  946. this.sele_more_goods = {
  947. info: data.data.info,
  948. ids: data.data.ids,
  949. min_num: 3,
  950. max_num: 15,
  951. };
  952. sle_more_title = '选择' + (data.show_style == 'pin' ? '拼团' : '限时折扣') + '商品(最少选择3个,最多选择15个)';
  953. }
  954. activityType = data.show_style;
  955. modalVisibleActivityGoods = true;
  956. }
  957. this.setState({
  958. modalVisibleActivityGoods,
  959. modalVisibleGoods,
  960. activityType,
  961. sle_more_title,
  962. });
  963. };
  964. //TAB切换选择数据功能
  965. selMoreTabData = (data, tar_index) => {
  966. let { modalVisibleLive, modalVisible, modalVisibleGoods } = this.state;
  967. let tar_data = data.data.filter((item, index) => index == tar_index)[0];
  968. if (tar_data.data_type == 'goods') {
  969. this.sele_more_goods = {
  970. info: tar_data.info,//选择的商品数组
  971. ids: tar_data.ids,//选择的商品id数组
  972. min_num: 2,//最少选择2个
  973. };
  974. modalVisibleGoods = true;
  975. } else if (tar_data.data_type == 'live') {
  976. this.sele_more_live = {
  977. info: tar_data.info,//选择的直播数组
  978. ids: tar_data.ids,//选择的直播id数组
  979. min_num: 2,//最少选择2个
  980. };
  981. modalVisibleLive = true;
  982. } else if (tar_data.data_type == 'svideo') {
  983. this.sele_more_svideo = {
  984. info: tar_data.info,//选择的短视频数组
  985. ids: tar_data.ids,//选择的短视频id数组
  986. min_num: 2,//最少选择2个
  987. };
  988. modalVisible = true;
  989. }
  990. this.oprate_more_tab_index = tar_index;//TAB切换当前操作的数据index
  991. this.setState({
  992. modalVisibleLive,
  993. modalVisible,
  994. modalVisibleGoods,
  995. });
  996. };
  997. //直播添加事件
  998. selMoreLive = (data) => {
  999. let { sle_more_title } = this.state;
  1000. this.sele_more_live.info = data.data.info;
  1001. this.sele_more_live.ids = data.data.ids;
  1002. if (data.show_style == 'one' || data.show_style == 'five') {
  1003. this.sele_more_live = {
  1004. info: this.sele_more_live.info,//选择的直播数组
  1005. ids: this.sele_more_live.ids,//选择的直播id数组
  1006. total_num: 2,//只能选择2个
  1007. };
  1008. sle_more_title = '选择直播(只能选择2个)';
  1009. } else if (data.show_style == 'two') {
  1010. this.sele_more_live = {
  1011. info: this.sele_more_live.info,//选择的直播数组
  1012. ids: this.sele_more_live.ids,//选择的直播id数组
  1013. min_num: 3,//最少选择3个
  1014. max_num: 15,//最多选择15个
  1015. };
  1016. sle_more_title = '选择直播(最少选择3个,最多选择15个)';
  1017. }
  1018. this.setState({
  1019. modalVisibleLive: true,
  1020. sle_more_title,
  1021. });
  1022. };
  1023. renderMoreTabSeleData = (data, type, tar_index) => {
  1024. let con = '';
  1025. if (type == 'goods') {
  1026. con = <Fragment>
  1027. <div className={`${styles.selected_svideo_list_title}`}>
  1028. <span style={{ width: 50 }}>序号</span>
  1029. <span style={{ width: 176 }}>商品信息</span>
  1030. <span style={{ width: 80 }}>价格</span>
  1031. <span style={{ width: 50 }}>操作</span>
  1032. </div>
  1033. <div className={`${styles.selected_svideo_list}`}>
  1034. {data.map((svideo_item, svideo_index) => {
  1035. return <div className={`${styles.selected_svideo_item} ${global.flex_row_start_center}`}>
  1036. <span style={{ width: 50 }}>{svideo_index + 1}</span>
  1037. <div className={`${styles.svideo_info} ${global.flex_row_start_center}`}>
  1038. <div className={`${styles.left} ${global.flex_row_center_center}`}>
  1039. <img src={svideo_item.goodsImage}/>
  1040. </div>
  1041. <div className={`${styles.right} ${global.flex_column_start_start}`}>
  1042. <span className={styles.video_name}>{svideo_item.goodsName}</span>
  1043. </div>
  1044. </div>
  1045. <span style={{ width: 80 }}>{svideo_item.productPrice * 1}</span>
  1046. <div onClick={() => this.delGoods(svideo_item.goodsId, tar_index)}
  1047. className={`${styles.operate} ${global.flex_row_center_center}`}>
  1048. <ALibbSvg fill={'#2d2d2d'} width={18} height={18} type={'shanchu5'}/>
  1049. </div>
  1050. </div>;
  1051. })}
  1052. </div>
  1053. </Fragment>
  1054. } else if (type == 'svideo') {
  1055. con = <Fragment>
  1056. <div className={`${styles.selected_svideo_list_title}`}>
  1057. <span style={{ width: 50 }}>序号</span>
  1058. <span style={{ width: 176 }}>短视频信息</span>
  1059. <span style={{ width: 80 }}>播放量</span>
  1060. <span style={{ width: 50 }}>操作</span>
  1061. </div>
  1062. <div className={`${styles.selected_svideo_list}`}>
  1063. {data.map((svideo_item, svideo_index) => {
  1064. return <div className={`${styles.selected_svideo_item} ${global.flex_row_start_center}`}>
  1065. <span style={{ width: 50 }}>{svideo_index + 1}</span>
  1066. <div className={`${styles.svideo_info} ${global.flex_row_start_center}`}>
  1067. <div className={`${styles.left} ${global.flex_row_center_center}`}>
  1068. <img src={svideo_item.video_image}/>
  1069. <div className={`${styles.play_icon}`}>
  1070. <ALibbSvg fill={'#fff'} width={22} height={22} type={'bofang11'}/>
  1071. </div>
  1072. </div>
  1073. <div className={`${styles.right} ${global.flex_column_start_start}`}>
  1074. <span className={styles.video_name}>{svideo_item.video_name}</span>
  1075. <span className={styles.video_label}>{svideo_item.label_name}</span>
  1076. </div>
  1077. </div>
  1078. <span style={{ width: 80 }}>{svideo_item.click_num}</span>
  1079. <div onClick={() => this.delSvideo(svideo_item.video_id, tar_index)}
  1080. className={`${styles.operate} ${global.flex_row_center_center}`}>
  1081. <ALibbSvg fill={'#2d2d2d'} width={18} height={18} type={'shanchu5'}/>
  1082. </div>
  1083. </div>;
  1084. })}
  1085. </div>
  1086. </Fragment>;
  1087. } else if (type == 'live') {
  1088. con = <Fragment>
  1089. <div className={`${styles.selected_svideo_list_title}`}>
  1090. <span style={{ width: 50 }}>序号</span>
  1091. <span style={{ width: 176 }}>直播信息</span>
  1092. <span style={{ width: 80 }}>播放量</span>
  1093. <span style={{ width: 50 }}>操作</span>
  1094. </div>
  1095. <div className={`${styles.selected_svideo_list}`}>
  1096. {data.map((svideo_item, svideo_index) => {
  1097. return <div className={`${styles.selected_svideo_item} ${global.flex_row_start_center}`}>
  1098. <span style={{ width: 50 }}>{svideo_index + 1}</span>
  1099. <div className={`${styles.svideo_info} ${global.flex_row_start_center}`}>
  1100. <div className={`${styles.left} ${global.flex_row_center_center}`}>
  1101. <img src={svideo_item.live_image_url}/>
  1102. <div className={`${styles.play_icon}`}>
  1103. <ALibbSvg fill={'#fff'} width={22} height={22} type={'bofang11'}/>
  1104. </div>
  1105. </div>
  1106. <div className={`${styles.right} ${global.flex_column_start_start}`}>
  1107. <span className={styles.video_name}>{svideo_item.live_name}</span>
  1108. <span className={styles.video_label}>{svideo_item.label_name}</span>
  1109. </div>
  1110. </div>
  1111. <span style={{ width: 80 }}>{svideo_item.click_num}</span>
  1112. <div onClick={() => this.delLive(svideo_item.live_id, tar_index)}
  1113. className={`${styles.operate} ${global.flex_row_center_center}`}>
  1114. <ALibbSvg fill={'#2d2d2d'} width={18} height={18} type={'shanchu5'}/>
  1115. </div>
  1116. </div>;
  1117. })}
  1118. </div>
  1119. </Fragment>
  1120. }
  1121. return con;
  1122. };
  1123. renderItem = (data) => {
  1124. const { getFieldDecorator } = this.props.form;
  1125. const { showColorPicker, showColorPicker2 } = this.state;
  1126. let con = '';
  1127. this.props.form.resetFields(['activity_border_radius','tjsp_isshow_sales','tjsp_show_style','tjsp_border_radius','tjsp_border_style','live_border_radius']);
  1128. if (data.type == 'top_cat_nav') {
  1129. //轮播
  1130. con = <Fragment>
  1131. <div className={`${styles.sub_part}`}>
  1132. <div className={`${styles.subtitle}`}>轮播背景设置</div>
  1133. <FormItem
  1134. key={'top_cat_nav_swiper_bg_style'}
  1135. label={''}
  1136. >
  1137. <Radio.Group defaultValue={data.swiper_bg_style} onChange={(e) => this.onChange(e.target.value, 'swiper_bg_style')}>
  1138. <Radio value={1}>纯色弧度</Radio>
  1139. <Radio value={2}>渐变</Radio>
  1140. </Radio.Group>
  1141. </FormItem>
  1142. </div>
  1143. <div className={`${styles.sub_part}`} style={{ borderBottomWidth: 0 }}>
  1144. <div className={`${styles.subtitle}`}>轮播图片</div>
  1145. <FormItem
  1146. key={'top_cat_nav_swiper_img'}
  1147. style={{ width: '100%' }}
  1148. label={''}
  1149. >
  1150. <div className={global.flex_com_column_start_start}>
  1151. {data.data.length > 0 && data.data.map((item, index) => {
  1152. return this.renderLunBo(item, index, '宽710*高280');
  1153. })}
  1154. <div className={`${styles.add_goods_wrap} ${global.flex_row_center_center}`}
  1155. onClick={() => this.addTopCatNav(data)}>
  1156. + 添加图片
  1157. </div>
  1158. </div>
  1159. </FormItem>
  1160. </div>
  1161. </Fragment>
  1162. }else if (data.type == 'lunbo') {
  1163. //轮播
  1164. con = <Fragment>
  1165. <div className={`${styles.sub_part}`} style={{ borderBottomWidth: 0 }}>
  1166. <div className={`${styles.subtitle}`}>轮播图片</div>
  1167. <FormItem
  1168. key={'lunbo_img'}
  1169. style={{ width: '100%' }}
  1170. label={''}
  1171. >
  1172. <div className={global.flex_com_column_start_start}>
  1173. {data.data.length > 0 && data.data.map((item, index) => {
  1174. return this.renderLunBo(item, index, '宽710,高不限制');
  1175. })}
  1176. <div className={`${styles.add_goods_wrap} ${global.flex_row_center_center}`}
  1177. onClick={() => this.addLunbo(data)}>
  1178. + 添加图片
  1179. </div>
  1180. </div>
  1181. </FormItem>
  1182. </div>
  1183. </Fragment>
  1184. } else if (data.type == 'nav') {
  1185. //导航
  1186. con = <Fragment>
  1187. <div className={`${styles.sub_part}`}>
  1188. <div className={`${styles.subtitle}`}>显示风格</div>
  1189. <FormItem
  1190. key={'nav_style_set'}
  1191. label={''}
  1192. >
  1193. <Radio.Group defaultValue={data.style_set} onChange={(e) => this.onChange(e.target.value, 'style_set')}>
  1194. <Radio value={'nav'}>导航</Radio>
  1195. <Radio value={'tag-nav'}>分组</Radio>
  1196. </Radio.Group>
  1197. </FormItem>
  1198. </div>
  1199. {data.style_set == 'nav' &&
  1200. <div className={`${styles.sub_part}`}>
  1201. <div className={`${styles.subtitle}`}>显示图标</div>
  1202. <FormItem
  1203. key={'nav_icon_set'}
  1204. label={''}
  1205. >
  1206. <Radio.Group defaultValue={data.icon_set} onChange={(e) => this.onChange(e.target.value, 'icon_set')}>
  1207. <Radio value={'up'}>图标居上</Radio>
  1208. <Radio value={'left'}>图标居左</Radio>
  1209. <Radio value={'no-icon'}>不显示图标</Radio>
  1210. </Radio.Group>
  1211. </FormItem>
  1212. </div>
  1213. }
  1214. {data.style_set == 'nav' &&
  1215. <div className={`${styles.sub_part}`}>
  1216. <div className={`${styles.subtitle}`}>图标大小</div>
  1217. <FormItem
  1218. key={'slide'}
  1219. label={''}
  1220. >
  1221. <Slider min={30} max={80} defaultValue={data.slide} onChange={(e) => this.onChange(e, 'slide')}/>
  1222. </FormItem>
  1223. </div>
  1224. }
  1225. <div className={`${styles.sub_part}`} style={{ borderBottomWidth: 0 }}>
  1226. <div className={`${styles.subtitle}`}>导航图片</div>
  1227. <FormItem
  1228. key={'nav_img'}
  1229. label={''}
  1230. >
  1231. <div className={global.flex_com_column_start_start}>
  1232. {data.data.length > 0 && data.data.map((item, index) => {
  1233. return this.renderLunBo(item, index);
  1234. })}
  1235. <div className={`${styles.add_goods_wrap} ${global.flex_row_center_center}`}
  1236. onClick={() => this.addNav(data)}>
  1237. + 添加导航
  1238. </div>
  1239. </div>
  1240. </FormItem>
  1241. </div>
  1242. </Fragment>
  1243. } else if (data.type == 'tupianzuhe') {
  1244. //图片组合
  1245. con = <Fragment>
  1246. <div className={`${styles.sub_part}`}>
  1247. <div className={`${styles.subtitle}`}>展示风格</div>
  1248. <FormItem
  1249. key={'svideo_show_style'}
  1250. label={''}
  1251. >
  1252. <div className={`${styles.com_default_styles} ${global.flex_com_row_start_center}`}>
  1253. {sld_m_diy_tpzh_style.map(item => {
  1254. return <div key={item.sele_style}
  1255. className={`${styles.svideo_show_style_item} ${global.flex_com_row_center} ${data.sele_style == item.sele_style ? styles.sel_svideo_show_style : null}`}
  1256. onClick={() => this.handleTuPianZuHeStyle(item.sele_style)}>
  1257. <img src={item.img}/>
  1258. </div>;
  1259. })}
  1260. </div>
  1261. </FormItem>
  1262. </div>
  1263. {data.sele_style == 8 &&
  1264. <Fragment>
  1265. {data.data.length>0&&data.data.map((item, index) => {
  1266. return <div key={index} className={`${styles.sub_part}`} style={{ borderBottomWidth: 0 }}>
  1267. <div className={`${styles.subtitle}`}>{index%2==0?'左':'右'}{index<2?1:2}模块数据</div>
  1268. <div className={`${global.flex_column_start_start}`}>
  1269. <FormItem
  1270. key={'tupianzuhe8_main'+index}
  1271. label={''}
  1272. >
  1273. <Input maxLength={6} style={{ width: 300 }} placeholder={'请输入主标题,最多6个字'}
  1274. onChange={(e) => this.onChange(e.target.value,'main_title', index)} value={item.main_title}/>
  1275. </FormItem>
  1276. <FormItem
  1277. key={'tupianzuhe8_sub'+index}
  1278. label={''}
  1279. >
  1280. <Input maxLength={10} style={{ width: 300 }} placeholder={'请输入子标题,最多10个字'}
  1281. onChange={(e) => this.onChange(e.target.value, 'sub_title', index)} value={item.sub_title}/>
  1282. </FormItem>
  1283. <FormItem
  1284. key={'tupianzuhe8_url'+index}
  1285. label={''}
  1286. >
  1287. <Select
  1288. value={item.url_type}
  1289. style={{ width: 300 }}
  1290. placeholder={'请选择链接类型'}
  1291. onSelect={(e)=>this.sldHandSeleLink(e,index)}
  1292. getPopupContainer={triggerNode => triggerNode.parentNode}
  1293. >
  1294. {m_diy_spreader_link_type().map((item_link, index_link) =>
  1295. <Option key={index_link} value={item_link.key}>{item_link.name}</Option>,
  1296. )}
  1297. </Select>
  1298. </FormItem>
  1299. {this.getDetailItem(item,index)}
  1300. </div>
  1301. <FormItem
  1302. key={'nav_img'}
  1303. label={''}
  1304. >
  1305. <div className={global.flex_com_column_start_start}>
  1306. {item.img.length > 0 && item.img.map((child, child_index) => {
  1307. let upload_tip = '宽154*高188';
  1308. return this.renderTPZH8Img(child, child_index, upload_tip,index);
  1309. })}
  1310. </div>
  1311. </FormItem>
  1312. </div>
  1313. })}
  1314. </Fragment>
  1315. }
  1316. {data.sele_style != 8 &&
  1317. <div className={`${styles.sub_part}`} style={{ borderBottomWidth: 0 }}>
  1318. <div className={`${styles.subtitle}`}>上传图片</div>
  1319. <FormItem
  1320. key={'nav_img'}
  1321. label={''}
  1322. >
  1323. <div className={global.flex_com_column_start_start}>
  1324. {data.data.length > 0 && data.data.map((item, index) => {
  1325. let upload_tip = '';
  1326. if (data.sele_style == 0 || data.sele_style == 1) {
  1327. upload_tip = '宽750,高不限制';
  1328. } else if (data.sele_style == 2) {
  1329. upload_tip = '宽300*高300';
  1330. } else if (data.sele_style == 3) {
  1331. upload_tip = '宽200*高200';
  1332. } else if (data.sele_style == 4) {
  1333. if (index == 0) {
  1334. upload_tip = '宽300*高320';
  1335. } else {
  1336. upload_tip = '宽300*高150';
  1337. }
  1338. } else if (data.sele_style == 5) {
  1339. if (index == 0 || index == 3) {
  1340. upload_tip = '宽200*高200';
  1341. } else {
  1342. upload_tip = '宽400*高200';
  1343. }
  1344. } else if (data.sele_style == 6) {
  1345. if (index == 0 || index == 3) {
  1346. upload_tip = '宽300*高150';
  1347. } else {
  1348. upload_tip = '宽300*高300';
  1349. }
  1350. } else if (data.sele_style == 7) {
  1351. if (index == 4) {
  1352. upload_tip = '宽200*高420';
  1353. } else {
  1354. upload_tip = '宽200*高200';
  1355. }
  1356. }
  1357. return this.renderLunBo(item, index, upload_tip);
  1358. })}
  1359. </div>
  1360. {data.sele_style < 4 &&
  1361. <div className={`${styles.add_goods_wrap} ${global.flex_row_center_center}`}
  1362. onClick={() => this.addNav(data)}>
  1363. + 添加图片
  1364. </div>
  1365. }
  1366. </FormItem>
  1367. </div>
  1368. }
  1369. </Fragment>
  1370. } else if (data.type == 'fzx') {
  1371. //辅助线
  1372. con = <Fragment>
  1373. <div className={`${styles.sub_part}`}>
  1374. <div className={`${styles.subtitle}`}>颜色</div>
  1375. <FormItem
  1376. key={'fzx_color'}
  1377. label={''}
  1378. >
  1379. <div className={styles.fzx_color_show}>
  1380. <div className={styles.show_color} onClick={() => this.showColorPicker('showColorPicker', true)}>
  1381. <span style={{ backgroundColor: data.color }}></span>
  1382. </div>
  1383. <a onClick={(e) => {e.preventDefault(); this.onChange('#e3e5e9', 'color') }}>重置</a>
  1384. </div>
  1385. {showColorPicker && (
  1386. <div className={styles.color_picker_wrap}>
  1387. <div className={styles.color_picker_mask}
  1388. onClick={() => this.showColorPicker('showColorPicker', false)}/>
  1389. <SketchPicker
  1390. color={data.color}
  1391. onChangeComplete={(e) => this.onChange('rgba(' + e.rgb.r + ',' + e.rgb.g + ',' + e.rgb.b + ',' + e.rgb.a + ')', 'color')}/>
  1392. </div>
  1393. )}
  1394. </FormItem>
  1395. </div>
  1396. <div className={`${styles.sub_part}`}>
  1397. <div className={`${styles.subtitle}`}>上下边距</div>
  1398. <FormItem
  1399. key={'fzx_tbmargin'}
  1400. label={''}
  1401. >
  1402. <Slider min={0} max={50} defaultValue={data.tbmargin} onChange={(e) => this.onChange(e, 'tbmargin')}/>
  1403. </FormItem>
  1404. </div>
  1405. <div className={`${styles.sub_part}`}>
  1406. <div className={`${styles.subtitle}`}>左右边距</div>
  1407. <FormItem
  1408. key={'fzx_lrmargin'}
  1409. label={''}
  1410. >
  1411. <Slider min={0} max={50} defaultValue={data.lrmargin} onChange={(e) => this.onChange(e, 'lrmargin')}/>
  1412. </FormItem>
  1413. </div>
  1414. <div className={`${styles.sub_part}`} style={{ borderBottomWidth: 0 }}>
  1415. <div className={`${styles.subtitle}`}>样式</div>
  1416. <FormItem
  1417. key={'fzx_border_type'}
  1418. label={''}
  1419. >
  1420. {getFieldDecorator('fzx_border_type', { initialValue: data.val })(
  1421. <Radio.Group onChange={(e) => this.onChange(e.target.value, 'val')}>
  1422. <Radio value={'solid'}>实线</Radio>
  1423. <Radio value={'dashed'}>虚线</Radio>
  1424. <Radio value={'dotted'}>点线</Radio>
  1425. </Radio.Group>,
  1426. )}
  1427. </FormItem>
  1428. </div>
  1429. </Fragment>
  1430. } else if (data.type == 'fzkb') {
  1431. //辅助线
  1432. con = <Fragment>
  1433. <div className={`${styles.sub_part}`}>
  1434. <div className={`${styles.subtitle}`}>颜色</div>
  1435. <FormItem
  1436. key={'fzkb_color'}
  1437. label={''}
  1438. >
  1439. <div className={styles.fzx_color_show}>
  1440. <div className={styles.show_color} onClick={() => this.showColorPicker('showColorPicker', true)}>
  1441. <span style={{ backgroundColor: data.color }}></span>
  1442. </div>
  1443. <a onClick={(e) => {e.preventDefault(); this.onChange('#fff', 'color') }}>重置</a>
  1444. </div>
  1445. {showColorPicker && (
  1446. <div className={styles.color_picker_wrap}>
  1447. <div className={styles.color_picker_mask}
  1448. onClick={() => this.showColorPicker('showColorPicker', false)}/>
  1449. <SketchPicker
  1450. color={data.color}
  1451. onChangeComplete={(e) => this.onChange(e.hex, 'color')}/>
  1452. </div>
  1453. )}
  1454. </FormItem>
  1455. </div>
  1456. <div className={`${styles.sub_part}`} style={{ borderBottomWidth: 0 }}>
  1457. <div className={`${styles.subtitle}`}>空白高度</div>
  1458. <FormItem
  1459. key={'fzkb_text'}
  1460. label={''}
  1461. >
  1462. <Slider min={10} defaultValue={data.text} onChange={(e) => this.onChange(e, 'text')}/>
  1463. </FormItem>
  1464. </div>
  1465. </Fragment>
  1466. } else if (data.type == 'fuwenben') {
  1467. //富文本
  1468. con = <Fragment>
  1469. <div className={global.goods_sku_tab}
  1470. style={{ display: 'flex', flex: 1, marginTop: 20, position: 'relative' }}>
  1471. <SldReactQuill
  1472. value={quillEscapeToHtml(data.text)}
  1473. getRQContent={(con) => this.handleGetContent(con, 'text')}
  1474. toolbarOptions = {toolbarOptions}
  1475. />
  1476. </div>
  1477. </Fragment>
  1478. } else if (data.type == 'kefu') {
  1479. //客服
  1480. con = <Fragment>
  1481. <div className={`${styles.sub_part}`}>
  1482. <div className={`${styles.subtitle}`}>客服文本</div>
  1483. <FormItem
  1484. key={'kefu_text'}
  1485. label={''}
  1486. >
  1487. <Input maxLength={10} style={{ width: 300 }} placeholder={'请输入客服文本,最多10个字'} value={data.text}
  1488. onChange={(e) => this.onChange(e.target.value, 'text')}/>
  1489. </FormItem>
  1490. </div>
  1491. <div className={`${styles.sub_part}`} style={{ borderBottomWidth: 0 }}>
  1492. <div className={`${styles.subtitle}`}>客服电话</div>
  1493. <FormItem
  1494. key={'kefu_tel'}
  1495. label={''}
  1496. >
  1497. <Input maxLength={13} style={{ width: 300 }} placeholder={'请输入客服电话'} value={data.tel}
  1498. onChange={(e) => this.onChange(e.target.value, 'tel')}/>
  1499. </FormItem>
  1500. </div>
  1501. </Fragment>;
  1502. } else if (data.type == 'gonggao') {
  1503. //公告
  1504. con = <Fragment>
  1505. <div className={`${styles.sub_part}`}>
  1506. <div className={`${styles.subtitle}`}>展示风格</div>
  1507. <FormItem
  1508. key={'svideo_show_style'}
  1509. label={''}
  1510. >
  1511. <div className={`${styles.com_default_styles} ${global.flex_com_row_start_center}`}>
  1512. {sld_m_diy_notice_style.map(item => {
  1513. return <div key={item.sele_style}
  1514. className={`${styles.notice_show_style_item} ${global.flex_com_row_center} ${data.show_style == item.sele_style ? styles.sel_svideo_show_style : null}`}
  1515. onClick={() => this.handleNoticeStyle(item.sele_style)}>
  1516. <img src={item.img}/>
  1517. </div>;
  1518. })}
  1519. </div>
  1520. </FormItem>
  1521. </div>
  1522. <div className={`${styles.sub_part}`}>
  1523. <div className={`${styles.subtitle}`}>公告内容</div>
  1524. <FormItem
  1525. key={'gonggao_text'}
  1526. label={''}
  1527. >
  1528. <Input maxLength={200} style={{ width: 300 }} placeholder={'请输入公告内容,最多200字'}
  1529. onChange={(e) => this.onChange(e.target.value, 'text')} value={data.text}/>
  1530. </FormItem>
  1531. </div>
  1532. <div className={`${styles.sub_part}`} style={{ borderBottomWidth: 0 }}>
  1533. <div className={`${styles.subtitle}`}>公告链接</div>
  1534. <FormItem
  1535. key={'gonggao_url'}
  1536. label={''}
  1537. >
  1538. <Select
  1539. value={data.url_type}
  1540. style={{ width: 300 }}
  1541. placeholder={'请选择链接类型'}
  1542. onSelect={this.sldHandSeleLink}
  1543. getPopupContainer={triggerNode => triggerNode.parentNode}
  1544. >
  1545. {m_diy_spreader_link_type().map((item, index) =>
  1546. <Option key={index} value={item.key}>{item.name}</Option>,
  1547. )}
  1548. </Select>
  1549. </FormItem>
  1550. </div>
  1551. {this.getDetailItem(data)}
  1552. </Fragment>
  1553. } else if (data.type == 'dapei') {
  1554. //搭配
  1555. con = <Fragment>
  1556. <div className={`${styles.sub_part}`}>
  1557. <div className={`${styles.subtitle}`}>搭配图片</div>
  1558. <FormItem
  1559. key={'dapei_img'}
  1560. label={''}
  1561. >
  1562. <div className={`${styles.dape_img} ${global.flex_com_column_start_start}`}>
  1563. {data.dapei_img != '' &&
  1564. <div className={`${styles.upload_img} ${global.flex_com_row_center}`}>
  1565. <img src={data.dapei_img}/>
  1566. <div className={styles.img_mask}>
  1567. <span className={styles.img_del} onClick={() => this.delImg(data)}>
  1568. {sldTsvg('shanchu4', '#fff', 15, 15)}
  1569. </span>
  1570. </div>
  1571. </div>
  1572. }
  1573. <Upload
  1574. withCredentials={true}
  1575. beforeUpload={sldBeforeUpload}
  1576. accept={'.gif, .jpeg, .png,.jpg,'}
  1577. showUploadList={false}
  1578. name={'file'}
  1579. action={`${apiUrl}v3/oss/common/upload?source=adminDeco`}
  1580. onChange={(info) => this.setImg(info)}
  1581. headers={{
  1582. Authorization: 'Bearer ' + getLocalStorageStingVal('sld_token'),
  1583. }}
  1584. >
  1585. <Button>
  1586. <Icon type="upload"/> 上传图片
  1587. </Button>
  1588. </Upload>
  1589. <span
  1590. className={styles.modal_tip_color}>此处建议上传宽度为750,高度不限制的图片;支持格式gif,jpg,png。</span>
  1591. </div>
  1592. </FormItem>
  1593. </div>
  1594. <div className={`${styles.sub_part}`}>
  1595. <div className={`${styles.subtitle}`}>图片标题</div>
  1596. <FormItem
  1597. key={'dapei_title'}
  1598. label={''}
  1599. >
  1600. <Input maxLength={15} style={{ width: 300 }} placeholder={'请输入图片标题'}
  1601. onChange={(e) => this.onChange(e.target.value, 'dapei_title')} value={data.dapei_title}/>
  1602. </FormItem>
  1603. </div>
  1604. <div className={`${styles.sub_part}`}>
  1605. <div className={`${styles.subtitle}`}>图片描述</div>
  1606. <FormItem
  1607. key={'dapei_desc'}
  1608. label={''}
  1609. >
  1610. <Input maxLength={50} style={{ width: 300 }} placeholder={'请输入图片描述'}
  1611. onChange={(e) => this.onChange(e.target.value, 'dapei_desc')} value={data.dapei_desc}/>
  1612. </FormItem>
  1613. </div>
  1614. <div className={`${styles.sub_part}`} style={{ borderBottomWidth: 0 }}>
  1615. <div className={`${styles.subtitle}`}>选择商品</div>
  1616. <FormItem
  1617. key={'dapei_goods'}
  1618. label={''}
  1619. >
  1620. <div className={`${styles.selected_svideo} ${global.flex_column_start_start}`}>
  1621. <div className={`${styles.add_svideo_wrap} ${global.flex_row_start_center}`}>
  1622. <span className={`${styles.required}`}>*</span>
  1623. <span className={`${styles.title}`}>商品添加:</span>
  1624. <a className={`${styles.add_svideo_btn}`}
  1625. onClick={(e) => {e.preventDefault(); this.selMoreGoods(data) }}>+ 添加</a>
  1626. <span className={`${styles.tip}`}>最少添加3个,最多添加9个</span>
  1627. </div>
  1628. {data.data.info.length > 0 &&
  1629. <Fragment>
  1630. <div className={`${styles.selected_svideo_list_title}`}>
  1631. <span style={{ width: 50 }}>序号</span>
  1632. <span style={{ width: 176 }}>商品信息</span>
  1633. <span style={{ width: 80 }}>价格</span>
  1634. <span style={{ width: 50 }}>操作</span>
  1635. </div>
  1636. <div className={`${styles.selected_svideo_list}`}>
  1637. {data.data.info.map((svideo_item, svideo_index) => {
  1638. return <div className={`${styles.selected_svideo_item} ${global.flex_row_start_center}`}>
  1639. <span style={{ width: 50 }}>{svideo_index + 1}</span>
  1640. <div className={`${styles.svideo_info} ${global.flex_row_start_center}`}>
  1641. <div className={`${styles.left} ${global.flex_row_center_center}`}>
  1642. <img src={svideo_item.goodsImage}/>
  1643. </div>
  1644. <div className={`${styles.right} ${global.flex_column_start_start}`}>
  1645. <span className={styles.video_name}>{svideo_item.goodsName}</span>
  1646. </div>
  1647. </div>
  1648. <span style={{ width: 80 }}>{svideo_item.productPrice * 1}</span>
  1649. <div onClick={() => this.delGoods(svideo_item.goodsId)}
  1650. className={`${styles.operate} ${global.flex_row_center_center}`}>
  1651. <ALibbSvg fill={'#2d2d2d'} width={18} height={18} type={'shanchu5'}/>
  1652. </div>
  1653. </div>;
  1654. })}
  1655. </div>
  1656. </Fragment>
  1657. }
  1658. </div>
  1659. </FormItem>
  1660. </div>
  1661. </Fragment>;
  1662. } else if (data.type == 'tuijianshangpin') {
  1663. //推荐商品
  1664. con = <Fragment>
  1665. <div className={`${styles.sub_part}`}>
  1666. <div className={`${styles.subtitle}`}>商品销量</div>
  1667. <FormItem
  1668. key={'tjsp_isshow_sales'}
  1669. label={''}
  1670. >
  1671. {getFieldDecorator('tjsp_isshow_sales', { initialValue: data.isshow_sales })(
  1672. <Radio.Group onChange={(e) => this.onChange(e.target.value, 'isshow_sales')}>
  1673. <Radio value={1}>展示</Radio>
  1674. <Radio value={0}>隐藏</Radio>
  1675. </Radio.Group>,
  1676. )}
  1677. </FormItem>
  1678. </div>
  1679. <div className={`${styles.sub_part}`}>
  1680. <div className={`${styles.subtitle}`}>展示类型</div>
  1681. <FormItem
  1682. key={'tjsp_show_style'}
  1683. label={''}
  1684. >
  1685. {getFieldDecorator('tjsp_show_style', { initialValue: data.show_style })(
  1686. <Radio.Group onChange={(e) => this.onChange(e.target.value, 'show_style')}>
  1687. <Radio value={'big'}>大图</Radio>
  1688. <Radio value={'small'}>一行两个</Radio>
  1689. <Radio value={'list'}>列表</Radio>
  1690. </Radio.Group>,
  1691. )}
  1692. </FormItem>
  1693. </div>
  1694. <div className={`${styles.sub_part}`}>
  1695. <div className={`${styles.subtitle}`}>商品边角</div>
  1696. <FormItem
  1697. key={'tjsp_border_radius'}
  1698. label={''}
  1699. >
  1700. {getFieldDecorator('tjsp_border_radius', { initialValue: data.border_radius })(
  1701. <Radio.Group onChange={(e) => this.onChange(e.target.value, 'border_radius')}>
  1702. <Radio value={10}>圆角</Radio>
  1703. <Radio value={0}>直角</Radio>
  1704. </Radio.Group>,
  1705. )}
  1706. </FormItem>
  1707. </div>
  1708. <div className={`${styles.sub_part}`}>
  1709. <div className={`${styles.subtitle}`}>商品样式</div>
  1710. <FormItem
  1711. key={'tjsp_border_style'}
  1712. label={''}
  1713. >
  1714. {getFieldDecorator('tjsp_border_style', { initialValue: data.border_style })(
  1715. <Radio.Group onChange={(e) => this.onChange(e.target.value, 'border_style')}>
  1716. <Radio value={'border_none'}>无边白底</Radio>
  1717. <Radio value={'card-shadow'}>卡片投影</Radio>
  1718. <Radio value={'border_eee'}>描边白底</Radio>
  1719. <Radio value={'border_none_grey_bg'}>无边灰底</Radio>
  1720. </Radio.Group>,
  1721. )}
  1722. </FormItem>
  1723. </div>
  1724. <div className={`${styles.sub_part}`}>
  1725. <div className={`${styles.subtitle}`}>页面边距</div>
  1726. <FormItem
  1727. key={'tjsp_page_margin'}
  1728. label={''}
  1729. >
  1730. <Slider min={0} max={30} defaultValue={data.page_margin}
  1731. onChange={(e) => this.onChange(e, 'page_margin')}/>
  1732. </FormItem>
  1733. </div>
  1734. <div className={`${styles.sub_part}`}>
  1735. <div className={`${styles.subtitle}`}>商品间距</div>
  1736. <FormItem
  1737. key={'tjsp_goods_margin'}
  1738. label={''}
  1739. >
  1740. <Slider min={0} max={20} defaultValue={data.goods_margin}
  1741. onChange={(e) => this.onChange(e, 'goods_margin')}/>
  1742. </FormItem>
  1743. </div>
  1744. <div className={`${styles.sub_part}`} style={{ borderBottomWidth: 0 }}>
  1745. <div className={`${styles.subtitle}`}>选择商品</div>
  1746. <FormItem
  1747. key={'tjsp_goods'}
  1748. label={''}
  1749. >
  1750. <div className={`${styles.selected_svideo} ${global.flex_column_start_start}`}>
  1751. <div className={`${styles.add_svideo_wrap} ${global.flex_row_start_center}`}>
  1752. <span className={`${styles.required}`}>*</span>
  1753. <span className={`${styles.title}`}>商品添加:</span>
  1754. <a className={`${styles.add_svideo_btn}`}
  1755. onClick={(e) => {e.preventDefault(); this.selMoreGoods(data) }}>+ 添加</a>
  1756. <span className={`${styles.tip}`}>最少添加1个</span>
  1757. </div>
  1758. {data.data.info.length > 0 &&
  1759. <Fragment>
  1760. <div className={`${styles.selected_svideo_list_title}`}>
  1761. <span style={{ width: 50 }}>序号</span>
  1762. <span style={{ width: 176 }}>商品信息</span>
  1763. <span style={{ width: 80 }}>价格</span>
  1764. <span style={{ width: 50 }}>操作</span>
  1765. </div>
  1766. <div className={`${styles.selected_svideo_list}`}>
  1767. {data.data.info.map((svideo_item, svideo_index) => {
  1768. return <div className={`${styles.selected_svideo_item} ${global.flex_row_start_center}`}>
  1769. <span style={{ width: 50 }}>{svideo_index + 1}</span>
  1770. <div className={`${styles.svideo_info} ${global.flex_row_start_center}`}>
  1771. <div className={`${styles.left} ${global.flex_row_center_center}`}>
  1772. <img src={svideo_item.goodsImage}/>
  1773. </div>
  1774. <div className={`${styles.right} ${global.flex_column_start_start}`} >
  1775. <span className={styles.video_name}>{svideo_item.goodsName}</span>
  1776. </div>
  1777. </div>
  1778. <span style={{ width: 80 }}>{svideo_item.productPrice * 1}</span>
  1779. <div onClick={() => this.delGoods(svideo_item.goodsId)}
  1780. className={`${styles.operate} ${global.flex_row_center_center}`}>
  1781. <ALibbSvg fill={'#2d2d2d'} width={18} height={18} type={'shanchu5'}/>
  1782. </div>
  1783. </div>;
  1784. })}
  1785. </div>
  1786. </Fragment>
  1787. }
  1788. </div>
  1789. </FormItem>
  1790. </div>
  1791. </Fragment>;
  1792. } else if (data.type == 'svideo') {
  1793. //短视频
  1794. con = <Fragment>
  1795. <div className={`${styles.sub_part}`}>
  1796. <div className={`${styles.subtitle}`}>展示风格</div>
  1797. <FormItem
  1798. key={'svideo_show_style'}
  1799. label={''}
  1800. >
  1801. <div className={`${styles.com_default_styles} ${global.flex_com_row_start_center}`}>
  1802. {sld_m_diy_svideo_style.map(item => {
  1803. return <div key={item.sele_style}
  1804. className={`${styles.svideo_show_style_item} ${global.flex_com_row_center} ${data.show_style == item.sele_style ? styles.sel_svideo_show_style : null}`}
  1805. onClick={() => this.handleVideoStyle(item.sele_style)}>
  1806. <img src={item.img}/>
  1807. </div>;
  1808. })}
  1809. </div>
  1810. </FormItem>
  1811. </div>
  1812. <div className={`${styles.sub_part}`}>
  1813. <div className={`${styles.subtitle}`}>短视频卡片边角</div>
  1814. <FormItem
  1815. key={'svideo_border_radius'}
  1816. label={''}
  1817. >
  1818. {getFieldDecorator('svideo_border_radius', { initialValue: data.border_radius })(
  1819. <Radio.Group onChange={(e) => this.onChange(e.target.value, 'border_radius')}>
  1820. <Radio value={8}>圆角</Radio>
  1821. <Radio value={0}>直角</Radio>
  1822. </Radio.Group>,
  1823. )}
  1824. </FormItem>
  1825. </div>
  1826. <div className={`${styles.sub_part}`}>
  1827. <div className={`${styles.subtitle}`}>设置标题</div>
  1828. <FormItem
  1829. key={'svideo_title'}
  1830. label={''}
  1831. >
  1832. <Input maxLength={10} style={{ width: 300 }} placeholder={'请输入标题,最多10个字'} value={data.title}
  1833. onChange={(e) => this.onChange(e.target.value, 'title')}/>
  1834. </FormItem>
  1835. </div>
  1836. <div className={`${styles.sub_part}`} style={{ borderBottomWidth: 0 }}>
  1837. <div className={`${styles.subtitle}`}>添加短视频</div>
  1838. <FormItem
  1839. key={'svideo_list'}
  1840. label={''}
  1841. >
  1842. <div className={`${styles.selected_svideo} ${global.flex_column_start_start}`}>
  1843. <div className={`${styles.add_svideo_wrap} ${global.flex_row_start_center}`}>
  1844. <span className={`${styles.required}`}>*</span>
  1845. <span className={`${styles.title}`}>视频添加:</span>
  1846. <a className={`${styles.add_svideo_btn}`}
  1847. onClick={(e) => {e.preventDefault(); this.selMoreSvideo(data) }}>+ 添加</a>
  1848. {/*<span className={`${styles.tip}`}>最多添加{this.sele_more_svideo.min_num}个</span>*/}
  1849. </div>
  1850. {data.data.info.length > 0 &&
  1851. <Fragment>
  1852. <div className={`${styles.selected_svideo_list_title}`}>
  1853. <span style={{ width: 50 }}>序号</span>
  1854. <span style={{ width: 176 }}>短视频信息</span>
  1855. <span style={{ width: 80 }}>播放量</span>
  1856. <span style={{ width: 50 }}>操作</span>
  1857. </div>
  1858. <div className={`${styles.selected_svideo_list}`}>
  1859. {data.data.info.map((svideo_item, svideo_index) => {
  1860. return <div className={`${styles.selected_svideo_item} ${global.flex_row_start_center}`}>
  1861. <span style={{ width: 50 }}>{svideo_index + 1}</span>
  1862. <div className={`${styles.svideo_info} ${global.flex_row_start_center}`}>
  1863. <div className={`${styles.left} ${global.flex_row_center_center}`}>
  1864. <img src={svideo_item.video_image}/>
  1865. <div className={`${styles.play_icon}`}>
  1866. <ALibbSvg fill={'#fff'} width={22} height={22} type={'bofang11'}/>
  1867. </div>
  1868. </div>
  1869. <div className={`${styles.right} ${global.flex_column_start_start}`}>
  1870. <span className={styles.video_name}>{svideo_item.video_name}</span>
  1871. <span className={styles.video_label}>{svideo_item.label_name}</span>
  1872. </div>
  1873. </div>
  1874. <span style={{ width: 80 }}>{svideo_item.click_num}</span>
  1875. <div onClick={() => this.delSvideo(svideo_item.video_id)}
  1876. className={`${styles.operate} ${global.flex_row_center_center}`}>
  1877. <ALibbSvg fill={'#2d2d2d'} width={18} height={18} type={'shanchu5'}/>
  1878. </div>
  1879. </div>;
  1880. })}
  1881. </div>
  1882. </Fragment>
  1883. }
  1884. </div>
  1885. </FormItem>
  1886. </div>
  1887. </Fragment>;
  1888. } else if (data.type == 'live') {
  1889. //直播
  1890. con = <Fragment>
  1891. <div className={`${styles.sub_part}`}>
  1892. <div className={`${styles.subtitle}`}>展示风格</div>
  1893. <FormItem
  1894. key={'live_show_style'}
  1895. label={''}
  1896. >
  1897. <div className={`${styles.com_default_styles} ${global.flex_com_row_start_center}`}>
  1898. {sld_m_diy_live_style.map(item => {
  1899. return <div key={item.sele_style}
  1900. className={`${styles.svideo_show_style_item} ${global.flex_com_row_center} ${data.show_style == item.sele_style ? styles.sel_svideo_show_style : null}`}
  1901. onClick={() => this.handleLiveStyle(item.sele_style)}>
  1902. <img src={item.img}/>
  1903. </div>;
  1904. })}
  1905. </div>
  1906. </FormItem>
  1907. </div>
  1908. <div className={`${styles.sub_part}`}>
  1909. <div className={`${styles.subtitle}`}>直播卡片边角</div>
  1910. <FormItem
  1911. key={'live_border_radius'}
  1912. label={''}
  1913. >
  1914. {getFieldDecorator('live_border_radius', { initialValue: data.border_radius })(
  1915. <Radio.Group onChange={(e) => this.onChange(e.target.value, 'border_radius')}>
  1916. <Radio value={8}>圆角</Radio>
  1917. <Radio value={0}>直角</Radio>
  1918. </Radio.Group>,
  1919. )}
  1920. </FormItem>
  1921. </div>
  1922. <div className={`${styles.sub_part}`}>
  1923. <div className={`${styles.subtitle}`}>设置标题</div>
  1924. <FormItem
  1925. key={'live_title'}
  1926. label={''}
  1927. >
  1928. <Input maxLength={10} style={{ width: 300 }} placeholder={'请输入标题,最多10个字'} value={data.title}
  1929. onChange={(e) => this.onChange(e.target.value, 'title')}/>
  1930. </FormItem>
  1931. </div>
  1932. <div className={`${styles.sub_part}`} style={{ borderBottomWidth: 0 }}>
  1933. <div className={`${styles.subtitle}`}>添加直播</div>
  1934. <FormItem
  1935. key={'live_list'}
  1936. label={''}
  1937. >
  1938. <div className={`${styles.selected_svideo} ${global.flex_column_start_start}`}>
  1939. <div className={`${styles.add_svideo_wrap} ${global.flex_row_start_center}`}>
  1940. <span className={`${styles.required}`}>*</span>
  1941. <span className={`${styles.title}`}>直播添加:</span>
  1942. <a className={`${styles.add_svideo_btn}`}
  1943. onClick={(e) => {e.preventDefault(); this.selMoreLive(data) }}>+ 添加</a>
  1944. {/*<span className={`${styles.tip}`}>最多添加30个</span>*/}
  1945. </div>
  1946. {data.data.info.length > 0 &&
  1947. <Fragment>
  1948. <div className={`${styles.selected_svideo_list_title}`}>
  1949. <span style={{ width: 50 }}>序号</span>
  1950. <span style={{ width: 176 }}>直播信息</span>
  1951. <span style={{ width: 80 }}>播放量</span>
  1952. <span style={{ width: 50 }}>操作</span>
  1953. </div>
  1954. <div className={`${styles.selected_svideo_list}`}>
  1955. {data.data.info.map((svideo_item, svideo_index) => {
  1956. return <div className={`${styles.selected_svideo_item} ${global.flex_row_start_center}`}>
  1957. <span style={{ width: 50 }}>{svideo_index + 1}</span>
  1958. <div className={`${styles.svideo_info} ${global.flex_row_start_center}`}>
  1959. <div className={`${styles.left} ${global.flex_row_center_center}`}>
  1960. <img src={svideo_item.live_image_url}/>
  1961. <div className={`${styles.play_icon}`}>
  1962. <ALibbSvg fill={'#fff'} width={22} height={22} type={'bofang11'}/>
  1963. </div>
  1964. </div>
  1965. <div className={`${styles.right} ${global.flex_column_start_start}`}>
  1966. <span className={styles.video_name}>{svideo_item.live_name}</span>
  1967. <span className={styles.video_label}>{svideo_item.label_name}</span>
  1968. </div>
  1969. </div>
  1970. <span style={{ width: 80 }}>{svideo_item.click_num}</span>
  1971. <div onClick={() => this.delLive(svideo_item.live_id)}
  1972. className={`${styles.operate} ${global.flex_row_center_center}`}>
  1973. <ALibbSvg fill={'#2d2d2d'} width={18} height={18} type={'shanchu5'}/>
  1974. </div>
  1975. </div>;
  1976. })}
  1977. </div>
  1978. </Fragment>
  1979. }
  1980. </div>
  1981. </FormItem>
  1982. </div>
  1983. </Fragment>;
  1984. } else if (data.type == 'more_tab') {
  1985. //TAB切换
  1986. con = <Fragment>
  1987. <div className={`${styles.sub_part}`} style={{ borderBottomWidth: 0 }}>
  1988. <div className={`${styles.subtitle}`}>数据卡片边角</div>
  1989. <FormItem
  1990. key={'more_tab_border_radius'}
  1991. label={''}
  1992. >
  1993. {getFieldDecorator('more_tab_border_radius', { initialValue: data.border_radius })(
  1994. <Radio.Group onChange={(e) => this.onChange(e.target.value, 'border_radius')}>
  1995. <Radio value={8}>圆角</Radio>
  1996. <Radio value={0}>直角</Radio>
  1997. </Radio.Group>,
  1998. )}
  1999. </FormItem>
  2000. </div>
  2001. {data.data.length > 0 && data.data.map((more_tab_item, more_tab_index) => {
  2002. return <div key={more_tab_index} className={`${styles.selected_more_tab} ${global.flex_column_start_start}`}>
  2003. <div className={`${global.flex_com_column_flex_end} ${styles.del_sld_more_tab_item}`}
  2004. onClick={() => this.delSldComImg(more_tab_index)}>
  2005. {sldTsvg('qingchu', '#666', 16, 16)}
  2006. </div>
  2007. <div className={`${styles.add_svideo_wrap} ${global.flex_row_start_center}`}
  2008. style={{ paddingTop: 15, paddingBottom: 5 }}>
  2009. <span className={`${styles.required}`}>*</span>
  2010. <span className={`${styles.title}`}>分类标题:</span>
  2011. <FormItem
  2012. key={'gonggao_text'}
  2013. label={''}
  2014. >
  2015. <Input maxLength={4} style={{ width: 263, marginLeft: 9 }} placeholder={'请输入分类标题,最多4个字'}
  2016. onChange={(e) => this.onChange(e.target.value, 'title', more_tab_index)}
  2017. value={more_tab_item.title}/>
  2018. </FormItem>
  2019. </div>
  2020. <div className={`${styles.add_svideo_wrap} ${global.flex_row_start_center}`} style={{ paddingBottom: 5 }}>
  2021. <span className={`${styles.required}`} style={{ marginLeft: 29 }}>*</span>
  2022. <span className={`${styles.title}`}>子标题:</span>
  2023. <FormItem
  2024. key={'gonggao_sub_title'}
  2025. label={''}
  2026. >
  2027. <Input maxLength={6} style={{ width: 263, marginLeft: 9 }} placeholder={'请输入分类子标题,最多6个字'}
  2028. onChange={(e) => this.onChange(e.target.value, 'sub_title', more_tab_index)}
  2029. value={more_tab_item.sub_title}/>
  2030. </FormItem>
  2031. </div>
  2032. <div className={`${styles.add_svideo_wrap} ${global.flex_row_start_center} ${styles.add_data_special}`}
  2033. style={{ height: 70 }}>
  2034. <span className={`${styles.required}`}>*</span>
  2035. <span className={`${styles.title}`}>数据添加:</span>
  2036. <a className={`${styles.add_svideo_btn}`}
  2037. onClick={(e) => {e.preventDefault(); this.selMoreTabData(data, more_tab_index) }}>+ 添加</a>
  2038. <span className={`${styles.tip}`}>需要选择偶数个,最少2个</span>
  2039. </div>
  2040. {more_tab_item.info.length > 0 && this.renderMoreTabSeleData(more_tab_item.info, more_tab_item.data_type, more_tab_index)}
  2041. </div>;
  2042. })}
  2043. <div className={`${styles.add_goods_wrap} ${global.flex_row_center_center}`}
  2044. onClick={() => this.addMoreTabNav(data)}>
  2045. + 添加分类导航
  2046. </div>
  2047. </Fragment>;
  2048. } else if (data.type == 'activity') {
  2049. //活动组
  2050. con = <Fragment>
  2051. <div className={`${styles.sub_part}`}>
  2052. <div className={`${styles.subtitle}`}>活动类型</div>
  2053. <FormItem
  2054. key={'activity_show_style'}
  2055. label={''}
  2056. >
  2057. <div className={`${styles.com_default_styles} ${global.flex_com_row_start_center}`}>
  2058. {sld_m_diy_activity_style.map(item => {
  2059. return <div key={item.sele_style}
  2060. className={`${styles.svideo_show_style_item} ${global.flex_com_row_center} ${data.show_style == item.sele_style ? styles.sel_svideo_show_style : null}`}
  2061. onClick={() => this.handleActivityStyle(item.sele_style)}>
  2062. <img src={item.img}/>
  2063. </div>;
  2064. })}
  2065. </div>
  2066. </FormItem>
  2067. </div>
  2068. <div className={`${styles.sub_part}`}>
  2069. <div className={`${styles.subtitle}`}>数据卡片边角</div>
  2070. <FormItem
  2071. key={'activity_border_radius'}
  2072. label={''}
  2073. >
  2074. {getFieldDecorator('activity_border_radius', { initialValue: data.border_radius })(
  2075. <Radio.Group onChange={(e) => this.onChange(e.target.value, 'border_radius')}>
  2076. <Radio value={8}>圆角</Radio>
  2077. <Radio value={0}>直角</Radio>
  2078. </Radio.Group>,
  2079. )}
  2080. </FormItem>
  2081. </div>
  2082. <div className={`${styles.sub_part}`}>
  2083. <div className={`${styles.subtitle}`}>活动标签背景颜色设置</div>
  2084. <FormItem
  2085. key={'activity_tag_bg_color'}
  2086. label={''}
  2087. >
  2088. <div className={styles.fzx_color_show}>
  2089. <div className={styles.show_color} onClick={() => this.showColorPicker('showColorPicker2', true)}>
  2090. <span style={{ backgroundColor: data.tag_bg_color }}></span>
  2091. </div>
  2092. <a onClick={(e) => {e.preventDefault(); this.onChange('', 'tag_bg_color') }}>默认</a>
  2093. </div>
  2094. {showColorPicker2 && (
  2095. <div className={styles.color_picker_wrap}>
  2096. <div className={styles.color_picker_mask}
  2097. onClick={() => this.showColorPicker('showColorPicker2', false)}/>
  2098. <SketchPicker
  2099. color={data.tag_bg_color}
  2100. onChangeComplete={(e) => this.onChange('rgba(' + e.rgb.r + ',' + e.rgb.g + ',' + e.rgb.b + ',' + e.rgb.a + ')', 'tag_bg_color')}/>
  2101. </div>
  2102. )}
  2103. </FormItem>
  2104. </div>
  2105. <div className={`${styles.sub_part}`}>
  2106. <div className={`${styles.subtitle}`}>活动主标题</div>
  2107. <FormItem
  2108. key={'activity_title'}
  2109. label={''}
  2110. >
  2111. <Input maxLength={15} style={{ width: 300 }} placeholder={'请输入主标题,最多15个字'}
  2112. onChange={(e) => this.onChange(e.target.value, 'title')} value={data.title}/>
  2113. </FormItem>
  2114. </div>
  2115. {data.show_style != 'pin' &&
  2116. <div className={`${styles.sub_part}`}>
  2117. <div className={`${styles.subtitle}`}>活动子标题</div>
  2118. <FormItem
  2119. key={'activity_sub_title'}
  2120. label={''}
  2121. >
  2122. <Input maxLength={50} style={{ width: 300 }} placeholder={'请输入子标题,最多50个字'}
  2123. onChange={(e) => this.onChange(e.target.value, 'sub_title')} value={data.sub_title}/>
  2124. </FormItem>
  2125. </div>
  2126. }
  2127. <div className={`${styles.sub_part}`} style={{ borderBottomWidth: 0 }}>
  2128. <div className={`${styles.subtitle}`}>选择商品</div>
  2129. <FormItem
  2130. key={'activity_goods'}
  2131. label={''}
  2132. >
  2133. <div className={`${styles.selected_svideo} ${global.flex_column_start_start}`}>
  2134. <div className={`${styles.add_svideo_wrap} ${global.flex_row_start_center}`}>
  2135. <span className={`${styles.required}`}>*</span>
  2136. <span className={`${styles.title}`}>商品添加:</span>
  2137. <a className={`${styles.add_svideo_btn}`}
  2138. onClick={(e) => {e.preventDefault(); this.selMoreGoods(data) }}>+ 添加</a>
  2139. {/*<span className={`${styles.tip}`}>最少添加3个,最多添加9个</span>*/}
  2140. </div>
  2141. {data.data.info.length > 0 &&
  2142. <Fragment>
  2143. <div className={`${styles.selected_svideo_list_title}`}>
  2144. <span style={{ width: 50 }}>序号</span>
  2145. <span style={{ width: 176 }}>商品信息</span>
  2146. <span style={{ width: 80 }}>价格</span>
  2147. <span style={{ width: 50 }}>操作</span>
  2148. </div>
  2149. <div className={`${styles.selected_svideo_list}`}>
  2150. {data.data.info.map((svideo_item, svideo_index) => {
  2151. return <div className={`${styles.selected_svideo_item} ${global.flex_row_start_center}`}>
  2152. <span style={{ width: 50 }}>{svideo_index + 1}</span>
  2153. <div className={`${styles.svideo_info} ${global.flex_row_start_center}`}>
  2154. <div className={`${styles.left} ${global.flex_row_center_center}`}>
  2155. <img src={svideo_item.goodsImage}/>
  2156. </div>
  2157. <div className={`${styles.right} ${global.flex_column_start_start}`}>
  2158. <span className={styles.video_name}>{svideo_item.goodsName}</span>
  2159. </div>
  2160. </div>
  2161. <span style={{ width: 80 }}>{svideo_item.goodsPrice * 1}</span>
  2162. <div onClick={() => this.delGoods(svideo_item.goodsId)}
  2163. className={`${styles.operate} ${global.flex_row_center_center}`}>
  2164. <ALibbSvg fill={'#2d2d2d'} width={18} height={18} type={'shanchu5'}/>
  2165. </div>
  2166. </div>;
  2167. })}
  2168. </div>
  2169. </Fragment>
  2170. }
  2171. </div>
  2172. </FormItem>
  2173. </div>
  2174. </Fragment>;
  2175. }
  2176. return con;
  2177. };
  2178. render() {
  2179. const { select_data } = this.props;
  2180. const { link_type, modalVisibleGoods, sle_more_title } = this.state;
  2181. return (
  2182. <div className={styles.r_edit_wrap}>
  2183. <Form ref={'sld_mdiy_edit'} layout="horizontal">
  2184. {this.renderItem(select_data)}
  2185. </Form>
  2186. <SldSelGoodsSingleDiy link_type={link_type}
  2187. seleSku={this.seleSku}
  2188. sldHandleCancle={this.sldHandleLinkCancle}
  2189. client={'mobile'}/>
  2190. {/*商品多选的modal框-start*/}
  2191. <SldSelMoreLeftRightGoods selectedRows={this.sele_more_goods.info}
  2192. selectedRowKeys={this.sele_more_goods.ids}
  2193. modalVisible={modalVisibleGoods} width={1000}
  2194. height={document.body.clientHeight - 400}
  2195. sldHandleSeleMoreModalCancle={this.sldHandleCancle} seleSvideo={this.seleGoods}
  2196. title={sle_more_title} extra={this.sele_more_goods}/>
  2197. {/*商品多选的modal框-end*/}
  2198. </div>
  2199. );
  2200. }
  2201. }