@capillarytech/creatives-library 2.0.62 → 2.0.64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/assets/NoImage1.js +50 -0
  2. package/assets/WithImage1.js +57 -0
  3. package/components/EmailPreview/assets/images/iPad.svg +10 -0
  4. package/components/EmailPreview/assets/images/mobile.png +0 -0
  5. package/components/FormBuilder/_formBuilder.scss +7 -1
  6. package/components/FormBuilder/index.js +97 -65
  7. package/components/MobilePushPreviewV2/index.js +120 -0
  8. package/components/MobilePushPreviewV2/messages.js +13 -0
  9. package/components/MobilePushPreviewV2/tests/index.test.js +10 -0
  10. package/components/TemplatePreview/index.js +1 -1
  11. package/containers/CreativesContainer/SlideBoxContent.js +27 -4
  12. package/containers/CreativesContainer/SlideBoxFooter.js +3 -3
  13. package/containers/CreativesContainer/index.js +71 -24
  14. package/containers/MobilePush/Create/_mobilePushCreate.scss +13 -0
  15. package/containers/MobilePush/Create/actions.js +6 -0
  16. package/containers/MobilePush/Create/constants.js +1 -0
  17. package/containers/MobilePush/Create/index.js +630 -1130
  18. package/containers/MobilePush/Create/messages.js +5 -1
  19. package/containers/MobilePush/Create/reducer.js +2 -0
  20. package/containers/MobilePush/Create/selectors.js +3 -3
  21. package/containers/MobilePush/Edit/_mobilePushCreate.scss +10 -0
  22. package/containers/MobilePush/Edit/index.js +375 -1106
  23. package/containers/MobilePush/Edit/messages.js +4 -0
  24. package/containers/MobilePush/Edit/reducer.js +2 -1
  25. package/containers/MobilePush/Edit/selectors.js +3 -1
  26. package/containers/MobilePush/commonMethods.js +249 -0
  27. package/containers/MobilePush/eventsMap.js +127 -0
  28. package/containers/MobilePush/initialSchema.js +1751 -0
  29. package/containers/MobilepushWrapper/_mobilepushWrapper.scss +18 -0
  30. package/containers/MobilepushWrapper/index.js +95 -0
  31. package/containers/MobilepushWrapper/messages.js +25 -0
  32. package/containers/MobilepushWrapper/tests/index.test.js +10 -0
  33. package/containers/WeChat/_wechat.scss +8 -0
  34. package/containers/WeChat/actions.js +52 -0
  35. package/containers/WeChat/constants.js +28 -0
  36. package/containers/WeChat/index.js +1635 -0
  37. package/containers/WeChat/messages.js +73 -0
  38. package/containers/WeChat/reducer.js +74 -0
  39. package/containers/WeChat/sagas.js +86 -0
  40. package/containers/WeChat/selectors.js +25 -0
  41. package/containers/WeChat/tests/actions.test.js +18 -0
  42. package/containers/WeChat/tests/index.test.js +10 -0
  43. package/containers/WeChat/tests/reducer.test.js +9 -0
  44. package/containers/WeChat/tests/sagas.test.js +15 -0
  45. package/containers/WeChat/tests/selectors.test.js +10 -0
  46. package/index.js +1 -1
  47. package/package.json +1 -1
  48. package/services/api.js +3 -0
@@ -0,0 +1,50 @@
1
+ import React from "react";
2
+ import PropsTypes from 'prop-types';
3
+ const SvgNoImage1 = (props) => (
4
+ <svg
5
+ width={props.width || "1em"}
6
+ height={props.height || "1em"}
7
+ viewBox="0 0 244 124"
8
+ fill="currentColor"
9
+ {...props}
10
+ >
11
+ <g fill="none" fillRule="evenodd">
12
+ <path
13
+ fill="#FFF"
14
+ fillRule="nonzero"
15
+ d="M7.692 0h228.616c2.675 0 3.645.278 4.623.801a5.452 5.452 0 0 1 2.268 2.268c.523.978.801 1.948.801 4.623v108.616c0 2.675-.278 3.645-.801 4.623a5.452 5.452 0 0 1-2.268 2.268c-.978.523-1.948.801-4.623.801H7.692c-2.675 0-3.645-.278-4.623-.801a5.452 5.452 0 0 1-2.268-2.268c-.523-.978-.801-1.948-.801-4.623V7.692c0-2.675.278-3.645.801-4.623A5.452 5.452 0 0 1 3.07.801C4.047.278 5.017 0 7.692 0z"
16
+ />
17
+ <circle cx={212.074} cy={61} r={19} fill="#F4F5F7" />
18
+ <circle cx={20} cy={19} r={8} fill="#F4F5F7" />
19
+ <rect width={62} height={12} x={12} y={45} fill="#EBECF0" rx={4} />
20
+ <rect width={162} height={12} x={12} y={65} fill="#EBECF0" rx={4} />
21
+ <rect
22
+ width={62}
23
+ height={20}
24
+ x={12}
25
+ y={92}
26
+ fill="#2466EA"
27
+ opacity={0.2}
28
+ rx={4}
29
+ />
30
+ <rect
31
+ width={62}
32
+ height={20}
33
+ x={86}
34
+ y={92}
35
+ fill="#2466EA"
36
+ opacity={0.2}
37
+ rx={4}
38
+ />
39
+ <rect width={54} height={12} x={32} y={13} fill="#F4F5F7" rx={4} />
40
+ <rect width={23} height={12} x={98} y={13} fill="#F4F5F7" rx={4} />
41
+ </g>
42
+ </svg>
43
+ );
44
+
45
+ SvgNoImage1.propTypes = {
46
+ width: PropsTypes.width,
47
+ height: PropsTypes.height,
48
+ };
49
+
50
+ export default SvgNoImage1;
@@ -0,0 +1,57 @@
1
+ import React from "react";
2
+
3
+ const SvgWithImage1 = (props) => (
4
+ <svg
5
+ width="1em"
6
+ height="1em"
7
+ viewBox="0 0 244 248"
8
+ fill="currentColor"
9
+ {...props}
10
+ >
11
+ <defs>
12
+ <rect id="with-image-1_svg__a" width={220} height={120} rx={4} />
13
+ </defs>
14
+ <g fill="none" fillRule="evenodd">
15
+ <path
16
+ fill="#FFF"
17
+ fillRule="nonzero"
18
+ d="M7.692 0h228.616c2.675 0 3.645.278 4.623.801a5.452 5.452 0 0 1 2.268 2.268c.523.978.801 1.948.801 4.623v232.616c0 2.675-.278 3.645-.801 4.623a5.452 5.452 0 0 1-2.268 2.268c-.978.523-1.948.801-4.623.801H7.692c-2.675 0-3.645-.278-4.623-.801a5.452 5.452 0 0 1-2.268-2.268c-.523-.978-.801-1.948-.801-4.623V7.692c0-2.675.278-3.645.801-4.623A5.452 5.452 0 0 1 3.07.801C4.047.278 5.017 0 7.692 0z"
19
+ />
20
+ <circle cx={212.074} cy={57} r={19} fill="#F4F5F7" />
21
+ <circle cx={20} cy={19} r={8} fill="#F4F5F7" />
22
+ <use
23
+ fill="#F4F5F7"
24
+ transform="translate(12 86)"
25
+ xlinkHref="#with-image-1_svg__a"
26
+ />
27
+ <path
28
+ fill="#DFE2E7"
29
+ d="M97.5 141a9.5 9.5 0 1 1 0-19 9.5 9.5 0 0 1 0 19zm7.802 29H88l13.458-16.823a4 4 0 0 1 6.247 0l4.42 5.524 12.102-20.044a4 4 0 0 1 6.848 0L150 170h-44.698z"
30
+ />
31
+ <rect
32
+ width={62}
33
+ height={20}
34
+ x={12}
35
+ y={216}
36
+ fill="#2466EA"
37
+ opacity={0.2}
38
+ rx={4}
39
+ />
40
+ <rect width={62} height={12} x={12} y={41} fill="#EBECF0" rx={4} />
41
+ <rect width={162} height={12} x={12} y={61} fill="#EBECF0" rx={4} />
42
+ <rect width={54} height={12} x={32} y={13} fill="#F4F5F7" rx={4} />
43
+ <rect width={23} height={12} x={98} y={13} fill="#F4F5F7" rx={4} />
44
+ <rect
45
+ width={62}
46
+ height={20}
47
+ x={86}
48
+ y={216}
49
+ fill="#2466EA"
50
+ opacity={0.2}
51
+ rx={4}
52
+ />
53
+ </g>
54
+ </svg>
55
+ );
56
+
57
+ export default SvgWithImage1;
@@ -0,0 +1,10 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="407px" height="574px" viewBox="0 0 407 574" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <!-- Generator: Sketch 48.2 (47327) - http://www.bohemiancoding.com/sketch -->
4
+ <title>iPad-PNG-Free-Download</title>
5
+ <desc>Created with Sketch.</desc>
6
+ <defs></defs>
7
+ <g id="Full-page-" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
8
+ <image id="iPad-PNG-Free-Download" x="0" y="0" width="407" height="574" xlink:href="data:image/png;base64,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"></image>
9
+ </g>
10
+ </svg>
@@ -7,7 +7,13 @@
7
7
  font-weight: 600;
8
8
  }
9
9
 
10
-
10
+ .form-builder-radio-group {
11
+
12
+ .cap-radio-v2{
13
+ display: inline-block;
14
+ }
15
+
16
+ }
11
17
 
12
18
  .textarea-error-message {
13
19
  top: initial !important;
@@ -12,6 +12,7 @@ import { Label } from 'semantic-ui-react';
12
12
  import _ from 'lodash';
13
13
  import { Tabs, Table, Modal} from 'antd';
14
14
  import { CapButton, CapInput, CapPopover, CapCheckbox, CapRadio, CapSelect, CapTable, CapRow, CapColumn, CapNotification} from '@capillarytech/cap-ui-library';
15
+ import LabelHOC from '@capillarytech/cap-ui-library/assets/HOCs/ComponentWithLabelHOC';
15
16
  import TemplatePreview from '../../components/TemplatePreview';
16
17
  import TagList from '../../containers/TagList';
17
18
  import SmsEditor from '../SmsEditor';
@@ -556,50 +557,57 @@ class FormBuilder extends React.Component { // eslint-disable-line react/prefer-
556
557
  _.forEach(this.state.formData, (tab, index) => {
557
558
  let isCurrentTabValid = true;
558
559
  let skipValidation = false;
559
- if (type.toLowerCase() === 'embedded' && ((isOnlyAndroid && parseInt(index) === 1) || (isOnlyIos && parseInt(index) === 0))) {
560
+ if (type.toLowerCase() === 'embedded' && ((isOnlyAndroid && parseInt(index) === 1) || (isOnlyIos && parseInt(index) === 0)) && isOnlyAndroid !== isOnlyIos) {
561
+ // skip validation of the tab which is not open in embedded mode
560
562
  skipValidation = true;
561
563
  }
562
564
  if (!isNaN(index) && tab && !skipValidation) {
563
565
  const selector = index > 0 ? `${Number(index) + 1}` : '';
564
566
  let message = tab[`message-editor${selector}`];
565
567
 
566
- message = message.trim();
567
-
568
568
  if (errorData[parseInt(index)]) {
569
- if (message === "") {
570
- errorData[parseInt(index)][`message-editor${selector}`] = true;
571
- isValid = false;
572
- isCurrentTabValid = false;
573
- } else {
574
- errorData[parseInt(index)][`message-editor${selector}`] = false;
575
- const tagValidationResponse = this.validateTags(message, tags, injectedTags);
576
-
577
- if (tagValidationResponse.valid) {
578
- errorData[parseInt(index)][`message-editor${selector}`] = false;
579
- } else {
569
+ if (message) {
570
+ message = message.trim();
571
+
572
+ if (message === "") {
580
573
  errorData[parseInt(index)][`message-editor${selector}`] = true;
581
574
  isValid = false;
575
+ isCurrentTabValid = false;
576
+ } else {
577
+ errorData[parseInt(index)][`message-editor${selector}`] = false;
578
+ const tagValidationResponse = this.validateTags(message, tags, injectedTags);
579
+
580
+ if (tagValidationResponse.valid) {
581
+ errorData[parseInt(index)][`message-editor${selector}`] = false;
582
+ } else {
583
+ errorData[parseInt(index)][`message-editor${selector}`] = true;
584
+ isValid = false;
585
+ }
582
586
  }
583
- }
584
587
 
588
+ }
589
+
590
+
585
591
 
586
- const title = tab[`message-title${selector}`].trim();
587
- if (title === "") {
588
- errorData[parseInt(index)][`message-title${selector}`] = true;
589
- isValid = false;
590
- isCurrentTabValid = false;
591
- } else {
592
- errorData[parseInt(index)][`message-title${selector}`] = false;
593
- const tagValidationResponse = this.validateTags(title, tags, injectedTags);
594
-
595
- if (tagValidationResponse.valid) {
596
- errorData[parseInt(index)][`message-title${selector}`] = false;
597
- } else {
592
+ let title = tab[`message-title${selector}`]
593
+ if(title){
594
+ title = title.trim();
595
+ if (title === "") {
598
596
  errorData[parseInt(index)][`message-title${selector}`] = true;
599
597
  isValid = false;
598
+ isCurrentTabValid = false;
599
+ } else {
600
+ errorData[parseInt(index)][`message-title${selector}`] = false;
601
+ const tagValidationResponse = this.validateTags(title, tags, injectedTags);
602
+
603
+ if (tagValidationResponse.valid) {
604
+ errorData[parseInt(index)][`message-title${selector}`] = false;
605
+ } else {
606
+ errorData[parseInt(index)][`message-title${selector}`] = true;
607
+ isValid = false;
608
+ }
600
609
  }
601
610
  }
602
-
603
611
  // if(tab['primary-cta-link'].trim() === ""){
604
612
  // errorData[parseInt(index)][`primary-cta-link`] = true;
605
613
  // isValid = false;
@@ -1131,7 +1139,7 @@ class FormBuilder extends React.Component { // eslint-disable-line react/prefer-
1131
1139
  }
1132
1140
  }
1133
1141
  if (col.type === 'checkbox') {
1134
- if (isContainer) {
1142
+ if (isContainer && !formData[index][col.id]) {
1135
1143
  formData[index][col.id] = false;
1136
1144
  } else if (!isContainer && formData[col.id] === undefined) {
1137
1145
  formData[col.id] = false;
@@ -1962,7 +1970,6 @@ class FormBuilder extends React.Component { // eslint-disable-line react/prefer-
1962
1970
  val.injectedEvents[event].call(this.props.parent, data);
1963
1971
  }
1964
1972
  openFileDialog = () => {
1965
- console.log("filedialog: ");
1966
1973
  document.getElementById("fileName").click();
1967
1974
  };
1968
1975
  handleOk = (ev) => {
@@ -2026,7 +2033,6 @@ class FormBuilder extends React.Component { // eslint-disable-line react/prefer-
2026
2033
  return val.value;
2027
2034
  }
2028
2035
  uploadImages = (e, {files}, val) => {
2029
- console.log("uploadImages: ", e, {files}, val);
2030
2036
  e.preventDefault();
2031
2037
  const _URL = window.URL || window.webkitURL;
2032
2038
  const file = files[0];
@@ -2163,7 +2169,7 @@ class FormBuilder extends React.Component { // eslint-disable-line react/prefer-
2163
2169
  ifError = this.state.checkValidation && (isVersionEnable ? this.state.errorData[`${this.state.currentTab - 1}`][val.id] : this.state.errorData[val.id]);
2164
2170
  const value = isVersionEnable ? this.state.formData[`${this.state.currentTab - 1}`][val.id] : this.state.formData[val.id];
2165
2171
  columns.push(
2166
- <CapColumn key={val.id} span={val.width}>
2172
+ <CapColumn key={val.id} span={val.width} offset={val.offset}>
2167
2173
  <CapInput
2168
2174
  id={val.id}
2169
2175
  errorMessage={val.errorMessage && ifError ? val.errorMessage : ''}
@@ -2201,6 +2207,7 @@ class FormBuilder extends React.Component { // eslint-disable-line react/prefer-
2201
2207
  id={val.id}
2202
2208
  className={`${ifError ? 'error' : ''}`}
2203
2209
  errorMessage={val.errorMessage && ifError ? val.errorMessage : ''}
2210
+ label={val.label}
2204
2211
  autosize={val.autosize ? val.autosizeParams : false}
2205
2212
  onChange={(e) => this.updateFormData(e.target.value, val)}
2206
2213
  style={val.style ? val.style : {}}
@@ -2449,13 +2456,14 @@ class FormBuilder extends React.Component { // eslint-disable-line react/prefer-
2449
2456
  renderPrimitiveElement(val, childIndex) {
2450
2457
  const type = val.type;
2451
2458
  const tabName = this.state.formData[childIndex - 1] && this.state.formData[childIndex - 1].name ? this.state.formData[childIndex - 1].name : `${val.value} ${childIndex}`;
2452
- let value = val.dynamicTab ? tabName : val.value;
2459
+ const value = val.dynamicTab ? tabName : val.value;
2453
2460
  switch (type) {
2454
2461
  case "span":
2455
2462
  return <span id={`${val.id}${childIndex > 1 ? childIndex : ''}`}>{val.dynamicTab ? tabName : val.value}</span>;
2456
2463
  case "div":
2457
- if (this.state.formData[`${this.state.currentTab - 1}`] && this.state.formData[`${this.state.currentTab - 1}`][val.id] && this.state.formData[`${this.state.currentTab - 1}`][val.id].trim() !== "") {
2458
- value = this.state.formData[`${this.state.currentTab - 1}`][val.id];
2464
+ let children = _.get(this.state, `formData[${this.state.currentTab - 1}][${val.id}]`) || value;
2465
+ if (_.isEmpty(value) && !_.isEmpty(val.value)) {
2466
+ children = val.value;
2459
2467
  }
2460
2468
  return (<div
2461
2469
  className={val.className ? val.className : ''}
@@ -2463,7 +2471,7 @@ class FormBuilder extends React.Component { // eslint-disable-line react/prefer-
2463
2471
  onClick={(data) => this.callChildEvent(data, val, val.submitAction)}
2464
2472
  style={val.style ? val.style : {}}
2465
2473
  onInput={(e) => { e.stopPropagation(); this.callChildEvent(e.target.textContent, val, 'onChange'); }}
2466
- >{value}</div>);
2474
+ >{children}</div>);
2467
2475
  default:
2468
2476
  return '';
2469
2477
  }
@@ -2522,10 +2530,11 @@ class FormBuilder extends React.Component { // eslint-disable-line react/prefer-
2522
2530
  const value = isVersionEnable ? this.state.formData[`${this.state.currentTab - 1}`][val.id] : this.state.formData[val.id];
2523
2531
  if (styling === 'semantic') {
2524
2532
  columns.push(
2525
- <CapColumn key={val.id} span={val.width}>
2533
+ <CapColumn key={val.id} span={val.width} offset={val.offset}>
2526
2534
  <CapInput
2527
2535
  id={val.id}
2528
2536
  errorMessage={val.errorMessage && ifError ? val.errorMessage : ''}
2537
+ label={val.label}
2529
2538
  className={`input-primary chart-name-input${ifError ? ' error' : ''}`}
2530
2539
  // fluid={val.fluid}
2531
2540
  style={val.style ? val.style : {}}
@@ -2562,6 +2571,7 @@ class FormBuilder extends React.Component { // eslint-disable-line react/prefer-
2562
2571
  disabled={val.disabled}
2563
2572
  className={`${ifError ? 'error' : ''}`}
2564
2573
  errorMessage={val.errorMessage && ifError ? val.errorMessage : ''}
2574
+ label={val.label}
2565
2575
  autosize={val.autosize ? val.autosizeParams : false}
2566
2576
  onChange={(e) => this.updateFormData(e.target.value, val)}
2567
2577
  style={val.style ? val.style : {}}
@@ -2580,13 +2590,15 @@ class FormBuilder extends React.Component { // eslint-disable-line react/prefer-
2580
2590
  columns.push(
2581
2591
  <CapColumn key="input" span={val.width} offset={val.offset}>
2582
2592
  <CapCheckbox
2593
+ key={val.id}
2583
2594
  className={`${ifError ? 'error' : ''}`}
2584
2595
  errorMessage={val.errorMessage && ifError ? val.errorMessage : ''}
2585
- onChange={(e) => this.updateFormData(e.target.checked, val)}
2596
+ onChange={(e) => this.updateFormData(e.target.checked, val, val.submitAction)}
2586
2597
  checked={isVersionEnable ? this.state.formData[`${this.state.currentTab - 1}`][val.id] : this.state.formData[val.id]}
2587
2598
  defaultChecked={isVersionEnable ? this.state.formData[`${this.state.currentTab - 1}`][val.id] : this.state.formData[val.id]}
2588
2599
  style={val.style ? val.style : {}}
2589
2600
  disabled={val.disabled}
2601
+ inductiveText={val.inductiveText}
2590
2602
  >
2591
2603
  {val.label}
2592
2604
  </CapCheckbox>
@@ -2620,15 +2632,16 @@ class FormBuilder extends React.Component { // eslint-disable-line react/prefer-
2620
2632
  <CapColumn key={`input-${val.id}`} span={val.width} offset={val.offset}>
2621
2633
  <CapRadioGroup
2622
2634
  key={`${val.id}-radio-group`}
2623
- className={`${ifError ? 'error' : ''}`}
2635
+ className={`form-builder-radio-group ${ifError ? 'error' : ''}`}
2624
2636
  errorMessage={val.errorMessage && ifError ? val.errorMessage : ''}
2625
2637
  onChange={(e) => this.updateFormData(e.target.value, val)}
2626
2638
  style={val.style ? val.style : {}}
2627
2639
  value={this.handleSetRadioValue(this.state.formData, self.state.currentTab, val)}
2628
2640
  name={val.name ? val.name : `${val.id}-name`}
2629
- options={val.options}
2630
2641
  disabled={val.disabled}
2631
2642
  >
2643
+ {val.options.map((option, index) => <CapRadio value={option} inductiveText={val.inductiveText && val.inductiveText[index]}>{option}</CapRadio>) }
2644
+
2632
2645
  </CapRadioGroup>
2633
2646
  {/*{ifError ?*/}
2634
2647
  {/*<div className="error"> {val.errorMessage}</div>*/}
@@ -2657,17 +2670,34 @@ class FormBuilder extends React.Component { // eslint-disable-line react/prefer-
2657
2670
  );
2658
2671
  break;
2659
2672
  case 'upload':
2673
+ ifError = this.state.checkValidation && (isVersionEnable ? this.state.errorData[`${this.state.currentTab - 1}`][val.id] : this.state.errorData[val.id]);
2674
+ const ImageComponent = (props) => (
2675
+ <div>
2676
+ <div className={`image-container ${ifError ? 'error' : ''}`}>
2677
+ {self.state && !!self.state.formData[`${self.state.currentTab - 1}`].image ?
2678
+ <img src={self.state.formData[`${self.state.currentTab - 1}`].image} alt={props.alt} style={props.style}/>
2679
+ :
2680
+ <div style={{width: "100%", textAlign: "center"}}><span className="image-placeholder">{props.placeholder}</span></div>
2681
+ }
2682
+ </div>
2683
+ {ifError && <div><span className="error">{props.errorMessage}</span></div>}
2684
+
2685
+ </div>
2686
+ );
2687
+ const WithLabel = LabelHOC(ImageComponent);
2660
2688
  columns.push(
2661
2689
  <CapColumn span={val.width} offset={val.offset} style={val.style}>
2690
+ {val.showPreview && <WithLabel {...val.previewProps}/>}
2662
2691
  <form encType="multipart/form-data" id={val.id}>
2663
2692
  <input key={val.id} style={{ display: 'none'}} id="fileName" type="file" onChange={(e) => this.uploadImages(e, {files: e.target.files}, val)} accept="image/*" />
2664
- <CapButton disabled={val.disabled ? val.disabled : false} type="secondary" onClick={(e) => this.openFileDialog(e)} style={{float: 'right'}}>
2693
+ <CapButton disabled={val.disabled ? val.disabled : false} type="secondary" onClick={(e) => this.openFileDialog(e)} style={{float: 'right', marginTop: '-68px'}}>
2665
2694
  {val.label}
2666
2695
  </CapButton>
2667
2696
  </form>
2668
2697
  </CapColumn>
2669
- );
2698
+ );
2670
2699
  break;
2700
+
2671
2701
  case "table":
2672
2702
  columns.push(
2673
2703
  <CapTable dataSource={self.props.iosCtasData} loading={self.props.iosCtasData ? !self.props.iosCtasData.length : true} onRowClick={(row) => this.updateFormData(row, val, "onRowClick" )} pagination={val.pagination}>
@@ -2843,7 +2873,7 @@ class FormBuilder extends React.Component { // eslint-disable-line react/prefer-
2843
2873
  ifError = this.state.checkValidation && (isVersionEnable ? this.state.errorData[`${this.state.currentTab - 1}`][val.id] : this.state.errorData[val.id]);
2844
2874
  const options = (this.state.formData[`${val.id}-options`]) ? (this.state.formData[`${val.id}-options`]) : val.options;
2845
2875
  columns.push(
2846
- <CapColumn style={val.colStyle ? val.colStyle : {}} span={val.width}>
2876
+ <CapColumn style={val.colStyle ? val.colStyle : {}} span={val.width} offset={val.offset}>
2847
2877
  <CapSelect
2848
2878
  id={val.id}
2849
2879
  options={options}
@@ -3044,33 +3074,35 @@ class FormBuilder extends React.Component { // eslint-disable-line react/prefer-
3044
3074
  const currentLang = this.state.formData[this.state.currentTab - 1].selectedLanguages[index];
3045
3075
  paneTabKey = this.state.formData[this.state.currentTab - 1] && this.state.formData[this.state.currentTab - 1][currentLang] && this.state.formData[this.state.currentTab - 1][currentLang].tabKey;
3046
3076
  }
3047
-
3048
- renderedPanes.push(
3049
- <TabPane
3050
- forceRender
3051
- tab={
3052
- <div className="form-tab-header" onInput={(e) => e.stopPropagation()}>
3053
- {
3054
- _.forEach(renderedContentSections, (value) => {
3077
+ const isPaneSupported = typeof pane.isSupported === "boolean" ? pane.isSupported : true; // pane.isSupported field exists only in mpush schema, in other channels it is not
3078
+ if (isPaneSupported) {
3079
+ renderedPanes.push(
3080
+ <TabPane
3081
+ forceRender
3082
+ tab={
3083
+ <div className="form-tab-header" onInput={(e) => e.stopPropagation()}>
3084
+ {
3085
+ _.forEach(renderedContentSections, (value) => {
3086
+ if (value) {
3087
+ return value;
3088
+ }
3089
+ return value;
3090
+ })
3091
+ }
3092
+ </div>
3093
+ }
3094
+ key={paneTabKey && paneTabKey !== '' ? `${paneTabKey}` : index}>
3095
+ {
3096
+ _.forEach(renderedSections, (value) => {
3055
3097
  if (value) {
3056
3098
  return value;
3057
3099
  }
3058
3100
  return value;
3059
3101
  })
3060
- }
3061
- </div>
3062
- }
3063
- key={paneTabKey && paneTabKey !== '' ? `${paneTabKey}` : index}>
3064
- {
3065
- _.forEach(renderedSections, (value) => {
3066
- if (value) {
3067
- return value;
3068
- }
3069
- return value;
3070
- })
3071
- }
3072
- </TabPane>);
3073
- paneIndex += 1;
3102
+ }
3103
+ </TabPane>);
3104
+ paneIndex += 1;
3105
+ }
3074
3106
  });
3075
3107
  extraActionSections = container.tabBarExtraContent && container.tabBarExtraContent.sections ? container.tabBarExtraContent.sections.map((section) => {
3076
3108
  result = this.renderSection(section);
@@ -0,0 +1,120 @@
1
+ /**
2
+ *
3
+ * PreviewSideBar
4
+ *
5
+ */
6
+
7
+ import PropTypes from 'prop-types';
8
+
9
+ import React from 'react';
10
+ import { CapButton } from '@capillarytech/cap-ui-library';
11
+ // import styled from 'styled-components';
12
+
13
+ import { FormattedMessage } from 'react-intl';
14
+ import { Button } from 'antd';
15
+ import { get, map, isEmpty} from 'lodash';
16
+ import TemplatePreview from '../TemplatePreview';
17
+ import '../PreviewSideBar/_previewsidebar.scss';
18
+ import messages from './messages';
19
+ const ButtonGroup = Button.Group;
20
+
21
+ class MobilePushPreviewV2 extends React.Component { // eslint-disable-line react/prefer-stateless-function
22
+ constructor(props) {
23
+ super(props);
24
+ this.goToEdit = this.goToEdit.bind(this);
25
+ this.goToDuplicate = this.goToDuplicate.bind(this);
26
+ this.changeDevice = this.changeDevice.bind(this);
27
+ const hasAndroid = get(props, 'templateData.versions.base.ANDROID') || get(props, 'templateData.androidContent');
28
+ const hasIos = get(props, 'templateData.versions.base.IOS') || get(props, 'templateData.iosContent');
29
+ let device = "android";
30
+ if (hasAndroid) {
31
+ device = 'android';
32
+ } else if (hasIos) {
33
+ device = 'ios';
34
+ }
35
+ this.state = {
36
+ device,
37
+ content: this.setContent(props.templateData, device),
38
+ };
39
+ }
40
+
41
+ setContent = (templateData, device) => {
42
+ const androidContent = get(templateData, 'versions.base.ANDROID') || get(templateData, 'androidContent');
43
+ const iosContent = get(templateData, 'versions.base.IOS') || get(templateData, 'iosContent');
44
+
45
+ const data = device === "android" ? androidContent : iosContent;
46
+ const content = {
47
+ header: data.title,
48
+ bodyText: data.message,
49
+ bodyImage: data.expandableDetails && data.expandableDetails.image,
50
+ actions: [],
51
+ appName: templateData.appName,
52
+ };
53
+ if (data.expandableDetails && data.expandableDetails.ctas && data.expandableDetails.ctas.length) {
54
+ if (device === "android" ) {
55
+ content.actions = map(data.expandableDetails.ctas, (cta) => ({label: cta.actionText}));
56
+ } else {
57
+ content.actions = [{label: data.expandableDetails.ctas[0].actionLabel}, {label: data.expandableDetails.ctas[0].actionLabel2}];
58
+ }
59
+ }
60
+ return content;
61
+ }
62
+ goToDuplicate() {
63
+ this.props.onDuplicateClick(this.props.templateData);
64
+ this.props.handleClose();
65
+ }
66
+ changeDevice(ev) {
67
+ const device = ev.target.value;
68
+ const content = this.setContent(this.props.templateData, device);
69
+ this.setState({device, content });
70
+ }
71
+ goToEdit(e, path) {
72
+ this.props.onEditClick(e, this.props.templateData._id, this.props.templateData.modeType, path);
73
+ }
74
+ render() {
75
+ const {templateData, channel} = this.props;
76
+
77
+ const hasAndroid = get(templateData, 'versions.base.ANDROID') || get(templateData, 'androidContent');
78
+ const hasIos = get(templateData, 'versions.base.IOS') || get(templateData, 'iosContent');
79
+
80
+ const {device, content} = this.state;
81
+
82
+ return (
83
+
84
+ <div>
85
+ <div className="devices">
86
+ {!isEmpty(templateData) && hasAndroid && hasIos &&
87
+ <ButtonGroup onClick={this.changeDevice}>
88
+ <CapButton type={device === "android" ? "primary" : "secondary"} value={"android"}>Android</CapButton>
89
+ <CapButton type={device === "iphone" ? "primary" : "secondary"} value={"iphone"}>IOS</CapButton>
90
+ </ButtonGroup>}
91
+ </div>
92
+ <TemplatePreview
93
+ device={device === "android" ? "android" : "iphone"}
94
+ channel={channel}
95
+ content={content || ''}
96
+ templateData={templateData}
97
+ >
98
+ </TemplatePreview>
99
+
100
+
101
+ </div>
102
+
103
+
104
+ );
105
+ }
106
+
107
+ }
108
+
109
+ MobilePushPreviewV2.propTypes = {
110
+ templateData: PropTypes.object.isRequired,
111
+ channel: PropTypes.string.isRequired,
112
+ showPreview: PropTypes.bool,
113
+ handleClose: PropTypes.func,
114
+ onEditClick: PropTypes.func,
115
+ onDuplicateClick: PropTypes.func,
116
+ location: PropTypes.object,
117
+ embedded: PropTypes.bool,
118
+ };
119
+
120
+ export default MobilePushPreviewV2;
@@ -0,0 +1,13 @@
1
+ /*
2
+ * MobilePushPreviewV2 Messages
3
+ *
4
+ * This contains all the text for the MobilePushPreviewV2 component.
5
+ */
6
+ import { defineMessages } from 'react-intl';
7
+
8
+ export default defineMessages({
9
+ header: {
10
+ id: 'app.components.MobilePushPreviewV2.header',
11
+ defaultMessage: 'This is the MobilePushPreviewV2 component !',
12
+ },
13
+ });
@@ -0,0 +1,10 @@
1
+ // import React from 'react';
2
+ // import { shallow } from 'enzyme';
3
+
4
+ // import MobilePushPreviewV2 from '../index';
5
+
6
+ describe('<MobilePushPreviewV2 />', () => {
7
+ it('Expect to have unit tests specified', () => {
8
+ expect(true).toEqual(false);
9
+ });
10
+ });