sidebarCustomFields.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. BlazeComponent.extendComponent({
  2. customFields() {
  3. return CustomFields.find({
  4. boardIds: { $in: [Session.get('currentBoard')] },
  5. });
  6. },
  7. events() {
  8. return [
  9. {
  10. 'click .js-open-create-custom-field': Popup.open('createCustomField'),
  11. 'click .js-edit-custom-field': Popup.open('editCustomField'),
  12. },
  13. ];
  14. },
  15. }).register('customFieldsSidebar');
  16. const CreateCustomFieldPopup = BlazeComponent.extendComponent({
  17. _types: ['text', 'number', 'date', 'dropdown', 'currency'],
  18. _currencyList: [
  19. {
  20. name: 'US Dollar',
  21. code: 'USD',
  22. },
  23. {
  24. name: 'Euro',
  25. code: 'EUR',
  26. },
  27. {
  28. name: 'Yen',
  29. code: 'JPY',
  30. },
  31. {
  32. name: 'Pound Sterling',
  33. code: 'GBP',
  34. },
  35. {
  36. name: 'Australian Dollar',
  37. code: 'AUD',
  38. },
  39. {
  40. name: 'Canadian Dollar',
  41. code: 'CAD',
  42. },
  43. {
  44. name: 'Swiss Franc',
  45. code: 'CHF',
  46. },
  47. {
  48. name: 'Yuan Renminbi',
  49. code: 'CNY',
  50. },
  51. {
  52. name: 'Hong Kong Dollar',
  53. code: 'HKD',
  54. },
  55. {
  56. name: 'New Zealand Dollar',
  57. code: 'NZD',
  58. },
  59. ],
  60. onCreated() {
  61. this.type = new ReactiveVar(
  62. this.data().type ? this.data().type : this._types[0],
  63. );
  64. this.currencyCode = new ReactiveVar(
  65. this.data().settings && this.data().settings.currencyCode
  66. ? this.data().settings.currencyCode
  67. : this._currencyList[0].code,
  68. );
  69. this.dropdownItems = new ReactiveVar(
  70. this.data().settings && this.data().settings.dropdownItems
  71. ? this.data().settings.dropdownItems
  72. : [],
  73. );
  74. },
  75. types() {
  76. const currentType = this.data().type;
  77. return this._types.map(type => {
  78. return {
  79. value: type,
  80. name: TAPi18n.__(`custom-field-${type}`),
  81. selected: type === currentType,
  82. };
  83. });
  84. },
  85. isTypeNotSelected(type) {
  86. return this.type.get() !== type;
  87. },
  88. getCurrencyCodes() {
  89. const currentCode = this.currencyCode.get();
  90. return this._currencyList.map(({ name, code }) => {
  91. return {
  92. name: `${code} - ${name}`,
  93. value: code,
  94. selected: code === currentCode,
  95. };
  96. });
  97. },
  98. getDropdownItems() {
  99. const items = this.dropdownItems.get();
  100. Array.from(this.findAll('.js-field-settings-dropdown input')).forEach(
  101. (el, index) => {
  102. //console.log('each item!', index, el.value);
  103. if (!items[index])
  104. items[index] = {
  105. _id: Random.id(6),
  106. };
  107. items[index].name = el.value.trim();
  108. },
  109. );
  110. return items;
  111. },
  112. getSettings() {
  113. const settings = {};
  114. switch (this.type.get()) {
  115. case 'currency': {
  116. const currencyCode = this.currencyCode.get();
  117. settings.currencyCode = currencyCode;
  118. break;
  119. }
  120. case 'dropdown': {
  121. const dropdownItems = this.getDropdownItems().filter(
  122. item => !!item.name.trim(),
  123. );
  124. settings.dropdownItems = dropdownItems;
  125. break;
  126. }
  127. }
  128. return settings;
  129. },
  130. events() {
  131. return [
  132. {
  133. 'change .js-field-type'(evt) {
  134. const value = evt.target.value;
  135. this.type.set(value);
  136. },
  137. 'change .js-field-currency'(evt) {
  138. const value = evt.target.value;
  139. this.currencyCode.set(value);
  140. },
  141. 'keydown .js-dropdown-item.last'(evt) {
  142. if (evt.target.value.trim() && evt.keyCode === 13) {
  143. const items = this.getDropdownItems();
  144. this.dropdownItems.set(items);
  145. evt.target.value = '';
  146. }
  147. },
  148. 'click .js-field-show-on-card'(evt) {
  149. let $target = $(evt.target);
  150. if (!$target.hasClass('js-field-show-on-card')) {
  151. $target = $target.parent();
  152. }
  153. $target.find('.materialCheckBox').toggleClass('is-checked');
  154. $target.toggleClass('is-checked');
  155. },
  156. 'click .js-field-automatically-on-card'(evt) {
  157. let $target = $(evt.target);
  158. if (!$target.hasClass('js-field-automatically-on-card')) {
  159. $target = $target.parent();
  160. }
  161. $target.find('.materialCheckBox').toggleClass('is-checked');
  162. $target.toggleClass('is-checked');
  163. },
  164. 'click .js-field-always-on-card'(evt) {
  165. let $target = $(evt.target);
  166. if (!$target.hasClass('js-field-always-on-card')) {
  167. $target = $target.parent();
  168. }
  169. $target.find('.materialCheckBox').toggleClass('is-checked');
  170. $target.toggleClass('is-checked');
  171. },
  172. 'click .js-field-showLabel-on-card'(evt) {
  173. let $target = $(evt.target);
  174. if (!$target.hasClass('js-field-showLabel-on-card')) {
  175. $target = $target.parent();
  176. }
  177. $target.find('.materialCheckBox').toggleClass('is-checked');
  178. $target.toggleClass('is-checked');
  179. },
  180. 'click .primary'(evt) {
  181. evt.preventDefault();
  182. const data = {
  183. name: this.find('.js-field-name').value.trim(),
  184. type: this.type.get(),
  185. settings: this.getSettings(),
  186. showOnCard: this.find('.js-field-show-on-card.is-checked') !== null,
  187. showLabelOnMiniCard:
  188. this.find('.js-field-showLabel-on-card.is-checked') !== null,
  189. automaticallyOnCard:
  190. this.find('.js-field-automatically-on-card.is-checked') !== null,
  191. alwaysOnCard:
  192. this.find('.js-field-always-on-card.is-checked') !== null,
  193. };
  194. // insert or update
  195. if (!this.data()._id) {
  196. data.boardIds = [Session.get('currentBoard')];
  197. CustomFields.insert(data);
  198. } else {
  199. CustomFields.update(this.data()._id, { $set: data });
  200. }
  201. Popup.back();
  202. },
  203. 'click .js-delete-custom-field': Popup.afterConfirm(
  204. 'deleteCustomField',
  205. function() {
  206. const customField = CustomFields.findOne(this._id);
  207. if (customField.boardIds.length > 1) {
  208. CustomFields.update(customField._id, {
  209. $pull: {
  210. boardIds: Session.get('currentBoard'),
  211. },
  212. });
  213. } else {
  214. CustomFields.remove(customField._id);
  215. }
  216. Popup.close();
  217. },
  218. ),
  219. },
  220. ];
  221. },
  222. });
  223. CreateCustomFieldPopup.register('createCustomFieldPopup');
  224. (class extends CreateCustomFieldPopup {
  225. template() {
  226. return 'createCustomFieldPopup';
  227. }
  228. }.register('editCustomFieldPopup'));
  229. /*Template.deleteCustomFieldPopup.events({
  230. 'submit'(evt) {
  231. const customFieldId = this._id;
  232. CustomFields.remove(customFieldId);
  233. Popup.close();
  234. }
  235. });*/