globalSearch.js 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. import { CardSearchPagedComponent } from '../../lib/cardSearch';
  2. import Boards from '../../../models/boards';
  3. import { Query, QueryErrors } from '../../../config/query-classes';
  4. // const subManager = new SubsManager();
  5. BlazeComponent.extendComponent({
  6. events() {
  7. return [
  8. {
  9. 'click .js-due-cards-view-change': Popup.open('globalSearchViewChange'),
  10. },
  11. ];
  12. },
  13. }).register('globalSearchHeaderBar');
  14. Template.globalSearch.helpers({
  15. userId() {
  16. return Meteor.userId();
  17. },
  18. });
  19. class GlobalSearchComponent extends CardSearchPagedComponent {
  20. onCreated() {
  21. super.onCreated();
  22. this.myLists = new ReactiveVar([]);
  23. this.myLabelNames = new ReactiveVar([]);
  24. this.myBoardNames = new ReactiveVar([]);
  25. this.parsingErrors = new QueryErrors();
  26. this.queryParams = null;
  27. Meteor.call('myLists', (err, data) => {
  28. if (!err) {
  29. this.myLists.set(data);
  30. }
  31. });
  32. Meteor.call('myLabelNames', (err, data) => {
  33. if (!err) {
  34. this.myLabelNames.set(data);
  35. }
  36. });
  37. Meteor.call('myBoardNames', (err, data) => {
  38. if (!err) {
  39. this.myBoardNames.set(data);
  40. }
  41. });
  42. }
  43. onRendered() {
  44. Meteor.subscribe('setting');
  45. // eslint-disable-next-line no-console
  46. //console.log('lang:', TAPi18n.getLanguage());
  47. if (Session.get('globalQuery')) {
  48. this.searchAllBoards(Session.get('globalQuery'));
  49. }
  50. }
  51. resetSearch() {
  52. super.resetSearch();
  53. this.parsingErrors = new QueryErrors();
  54. }
  55. errorMessages() {
  56. if (this.parsingErrors.hasErrors()) {
  57. return this.parsingErrors.errorMessages();
  58. }
  59. return this.queryErrorMessages();
  60. }
  61. parsingErrorMessages() {
  62. this.parsingErrors.errorMessages();
  63. }
  64. searchAllBoards(queryText) {
  65. queryText = queryText.trim();
  66. // eslint-disable-next-line no-console
  67. //console.log('queryText:', queryText);
  68. this.query.set(queryText);
  69. this.resetSearch();
  70. if (!queryText) {
  71. return;
  72. }
  73. this.searching.set(true);
  74. const query = new Query();
  75. query.buildParams(queryText);
  76. // eslint-disable-next-line no-console
  77. // console.log('params:', query.getParams());
  78. this.queryParams = query.getQueryParams().getParams();
  79. if (query.hasErrors()) {
  80. this.searching.set(false);
  81. this.queryErrors = query.errors();
  82. this.hasResults.set(true);
  83. this.hasQueryErrors.set(true);
  84. return;
  85. }
  86. this.runGlobalSearch(query.getQueryParams());
  87. }
  88. searchInstructions() {
  89. const tags = {
  90. operator_board: TAPi18n.__('operator-board'),
  91. operator_list: TAPi18n.__('operator-list'),
  92. operator_swimlane: TAPi18n.__('operator-swimlane'),
  93. operator_comment: TAPi18n.__('operator-comment'),
  94. operator_label: TAPi18n.__('operator-label'),
  95. operator_label_abbrev: TAPi18n.__('operator-label-abbrev'),
  96. operator_user: TAPi18n.__('operator-user'),
  97. operator_user_abbrev: TAPi18n.__('operator-user-abbrev'),
  98. operator_member: TAPi18n.__('operator-member'),
  99. operator_member_abbrev: TAPi18n.__('operator-member-abbrev'),
  100. operator_assignee: TAPi18n.__('operator-assignee'),
  101. operator_assignee_abbrev: TAPi18n.__('operator-assignee-abbrev'),
  102. operator_creator: TAPi18n.__('operator-creator'),
  103. operator_due: TAPi18n.__('operator-due'),
  104. operator_created: TAPi18n.__('operator-created'),
  105. operator_modified: TAPi18n.__('operator-modified'),
  106. operator_status: TAPi18n.__('operator-status'),
  107. operator_has: TAPi18n.__('operator-has'),
  108. operator_sort: TAPi18n.__('operator-sort'),
  109. operator_limit: TAPi18n.__('operator-limit'),
  110. predicate_overdue: TAPi18n.__('predicate-overdue'),
  111. predicate_archived: TAPi18n.__('predicate-archived'),
  112. predicate_all: TAPi18n.__('predicate-all'),
  113. predicate_ended: TAPi18n.__('predicate-ended'),
  114. predicate_week: TAPi18n.__('predicate-week'),
  115. predicate_month: TAPi18n.__('predicate-month'),
  116. predicate_quarter: TAPi18n.__('predicate-quarter'),
  117. predicate_year: TAPi18n.__('predicate-year'),
  118. predicate_attachment: TAPi18n.__('predicate-attachment'),
  119. predicate_description: TAPi18n.__('predicate-description'),
  120. predicate_checklist: TAPi18n.__('predicate-checklist'),
  121. predicate_public: TAPi18n.__('predicate-public'),
  122. predicate_private: TAPi18n.__('predicate-private'),
  123. predicate_due: TAPi18n.__('predicate-due'),
  124. predicate_created: TAPi18n.__('predicate-created'),
  125. predicate_modified: TAPi18n.__('predicate-modified'),
  126. predicate_start: TAPi18n.__('predicate-start'),
  127. predicate_end: TAPi18n.__('predicate-end'),
  128. predicate_assignee: TAPi18n.__('predicate-assignee'),
  129. predicate_member: TAPi18n.__('predicate-member'),
  130. };
  131. let text = '';
  132. [
  133. ['# ', 'globalSearch-instructions-heading'],
  134. ['\n', 'globalSearch-instructions-description'],
  135. ['\n\n', 'globalSearch-instructions-operators'],
  136. ['\n* ', 'globalSearch-instructions-operator-board'],
  137. ['\n* ', 'globalSearch-instructions-operator-list'],
  138. ['\n* ', 'globalSearch-instructions-operator-swimlane'],
  139. ['\n* ', 'globalSearch-instructions-operator-comment'],
  140. ['\n* ', 'globalSearch-instructions-operator-label'],
  141. ['\n* ', 'globalSearch-instructions-operator-hash'],
  142. ['\n* ', 'globalSearch-instructions-operator-user'],
  143. ['\n* ', 'globalSearch-instructions-operator-at'],
  144. ['\n* ', 'globalSearch-instructions-operator-member'],
  145. ['\n* ', 'globalSearch-instructions-operator-assignee'],
  146. ['\n* ', 'globalSearch-instructions-operator-creator'],
  147. ['\n* ', 'globalSearch-instructions-operator-due'],
  148. ['\n* ', 'globalSearch-instructions-operator-created'],
  149. ['\n* ', 'globalSearch-instructions-operator-modified'],
  150. ['\n* ', 'globalSearch-instructions-operator-status'],
  151. ['\n * ', 'globalSearch-instructions-status-archived'],
  152. ['\n * ', 'globalSearch-instructions-status-public'],
  153. ['\n * ', 'globalSearch-instructions-status-private'],
  154. ['\n * ', 'globalSearch-instructions-status-all'],
  155. ['\n * ', 'globalSearch-instructions-status-ended'],
  156. ['\n* ', 'globalSearch-instructions-operator-has'],
  157. ['\n* ', 'globalSearch-instructions-operator-sort'],
  158. ['\n* ', 'globalSearch-instructions-operator-limit'],
  159. ['\n## ', 'heading-notes'],
  160. ['\n* ', 'globalSearch-instructions-notes-1'],
  161. ['\n* ', 'globalSearch-instructions-notes-2'],
  162. ['\n* ', 'globalSearch-instructions-notes-3'],
  163. ['\n* ', 'globalSearch-instructions-notes-3-2'],
  164. ['\n* ', 'globalSearch-instructions-notes-4'],
  165. ['\n* ', 'globalSearch-instructions-notes-5'],
  166. ].forEach(([prefix, instruction]) => {
  167. text += `${prefix}${TAPi18n.__(instruction, tags)}`;
  168. });
  169. return text;
  170. }
  171. labelColors() {
  172. return Boards.simpleSchema()._schema['labels.$.color'].allowedValues.map(
  173. color => {
  174. return { color, name: TAPi18n.__(`color-${color}`) };
  175. },
  176. );
  177. }
  178. events() {
  179. return super.events().concat([
  180. {
  181. 'submit .js-search-query-form'(evt) {
  182. evt.preventDefault();
  183. this.searchAllBoards(evt.target.searchQuery.value);
  184. },
  185. 'click .js-label-color'(evt) {
  186. evt.preventDefault();
  187. const input = document.getElementById('global-search-input');
  188. this.query.set(
  189. `${input.value} ${TAPi18n.__('operator-label')}:"${
  190. evt.currentTarget.textContent
  191. }"`,
  192. );
  193. document.getElementById('global-search-input').focus();
  194. },
  195. 'click .js-board-title'(evt) {
  196. evt.preventDefault();
  197. const input = document.getElementById('global-search-input');
  198. this.query.set(
  199. `${input.value} ${TAPi18n.__('operator-board')}:"${
  200. evt.currentTarget.textContent
  201. }"`,
  202. );
  203. document.getElementById('global-search-input').focus();
  204. },
  205. 'click .js-list-title'(evt) {
  206. evt.preventDefault();
  207. const input = document.getElementById('global-search-input');
  208. this.query.set(
  209. `${input.value} ${TAPi18n.__('operator-list')}:"${
  210. evt.currentTarget.textContent
  211. }"`,
  212. );
  213. document.getElementById('global-search-input').focus();
  214. },
  215. 'click .js-label-name'(evt) {
  216. evt.preventDefault();
  217. const input = document.getElementById('global-search-input');
  218. this.query.set(
  219. `${input.value} ${TAPi18n.__('operator-label')}:"${
  220. evt.currentTarget.textContent
  221. }"`,
  222. );
  223. document.getElementById('global-search-input').focus();
  224. },
  225. 'click .js-new-search'(evt) {
  226. evt.preventDefault();
  227. const input = document.getElementById('global-search-input');
  228. input.value = '';
  229. this.query.set('');
  230. this.hasResults.set(false);
  231. },
  232. },
  233. ]);
  234. }
  235. }
  236. GlobalSearchComponent.register('globalSearch');