index.js 105 KB

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