gift-message.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. /**
  2. * Copyright © Magento, Inc. All rights reserved.
  3. * See COPYING.txt for license details.
  4. */
  5. /**
  6. * @api
  7. */
  8. define([
  9. 'uiElement',
  10. 'underscore',
  11. 'mage/url'
  12. ], function (uiElement, _, url) {
  13. 'use strict';
  14. var provider = uiElement();
  15. return function (itemId) {
  16. var model = {
  17. id: 'message-' + itemId,
  18. itemId: itemId,
  19. observables: {},
  20. additionalOptions: [],
  21. submitParams: [
  22. 'recipient',
  23. 'sender',
  24. 'message'
  25. ],
  26. /**
  27. * Initialize.
  28. */
  29. initialize: function () {
  30. var message = false;
  31. this.getObservable('alreadyAdded')(false);
  32. if (this.itemId == 'orderLevel') { //eslint-disable-line eqeqeq
  33. message = window.giftOptionsConfig.giftMessage.hasOwnProperty(this.itemId) ?
  34. window.giftOptionsConfig.giftMessage[this.itemId] :
  35. null;
  36. } else {
  37. message =
  38. window.giftOptionsConfig.giftMessage.hasOwnProperty('itemLevel') &&
  39. window.giftOptionsConfig.giftMessage.itemLevel.hasOwnProperty(this.itemId) ?
  40. window.giftOptionsConfig.giftMessage.itemLevel[this.itemId].message :
  41. null;
  42. }
  43. if (_.isObject(message)) {
  44. this.getObservable('recipient')(message.recipient);
  45. this.getObservable('sender')(message.sender);
  46. this.getObservable('message')(message.message);
  47. this.getObservable('alreadyAdded')(true);
  48. }
  49. },
  50. /**
  51. * @param {String} key
  52. * @return {*}
  53. */
  54. getObservable: function (key) {
  55. this.initObservable(this.id, key);
  56. return provider[this.getUniqueKey(this.id, key)];
  57. },
  58. /**
  59. * @param {String} node
  60. * @param {String} key
  61. */
  62. initObservable: function (node, key) {
  63. if (node && !this.observables.hasOwnProperty(node)) {
  64. this.observables[node] = [];
  65. }
  66. if (key && this.observables[node].indexOf(key) === -1) {
  67. this.observables[node].push(key);
  68. provider.observe(this.getUniqueKey(node, key));
  69. }
  70. },
  71. /**
  72. * @param {String} node
  73. * @param {String} key
  74. * @return {String}
  75. */
  76. getUniqueKey: function (node, key) {
  77. return node + '-' + key;
  78. },
  79. /**
  80. * @param {String} key
  81. * @return {null}
  82. */
  83. getConfigValue: function (key) {
  84. return window.giftOptionsConfig.hasOwnProperty(key) ?
  85. window.giftOptionsConfig[key]
  86. : null;
  87. },
  88. /**
  89. * Reset.
  90. */
  91. reset: function () {
  92. this.getObservable('isClear')(true);
  93. },
  94. /**
  95. * @return {Array}
  96. */
  97. getAfterSubmitCallbacks: function () {
  98. var callbacks = [];
  99. callbacks.push(this.afterSubmit);
  100. _.each(this.additionalOptions, function (option) {
  101. if (_.isFunction(option.afterSubmit)) {
  102. callbacks.push(option.afterSubmit);
  103. }
  104. });
  105. return callbacks;
  106. },
  107. /**
  108. * After submit.
  109. */
  110. afterSubmit: function () {
  111. window.location.href = url.build('checkout/cart/updatePost') +
  112. '?form_key=' + window.checkoutConfig.formKey +
  113. '&cart[]';
  114. },
  115. /**
  116. * @param {Boolean} remove
  117. * @return {Object}
  118. */
  119. getSubmitParams: function (remove) {
  120. var params = {},
  121. self = this;
  122. _.each(this.submitParams, function (key) {
  123. var observable = provider[self.getUniqueKey(self.id, key)];
  124. if (_.isFunction(observable)) {
  125. params[key] = remove ? null : observable();
  126. }
  127. });
  128. if (this.additionalOptions.length) {
  129. params['extension_attributes'] = {};
  130. }
  131. _.each(this.additionalOptions, function (option) {
  132. if (_.isFunction(option.getSubmitParams)) {
  133. params['extension_attributes'] = _.extend(
  134. params['extension_attributes'],
  135. option.getSubmitParams(remove)
  136. );
  137. }
  138. });
  139. return params;
  140. },
  141. /**
  142. * Check if gift message can be displayed
  143. *
  144. * @returns {Boolean}
  145. */
  146. isGiftMessageAvailable: function () {
  147. var isGloballyAvailable,
  148. giftMessageConfig,
  149. itemConfig;
  150. // itemId represent gift message level: 'orderLevel' constant or cart item ID
  151. if (this.itemId === 'orderLevel') {
  152. return this.getConfigValue('isOrderLevelGiftOptionsEnabled');
  153. }
  154. // gift message product configuration must override system configuration
  155. isGloballyAvailable = this.getConfigValue('isItemLevelGiftOptionsEnabled');
  156. giftMessageConfig = window.giftOptionsConfig.giftMessage;
  157. itemConfig = giftMessageConfig.hasOwnProperty('itemLevel') &&
  158. giftMessageConfig.itemLevel.hasOwnProperty(this.itemId) ?
  159. giftMessageConfig.itemLevel[this.itemId] :
  160. {};
  161. return itemConfig.hasOwnProperty('is_available') ? itemConfig['is_available'] : isGloballyAvailable;
  162. }
  163. };
  164. model.initialize();
  165. return model;
  166. };
  167. });