@subiz/widget-v4 4.0.79 → 4.0.82

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.
@@ -426,7 +426,7 @@ a.message_error {
426
426
  }
427
427
 
428
428
  .generic-attachment {
429
- display: inline-block;
429
+ display: flex;
430
430
  width: 100%;
431
431
  overflow: hidden;
432
432
  width: 100%;
@@ -436,6 +436,10 @@ a.message_error {
436
436
  cursor: grab;
437
437
  }
438
438
 
439
+ .generic-attachment--element-content {
440
+ flex: 1;
441
+ }
442
+
439
443
  .generic-attachment--element {
440
444
  border: 1px solid #d8d8d8;
441
445
  background: white;
@@ -443,8 +447,10 @@ a.message_error {
443
447
  overflow: hidden;
444
448
  width: 220px;
445
449
  margin-right: 10px;
446
- display: inline-block;
447
450
  vertical-align: top;
451
+ display: flex;
452
+ flex-direction: column;
453
+ flex-shrink: 0;
448
454
 
449
455
  &:last-child {
450
456
  margin-right: 0;
@@ -67,7 +67,9 @@ class GenericTemplateAttachments extends _common.Com {
67
67
  alt: "generic attachment element",
68
68
  class: "generic-attachment--element-img",
69
69
  src: this.props.store.replaceFileUrl(ele.image_url)
70
- })), $title, $subtitle, (0, _preact.h)(_Buttons.default, {
70
+ })), (0, _preact.h)("div", {
71
+ class: "generic-attachment--element-content"
72
+ }, $title, $subtitle), (0, _preact.h)(_Buttons.default, {
71
73
  buttons: ele.buttons,
72
74
  onSelect: button => this.props.onSelect(button),
73
75
  t: this.props.t
@@ -31,8 +31,7 @@ img { max-width: 100%; display: block; margin: 10px auto; }
31
31
  * { white-space: normal }
32
32
  ul > li { margin-bottom: 5px }
33
33
  ul:last-child { margin-bottom: 0 }
34
- p:first-child { margin-top: 0;}
35
- p:last-child { margin-bottom: 0;}
34
+ p { margin-bottom: 0; margin-top: 0;}
36
35
  </style>
37
36
  <div>${html}</div>`;
38
37
  let links = this.shadowRoot.querySelectorAll('a');
@@ -45,7 +45,11 @@ class TextMessage extends _common.Com {
45
45
  var format = _index.default.get(this.props.ev, 'data.message.format', 'plaintext');
46
46
 
47
47
  if (format === 'markdown') return this.renderMarkdown();
48
+ if (format === 'delta') return this.renderDelta();
49
+ return this.renderPlainText();
50
+ }
48
51
 
52
+ renderPlainText() {
49
53
  var text = _index.default.get(this.props.ev, 'data.message.text');
50
54
 
51
55
  text = _index.default.trim(text);
@@ -95,9 +99,25 @@ class TextMessage extends _common.Com {
95
99
  }, tags);
96
100
  }
97
101
 
98
- renderMarkdown() {
99
- var text = _index.default.get(this.props.ev, 'data.message.text');
102
+ renderDelta() {
103
+ let deltas = _index.default.get(this.props.ev, 'data.message.quill_delta');
104
+
105
+ deltas = _index.default.parseJSON(deltas) || {};
106
+ deltas = deltas.ops || [];
107
+
108
+ let isMarkdown = _index.default.find(deltas, delta => _index.default.get(delta, 'attributes.bold') || _index.default.get(delta, 'attributes.italic') || _index.default.get(delta, 'attributes.underline'));
109
+
110
+ if (isMarkdown) {
111
+ var text = deltaToMarkdown(deltas);
112
+ console.log('text', text);
113
+ return this.renderMarkdown(text);
114
+ }
115
+
116
+ return this.renderPlainText();
117
+ }
100
118
 
119
+ renderMarkdown(text) {
120
+ if (!text) text = _index.default.get(this.props.ev, 'data.message.text');
101
121
  if (_index.default.size(text) === 0) return null;
102
122
 
103
123
  let byType = _index.default.get(this.props.ev, 'by.type');
@@ -124,4 +144,48 @@ class TextMessage extends _common.Com {
124
144
 
125
145
  }
126
146
 
127
- exports.default = TextMessage;
147
+ exports.default = TextMessage;
148
+
149
+ function deltaToMarkdown(deltas) {
150
+ let output = '';
151
+
152
+ _index.default.each(deltas, (delta, idx) => {
153
+ let text = '';
154
+ let insert = delta.insert;
155
+ let attributes = delta.attributes;
156
+ if (insert.emoji) text = emojiCodes[insert.emoji] || '';
157
+
158
+ if (attributes) {
159
+ if (attributes.italic && attributes.bold) text = `*__${insert}__*`;else if (attributes.italic) text = `*${insert}*`;else if (attributes.bold) text = `**${insert}**`;else text = insert;
160
+ }
161
+
162
+ if (insert.dynamicField) text = `${_index.default.get(insert, 'dynamicField.text', '')}`;
163
+
164
+ if (!insert.emoji && !attributes && !insert.dynamicField) {
165
+ text = insert || '';
166
+ text = text.replace(/\n/g, '<br/>');
167
+ }
168
+
169
+ output += text;
170
+ });
171
+
172
+ return output;
173
+ }
174
+
175
+ const emojiCodes = {
176
+ like: '👍',
177
+ unlike: '👎',
178
+ angry: '😠',
179
+ confused: '😕',
180
+ crying: '😢',
181
+ grinning: '😀',
182
+ 'heart-eyes': '😍',
183
+ neutral: '😐',
184
+ sleepy: '😪',
185
+ sad: '😞',
186
+ smiling: '😄',
187
+ 'tongue-out': '😛',
188
+ tired: '😩',
189
+ surprised: '😮',
190
+ wink: '😉'
191
+ };
@@ -1012,6 +1012,16 @@ class Popup extends _common.Com {
1012
1012
  if (com.type === 'image') return this.renderImageComponent(com, i);
1013
1013
  });
1014
1014
 
1015
+ let formComponents = _index.default.filter(page.components, com => com.type !== 'image');
1016
+
1017
+ if (!formComponents.length) {
1018
+ formcss.background = 'transparent';
1019
+ formcss.padding_top = '0';
1020
+ formcss.padding_bottom = '0';
1021
+ formcss.padding_left = '0';
1022
+ formcss.padding_right = '0';
1023
+ }
1024
+
1015
1025
  return (0, _preact.h)("div", {
1016
1026
  class: "overlay",
1017
1027
  style: overlaystyle
@@ -759,7 +759,7 @@ class Store {
759
759
  if (pong.member_id == user.id && pong.type === 'seen') {
760
760
  let mem = _index.default.find(convo.members, mem => mem.id === user.id);
761
761
 
762
- mem.seen_at = pong.created;
762
+ if (mem) mem.seen_at = pong.created;
763
763
  }
764
764
  });
765
765
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@subiz/widget-v4",
3
- "version": "4.0.79",
3
+ "version": "4.0.82",
4
4
  "main": "./compiled_src/lib.js",
5
5
  "scripts": {
6
6
  "dev": "npx webpack serve --config webpack.dev.js",
@@ -51,8 +51,10 @@ export default class GenericTemplateAttachments extends Com {
51
51
  src={this.props.store.replaceFileUrl(ele.image_url)}
52
52
  />
53
53
  </div>
54
- {$title}
55
- {$subtitle}
54
+ <div class='generic-attachment--element-content'>
55
+ {$title}
56
+ {$subtitle}
57
+ </div>
56
58
  <Buttons buttons={ele.buttons} onSelect={(button) => this.props.onSelect(button)} t={this.props.t} />
57
59
  </div>
58
60
  )
@@ -21,8 +21,7 @@ img { max-width: 100%; display: block; margin: 10px auto; }
21
21
  * { white-space: normal }
22
22
  ul > li { margin-bottom: 5px }
23
23
  ul:last-child { margin-bottom: 0 }
24
- p:first-child { margin-top: 0;}
25
- p:last-child { margin-bottom: 0;}
24
+ p { margin-bottom: 0; margin-top: 0;}
26
25
  </style>
27
26
  <div>${html}</div>`
28
27
  let links = this.shadowRoot.querySelectorAll('a')
@@ -22,7 +22,11 @@ export default class TextMessage extends Com {
22
22
  render() {
23
23
  var format = sb.get(this.props.ev, 'data.message.format', 'plaintext')
24
24
  if (format === 'markdown') return this.renderMarkdown()
25
+ if (format === 'delta') return this.renderDelta()
26
+ return this.renderPlainText()
27
+ }
25
28
 
29
+ renderPlainText() {
26
30
  var text = sb.get(this.props.ev, 'data.message.text')
27
31
  text = sb.trim(text)
28
32
  if (sb.size(text) === 0) return null
@@ -60,8 +64,25 @@ export default class TextMessage extends Com {
60
64
  return <div class='message-user message-text--user'>{tags}</div>
61
65
  }
62
66
 
63
- renderMarkdown() {
64
- var text = sb.get(this.props.ev, 'data.message.text')
67
+ renderDelta() {
68
+ let deltas = sb.get(this.props.ev, 'data.message.quill_delta')
69
+ deltas = sb.parseJSON(deltas) || {}
70
+ deltas = deltas.ops || []
71
+ let isMarkdown = sb.find(
72
+ deltas,
73
+ (delta) =>
74
+ sb.get(delta, 'attributes.bold') || sb.get(delta, 'attributes.italic') || sb.get(delta, 'attributes.underline'),
75
+ )
76
+ if (isMarkdown) {
77
+ var text = deltaToMarkdown(deltas)
78
+ console.log('text', text)
79
+ return this.renderMarkdown(text)
80
+ }
81
+ return this.renderPlainText()
82
+ }
83
+
84
+ renderMarkdown(text) {
85
+ if (!text) text = sb.get(this.props.ev, 'data.message.text')
65
86
  if (sb.size(text) === 0) return null
66
87
 
67
88
  let byType = sb.get(this.props.ev, 'by.type')
@@ -86,3 +107,48 @@ export default class TextMessage extends Com {
86
107
  )
87
108
  }
88
109
  }
110
+
111
+ function deltaToMarkdown(deltas) {
112
+ let output = ''
113
+ sb.each(deltas, (delta, idx) => {
114
+ let text = ''
115
+ let insert = delta.insert
116
+ let attributes = delta.attributes
117
+ // emoji
118
+ if (insert.emoji) text = emojiCodes[insert.emoji] || ''
119
+ // insert bold, italic, underline
120
+ if (attributes) {
121
+ if (attributes.italic && attributes.bold) text = `*__${insert}__*`
122
+ else if (attributes.italic) text = `*${insert}*`
123
+ else if (attributes.bold) text = `**${insert}**`
124
+ else text = insert
125
+ }
126
+ if (insert.dynamicField) text = `${sb.get(insert, 'dynamicField.text', '')}`
127
+ if (!insert.emoji && !attributes && !insert.dynamicField) {
128
+ text = insert || ''
129
+ // markdown need newline to <br/> characters to newline
130
+ text = text.replace(/\n/g, '<br/>')
131
+ }
132
+
133
+ output += text
134
+ })
135
+ return output
136
+ }
137
+
138
+ const emojiCodes = {
139
+ like: '👍',
140
+ unlike: '👎',
141
+ angry: '😠',
142
+ confused: '😕',
143
+ crying: '😢',
144
+ grinning: '😀',
145
+ 'heart-eyes': '😍',
146
+ neutral: '😐',
147
+ sleepy: '😪',
148
+ sad: '😞',
149
+ smiling: '😄',
150
+ 'tongue-out': '😛',
151
+ tired: '😩',
152
+ surprised: '😮',
153
+ wink: '😉',
154
+ }
@@ -918,6 +918,17 @@ export default class Popup extends Com {
918
918
  let $imgs = sb.map(page.components, (com, i) => {
919
919
  if (com.type === 'image') return this.renderImageComponent(com, i)
920
920
  })
921
+
922
+ // fix bug image only popup has white block
923
+ let formComponents = sb.filter(page.components, (com) => com.type !== 'image')
924
+ if (!formComponents.length) {
925
+ formcss.background = 'transparent'
926
+ formcss.padding_top = '0'
927
+ formcss.padding_bottom = '0'
928
+ formcss.padding_left = '0'
929
+ formcss.padding_right = '0'
930
+ }
931
+
921
932
  return (
922
933
  <div class='overlay' style={overlaystyle}>
923
934
  <div class={animation} style={this.js2css(containercss)} onClick={(e) => e.stopPropagation()}>
@@ -704,7 +704,7 @@ export default class Store {
704
704
  sb.map(pongs, (pong) => {
705
705
  if (pong.member_id == user.id && pong.type === 'seen') {
706
706
  let mem = sb.find(convo.members, (mem) => mem.id === user.id)
707
- mem.seen_at = pong.created
707
+ if (mem) mem.seen_at = pong.created
708
708
  }
709
709
  })
710
710
  this.chain.put(cid, oldev.id, sb.getMs(oldev.created), oldev)