@subiz/widget-v4 4.0.96 → 4.0.97

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 (94) hide show
  1. package/assets/less/form.less +1 -1
  2. package/compiled_src/chatbox/Widget.js +112 -0
  3. package/package.json +1 -1
  4. package/src/chatbox/Widget.js +138 -0
  5. package/dist/132.js +0 -6541
  6. package/dist/178.js +0 -406
  7. package/dist/184b3f119b0.132.js +0 -1
  8. package/dist/184b3f119b0.178.js +0 -1
  9. package/dist/184b3f119b0.213.js +0 -1
  10. package/dist/184b3f119b0.335.js +0 -1
  11. package/dist/184b3f119b0.362.js +0 -1
  12. package/dist/184b3f119b0.441.js +0 -1
  13. package/dist/184b3f119b0.605.js +0 -1
  14. package/dist/184b3f119b0.678.js +0 -1
  15. package/dist/184b3f119b0.782.js +0 -1
  16. package/dist/184b3f119b0.app.js +0 -1
  17. package/dist/184b3f119b0.index.html +0 -26
  18. package/dist/184b3f119b0.library.html +0 -26
  19. package/dist/184b3f119b0.library.js +0 -1
  20. package/dist/184b3f119b0.preview.html +0 -759
  21. package/dist/184b3f119b0.preview.js +0 -1
  22. package/dist/184b3f119b0.screenshoot.js +0 -1
  23. package/dist/213.js +0 -2950
  24. package/dist/335.js +0 -376
  25. package/dist/362.js +0 -107
  26. package/dist/441.js +0 -2840
  27. package/dist/605.js +0 -297
  28. package/dist/678.js +0 -107
  29. package/dist/782.js +0 -107
  30. package/dist/HASH +0 -1
  31. package/dist/assets/img/Facebook.64607ec.png +0 -0
  32. package/dist/assets/img/Zalo.6845707.png +0 -0
  33. package/dist/assets/img/award1a.1a58e10.png +0 -0
  34. package/dist/assets/img/award3a.3b74423.png +0 -0
  35. package/dist/assets/img/award4a.ed6ccd4.png +0 -0
  36. package/dist/assets/img/award5.39eb7ae.png +0 -0
  37. package/dist/assets/img/bubble_default.7d5e4ab.svg +0 -20
  38. package/dist/assets/img/caret.998eb8f.svg +0 -1
  39. package/dist/assets/img/convos_empty.2353007.svg +0 -72
  40. package/dist/assets/img/default.06e6ee0.jpg +0 -0
  41. package/dist/assets/img/default_avatar.5b74dc1.png +0 -0
  42. package/dist/assets/img/done_gray.d7e8203.svg +0 -4
  43. package/dist/assets/img/done_green.b817fd4.svg +0 -4
  44. package/dist/assets/img/emoji/messenger/sub_23.529_58.824.d5faf14.png +0 -0
  45. package/dist/assets/img/emoji/messenger/sub_23.529_60.784.1420241.png +0 -0
  46. package/dist/assets/img/emoji/messenger/sub_25.490_0.000.1e6b2c0.png +0 -0
  47. package/dist/assets/img/emoji/messenger/sub_25.490_45.098.3dfbc08.png +0 -0
  48. package/dist/assets/img/emoji/messenger/sub_25.490_5.882.4b49e94.png +0 -0
  49. package/dist/assets/img/emoji/messenger/sub_27.451_72.549.7114f58.png +0 -0
  50. package/dist/assets/img/emoji/messenger/sub_27.451_84.314.231e2b7.png +0 -0
  51. package/dist/assets/img/emoji/messenger/sub_27.451_96.078.ddbb008.png +0 -0
  52. package/dist/assets/img/emoji/messenger/sub_29.412_5.882.61f3359.png +0 -0
  53. package/dist/assets/img/emoji/messenger/sub_58.824_100.000.6df72bc.png +0 -0
  54. package/dist/assets/img/emoji/messenger/sub_58.824_45.098.3d7a7ad.png +0 -0
  55. package/dist/assets/img/emoji/messenger/sub_58.824_47.059.0f4d6e2.png +0 -0
  56. package/dist/assets/img/emoji/messenger/sub_58.824_54.902.65724c1.png +0 -0
  57. package/dist/assets/img/emoji/messenger/sub_58.824_64.706.9da3cba.png +0 -0
  58. package/dist/assets/img/emoji/messenger/sub_58.824_72.549.edca5cf.png +0 -0
  59. package/dist/assets/img/emoji/messenger/sub_58.824_78.431.f910f2a.png +0 -0
  60. package/dist/assets/img/emoji/messenger/sub_58.824_88.235.def4e71.png +0 -0
  61. package/dist/assets/img/emoji/messenger/sub_60.784_11.765.49c03d0.png +0 -0
  62. package/dist/assets/img/emoji/messenger/sub_60.784_27.451.46b54e5.png +0 -0
  63. package/dist/assets/img/emoji/messenger/sub_60.784_29.412.e36d284.png +0 -0
  64. package/dist/assets/img/emoji/messenger/sub_60.784_3.922.bb191b0.png +0 -0
  65. package/dist/assets/img/emoji/messenger/sub_60.784_35.294.af7b927.png +0 -0
  66. package/dist/assets/img/emoji/messenger/sub_60.784_7.843.98f2a99.png +0 -0
  67. package/dist/assets/img/empty.29bed2d.svg +0 -23
  68. package/dist/assets/img/empty_1.0b98af0.svg +0 -11
  69. package/dist/assets/img/examplte_logo.f86535f.svg +0 -1
  70. package/dist/assets/img/external-link.90577cc.svg +0 -1
  71. package/dist/assets/img/fb_inverse_circle.36c2cfc.png +0 -0
  72. package/dist/assets/img/ghn.070f8e3.svg +0 -17
  73. package/dist/assets/img/ghtk.326eac1.svg +0 -18
  74. package/dist/assets/img/image_default.be0698b.png +0 -0
  75. package/dist/assets/img/info.ebce7ea.svg +0 -1
  76. package/dist/assets/img/loader.37000a7.svg +0 -1
  77. package/dist/assets/img/loading_static.8f403ae.svg +0 -10
  78. package/dist/assets/img/main-service1.d536cc2.png +0 -0
  79. package/dist/assets/img/main-service2.9b99549.png +0 -0
  80. package/dist/assets/img/not_found_search.2ddb8d1.png +0 -0
  81. package/dist/assets/img/package.8d37d0f.svg +0 -5
  82. package/dist/assets/img/package_fade.763c001.svg +0 -1
  83. package/dist/assets/img/rating--average.1ea492c.svg +0 -12
  84. package/dist/assets/img/rating--great.e3d712e.svg +0 -16
  85. package/dist/assets/img/rating--poor.2938a25.svg +0 -12
  86. package/dist/assets/img/search.f9705ff.svg +0 -1
  87. package/dist/assets/img/send.6db52a9.svg +0 -3
  88. package/dist/assets/img/shop.f7dc7d8.svg +0 -1
  89. package/dist/assets/img/shop_faded.df7845a.svg +0 -1
  90. package/dist/assets/img/subiz-mono.877e9f5.svg +0 -3
  91. package/dist/assets/img/x.26fdfa3.svg +0 -5
  92. package/dist/malicious-app.js +0 -13
  93. package/dist/screenshoot.html +0 -7
  94. package/dist/screenshoot.js +0 -5677
@@ -205,7 +205,7 @@ textarea.form-control:focus, select.form-control:focus {
205
205
  padding-right: 20px ;
206
206
  }
207
207
  select {
208
- background: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00LjQxMDU4IDYuOTExMDdDNC43MzYwMiA2LjU4NTYzIDUuMjYzNjYgNi41ODU2MyA1LjU4OTA5IDYuOTExMDdMOS45OTk4NCAxMS4zMjE4TDE0LjQxMDYgNi45MTEwN0MxNC43MzYgNi41ODU2MyAxNS4yNjM3IDYuNTg1NjMgMTUuNTg5MSA2LjkxMTA3QzE1LjkxNDUgNy4yMzY1MSAxNS45MTQ1IDcuNzY0MTQgMTUuNTg5MSA4LjA4OTU4TDEwLjU4OTEgMTMuMDg5NkMxMC4yNjM3IDEzLjQxNSA5LjczNjAyIDEzLjQxNSA5LjQxMDU4IDEzLjA4OTZMNC40MTA1OCA4LjA4OTU4QzQuMDg1MTQgNy43NjQxNCA0LjA4NTE0IDcuMjM2NTEgNC40MTA1OCA2LjkxMTA3WiIgZmlsbD0iYmxhY2siLz4KPC9zdmc+") no-repeat right;
208
+ /*background: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00LjQxMDU4IDYuOTExMDdDNC43MzYwMiA2LjU4NTYzIDUuMjYzNjYgNi41ODU2MyA1LjU4OTA5IDYuOTExMDdMOS45OTk4NCAxMS4zMjE4TDE0LjQxMDYgNi45MTEwN0MxNC43MzYgNi41ODU2MyAxNS4yNjM3IDYuNTg1NjMgMTUuNTg5MSA2LjkxMTA3QzE1LjkxNDUgNy4yMzY1MSAxNS45MTQ1IDcuNzY0MTQgMTUuNTg5MSA4LjA4OTU4TDEwLjU4OTEgMTMuMDg5NkMxMC4yNjM3IDEzLjQxNSA5LjczNjAyIDEzLjQxNSA5LjQxMDU4IDEzLjA4OTZMNC40MTA1OCA4LjA4OTU4QzQuMDg1MTQgNy43NjQxNCA0LjA4NTE0IDcuMjM2NTEgNC40MTA1OCA2LjkxMTA3WiIgZmlsbD0iYmxhY2siLz4KPC9zdmc+") no-repeat right;*/
209
209
  }
210
210
  }
211
211
 
@@ -330,6 +330,94 @@ class Widget extends _common.Com {
330
330
  formData
331
331
  });
332
332
  }
333
+ renderCheckboxField(field) {
334
+ let items = _index.default.get(field, 'def.items', []);
335
+ let values = [];
336
+ let value = field.value || '';
337
+ if (value) values = value.split(',');
338
+ return (0, _preact.h)("div", null, _index.default.map(items, item => {
339
+ return (0, _preact.h)("div", {
340
+ class: "checkbox"
341
+ }, (0, _preact.h)("input", {
342
+ type: "checkbox",
343
+ id: 'form-checkbox' + encode(field.key) + item.value,
344
+ onChange: e => this.toggleCheckboxField(field.key, item.value),
345
+ checked: values.includes(item.value)
346
+ }), (0, _preact.h)("label", {
347
+ class: "checkbox--label",
348
+ for: 'form-checkbox' + encode(field.key) + item.value
349
+ }, this.props.t.i18n(item.i18n_label) || item.label || item.value), (0, _preact.h)("div", {
350
+ class: "checkbox--check"
351
+ }, (0, _preact.h)("div", null)));
352
+ }));
353
+ }
354
+ toggleCheckboxField(key, v) {
355
+ let formData = _index.default.cloneDeep(this.state.formData);
356
+ let field = _index.default.find(formData, (f, fkkey) => f.key === key);
357
+ if (!field) return;
358
+ let value = field.value || '';
359
+ let values = [];
360
+ if (value) values = value.split(',');
361
+ if (values.includes(v)) {
362
+ values = _index.default.filter(values, value => value !== v);
363
+ } else {
364
+ values.push(v);
365
+ }
366
+ field.value = values.join(',');
367
+ this.setState({
368
+ formData
369
+ });
370
+ }
371
+ renderRadioField(field) {
372
+ let items = _index.default.get(field, 'def.items', []);
373
+ let value = field.value || '';
374
+ return (0, _preact.h)("div", null, _index.default.map(items, item => {
375
+ return (0, _preact.h)("div", {
376
+ class: "radio"
377
+ }, (0, _preact.h)("input", {
378
+ type: "radio",
379
+ name: 'form-radio' + encode(field.key),
380
+ id: 'form-radio' + encode(field.key) + item.value,
381
+ onChange: e => this.toggleRadioField(field.key, item.value),
382
+ checked: value === item.value
383
+ }), (0, _preact.h)("label", {
384
+ class: "radio--label",
385
+ for: 'form-radio' + encode(field.key) + item.value
386
+ }, this.props.t.i18n(item.i18n_label) || item.label || item.value), (0, _preact.h)("div", {
387
+ class: "radio--check"
388
+ }, (0, _preact.h)("div", null)));
389
+ }));
390
+ }
391
+ toggleRadioField(key, v) {
392
+ let formData = _index.default.cloneDeep(this.state.formData);
393
+ let field = _index.default.find(formData, (f, fkkey) => f.key === key);
394
+ if (!field) return;
395
+ field.value = v;
396
+ this.setState({
397
+ formData
398
+ });
399
+ }
400
+ selectDropdownField(key, v) {
401
+ let formData = _index.default.cloneDeep(this.state.formData);
402
+ let field = _index.default.find(formData, (f, fkkey) => f.key === key);
403
+ if (!field) return;
404
+ field.value = v;
405
+ this.setState({
406
+ formData
407
+ });
408
+ }
409
+ renderDropdownField(field) {
410
+ let items = _index.default.get(field, 'def.items', []);
411
+ return (0, _preact.h)("select", {
412
+ class: "form-control",
413
+ value: field.value,
414
+ onChange: e => this.selectDropdownField(field.key, e.target.value)
415
+ }, (0, _preact.h)("option", {
416
+ value: ""
417
+ }, "-- ", this.props.t('no_select'), " --"), _index.default.map(items, item => (0, _preact.h)("option", {
418
+ value: item.value
419
+ }, this.props.t.i18n(item.i18n_label) || item.label || item.value)));
420
+ }
333
421
  renderFields() {
334
422
  if (_index.default.size(this.state.formData) === 0) return null;
335
423
  let $fields = _index.default.map(this.state.formData, (field, key) => {
@@ -348,6 +436,23 @@ class Widget extends _common.Com {
348
436
  row: "4",
349
437
  class: "form-control"
350
438
  });
439
+ } else if (_index.default.get(field, 'def.select') === 'checkbox') {
440
+ $field = this.renderCheckboxField(field);
441
+ } else if (_index.default.get(field, 'def.select') === 'radio') {
442
+ $field = this.renderRadioField(field);
443
+ } else if (_index.default.get(field, 'def.select') === 'dropdown') {
444
+ $field = this.renderDropdownField(field);
445
+ } else if (_index.default.get(field, 'def.multiple_line')) {
446
+ $field = (0, _preact.h)("textarea", {
447
+ class: "form-control",
448
+ ref: ref => {
449
+ this['form_' + encode(key)] = ref;
450
+ },
451
+ value: field.value || '',
452
+ onInput: e => this.onInputChange(key, e.target.value),
453
+ row: "4",
454
+ class: "form-control"
455
+ });
351
456
  } else {
352
457
  $field = (0, _preact.h)("input", {
353
458
  value: field.value || '',
@@ -680,6 +785,13 @@ class Widget extends _common.Com {
680
785
  let convo = this.props.store.matchConvo(this.props.cid) || {};
681
786
  if (convo.state === 'ended') return true;
682
787
  if (convo.state && convo.state !== 'pending') delete formData.group;
788
+
789
+ let isAllFiledEmpty = true;
790
+ _index.default.each(formData, field => {
791
+ if (field.value) isAllFiledEmpty = false;
792
+ });
793
+ if (isAllFiledEmpty) return true;
794
+
683
795
  return !!_index.default.find(formData, field => field.is_required && (field.value == null || field.value === ''));
684
796
  }
685
797
  renderConvoSummary(convo) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@subiz/widget-v4",
3
- "version": "4.0.96",
3
+ "version": "4.0.97",
4
4
  "main": "./compiled_src/lib.js",
5
5
  "scripts": {
6
6
  "dev": "npx webpack serve --config webpack.dev.js",
@@ -277,6 +277,117 @@ export default class Widget extends Com {
277
277
  this.setState({formData})
278
278
  }
279
279
 
280
+ renderCheckboxField(field) {
281
+ let items = sb.get(field, 'def.items', [])
282
+ let values = []
283
+ let value = field.value || ''
284
+ if (value) values = value.split(',')
285
+
286
+ return (
287
+ <div>
288
+ {sb.map(items, (item) => {
289
+ return (
290
+ <div class='checkbox'>
291
+ <input
292
+ type='checkbox'
293
+ id={'form-checkbox' + encode(field.key) + item.value}
294
+ onChange={(e) => this.toggleCheckboxField(field.key, item.value)}
295
+ checked={values.includes(item.value)}
296
+ />
297
+ <label class='checkbox--label' for={'form-checkbox' + encode(field.key) + item.value}>
298
+ {this.props.t.i18n(item.i18n_label) || item.label || item.value}
299
+ </label>
300
+ <div class='checkbox--check'>
301
+ <div></div>
302
+ </div>
303
+ </div>
304
+ )
305
+ })}
306
+ </div>
307
+ )
308
+ }
309
+
310
+ toggleCheckboxField(key, v) {
311
+ let formData = sb.cloneDeep(this.state.formData)
312
+ let field = sb.find(formData, (f, fkkey) => f.key === key)
313
+ if (!field) return
314
+
315
+ let value = field.value || ''
316
+ let values = []
317
+ if (value) values = value.split(',')
318
+ if (values.includes(v)) {
319
+ values = sb.filter(values, (value) => value !== v)
320
+ } else {
321
+ values.push(v)
322
+ }
323
+
324
+ field.value = values.join(',')
325
+ this.setState({formData})
326
+ }
327
+
328
+ renderRadioField(field) {
329
+ let items = sb.get(field, 'def.items', [])
330
+ let value = field.value || ''
331
+
332
+ return (
333
+ <div>
334
+ {sb.map(items, (item) => {
335
+ return (
336
+ <div class='radio'>
337
+ <input
338
+ type='radio'
339
+ name={'form-radio' + encode(field.key)}
340
+ id={'form-radio' + encode(field.key) + item.value}
341
+ onChange={(e) => this.toggleRadioField(field.key, item.value)}
342
+ checked={value === item.value}
343
+ />
344
+ <label class='radio--label' for={'form-radio' + encode(field.key) + item.value}>
345
+ {this.props.t.i18n(item.i18n_label) || item.label || item.value}
346
+ </label>
347
+ <div class='radio--check'>
348
+ <div></div>
349
+ </div>
350
+ </div>
351
+ )
352
+ })}
353
+ </div>
354
+ )
355
+ }
356
+
357
+ toggleRadioField(key, v) {
358
+ let formData = sb.cloneDeep(this.state.formData)
359
+ let field = sb.find(formData, (f, fkkey) => f.key === key)
360
+ if (!field) return
361
+
362
+ field.value = v
363
+ this.setState({formData})
364
+ }
365
+
366
+ selectDropdownField(key, v) {
367
+ let formData = sb.cloneDeep(this.state.formData)
368
+ let field = sb.find(formData, (f, fkkey) => f.key === key)
369
+ if (!field) return
370
+
371
+ field.value = v
372
+ this.setState({formData})
373
+ }
374
+
375
+ renderDropdownField(field) {
376
+ let items = sb.get(field, 'def.items', [])
377
+ return (
378
+ <select
379
+ class='form-control'
380
+ value={field.value}
381
+ onChange={(e) => this.selectDropdownField(field.key, e.target.value)}
382
+ >
383
+ <option value=''>-- {this.props.t('no_select')} --</option>
384
+ {sb.map(items, (item) => (
385
+ <option value={item.value}>{this.props.t.i18n(item.i18n_label) || item.label || item.value}</option>
386
+ ))}
387
+ </select>
388
+ )
389
+ }
390
+
280
391
  renderFields() {
281
392
  if (sb.size(this.state.formData) === 0) return null
282
393
 
@@ -300,6 +411,25 @@ export default class Widget extends Com {
300
411
  class='form-control'
301
412
  ></textarea>
302
413
  )
414
+ } else if (sb.get(field, 'def.select') === 'checkbox') {
415
+ $field = this.renderCheckboxField(field)
416
+ } else if (sb.get(field, 'def.select') === 'radio') {
417
+ $field = this.renderRadioField(field)
418
+ } else if (sb.get(field, 'def.select') === 'dropdown') {
419
+ $field = this.renderDropdownField(field)
420
+ } else if (sb.get(field, 'def.multiple_line')) {
421
+ $field = (
422
+ <textarea
423
+ class='form-control'
424
+ ref={(ref) => {
425
+ this['form_' + encode(key)] = ref
426
+ }}
427
+ value={field.value || ''}
428
+ onInput={(e) => this.onInputChange(key, e.target.value)}
429
+ row='4'
430
+ class='form-control'
431
+ ></textarea>
432
+ )
303
433
  } else {
304
434
  $field = (
305
435
  <input
@@ -717,6 +847,14 @@ export default class Widget extends Com {
717
847
  // allow button "Tiep tuc chat" display when sent quick_replies msg
718
848
  //if (this.userHasSent(this.props.cid)) return false
719
849
  if (convo.state && convo.state !== 'pending') delete formData.group
850
+
851
+ // Make sure to show form in the first time
852
+ let isAllFiledEmpty = true
853
+ sb.each(formData, (field) => {
854
+ if (field.value) isAllFiledEmpty = false
855
+ })
856
+ if (isAllFiledEmpty && !this.userHasSent(this.props.cid)) return true
857
+
720
858
  return !!sb.find(formData, (field) => field.is_required && (field.value == null || field.value === ''))
721
859
  }
722
860