|
@@ -0,0 +1,148 @@
|
|
|
|
+const subManager = new SubsManager();
|
|
|
|
+
|
|
|
|
+BlazeComponent.extendComponent({
|
|
|
|
+ events() {
|
|
|
|
+ return [
|
|
|
|
+ {
|
|
|
|
+ 'click .js-due-cards-view-change': Popup.open('globalSearchViewChange'),
|
|
|
|
+ },
|
|
|
|
+ ];
|
|
|
|
+ },
|
|
|
|
+}).register('globalSearchHeaderBar');
|
|
|
|
+
|
|
|
|
+Template.globalSearch.helpers({
|
|
|
|
+ userId() {
|
|
|
|
+ return Meteor.userId();
|
|
|
|
+ },
|
|
|
|
+});
|
|
|
|
+
|
|
|
|
+BlazeComponent.extendComponent({
|
|
|
|
+ events() {
|
|
|
|
+ return [
|
|
|
|
+ {
|
|
|
|
+ 'click .js-due-cards-view-me'() {
|
|
|
|
+ Utils.setDueCardsView('me');
|
|
|
|
+ Popup.close();
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ 'click .js-due-cards-view-all'() {
|
|
|
|
+ Utils.setDueCardsView('all');
|
|
|
|
+ Popup.close();
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ ];
|
|
|
|
+ },
|
|
|
|
+}).register('globalSearchViewChangePopup');
|
|
|
|
+
|
|
|
|
+BlazeComponent.extendComponent({
|
|
|
|
+ onCreated() {
|
|
|
|
+ this.isPageReady = new ReactiveVar(true);
|
|
|
|
+ this.query = new ReactiveVar('');
|
|
|
|
+
|
|
|
|
+ // this.autorun(() => {
|
|
|
|
+ // const handle = subManager.subscribe('globalSearch');
|
|
|
|
+ // Tracker.nonreactive(() => {
|
|
|
|
+ // Tracker.autorun(() => {
|
|
|
|
+ // this.isPageReady.set(handle.ready());
|
|
|
|
+ // });
|
|
|
|
+ // });
|
|
|
|
+ // });
|
|
|
|
+ Meteor.subscribe('setting');
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ events() {
|
|
|
|
+ return [
|
|
|
|
+ {
|
|
|
|
+ 'submit .js-search-query-form'(evt) {
|
|
|
|
+ evt.preventDefault();
|
|
|
|
+ this.query.set(evt.target.searchQuery.value);
|
|
|
|
+ // eslint-disable-next-line no-console
|
|
|
|
+ console.log('query:', this.query.get());
|
|
|
|
+
|
|
|
|
+ let query = this.query.get();
|
|
|
|
+ const reUser = /^@(?<user>\w+)(\s+|$)/;
|
|
|
|
+ const reLabel = /^#(?<label>\w+)(\s+|$)/;
|
|
|
|
+ const reOperator1 = /^(?<operator>\w+):(?<value>\w+)(\s+|$)/;
|
|
|
|
+ const reOperator2 = /^(?<operator>\w+):(?<quote>["']*)(?<value>.*?)\k<quote>(\s+|$)/;
|
|
|
|
+ const reText = /^(?<text>[^:@#\s]+)(\s+|$)/;
|
|
|
|
+ const reQuotedText = /^(?<quote>["'])(?<text>\w+)\k<quote>(\s+|$)/;
|
|
|
|
+ const operatorMap = {
|
|
|
|
+ board: 'boards',
|
|
|
|
+ b: 'boards',
|
|
|
|
+ label: 'labels',
|
|
|
|
+ lable: 'labels',
|
|
|
|
+ user: 'users',
|
|
|
|
+ u: 'users',
|
|
|
|
+ swimlane: 'swimlanes',
|
|
|
|
+ swim: 'swimlanes',
|
|
|
|
+ s: 'swimlanes',
|
|
|
|
+ list: 'lists',
|
|
|
|
+ l: 'lists',
|
|
|
|
+ };
|
|
|
|
+ const selector = {
|
|
|
|
+ boards: [],
|
|
|
|
+ swimlanes: [],
|
|
|
|
+ lists: [],
|
|
|
|
+ users: [],
|
|
|
|
+ labels: [],
|
|
|
|
+ };
|
|
|
|
+ let text = '';
|
|
|
|
+ while (query) {
|
|
|
|
+ // eslint-disable-next-line no-console
|
|
|
|
+ console.log('query:', query);
|
|
|
|
+ let m = query.match(reUser);
|
|
|
|
+ if (m) {
|
|
|
|
+ query = query.replace(reUser, '');
|
|
|
|
+ selector.users.push(m.groups.user);
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ m = query.match(reLabel);
|
|
|
|
+ if (m) {
|
|
|
|
+ query = query.replace(reLabel, '');
|
|
|
|
+ selector.labels.push(m.groups.label);
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ m = query.match(reOperator1);
|
|
|
|
+ if (!m) {
|
|
|
|
+ m = query.match(reOperator2);
|
|
|
|
+ if (m) {
|
|
|
|
+ query = query.replace(reOperator2, '');
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ query = query.replace(reOperator1, '');
|
|
|
|
+ }
|
|
|
|
+ if (m) {
|
|
|
|
+ const op = m.groups.operator.toLowerCase();
|
|
|
|
+ if (op in operatorMap) {
|
|
|
|
+ selector[operatorMap[op]].push(m.groups.value);
|
|
|
|
+ }
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ m = query.match(reQuotedText);
|
|
|
|
+ if (!m) {
|
|
|
|
+ m = query.match(reText);
|
|
|
|
+ if (m) {
|
|
|
|
+ query = query.replace(reText, '');
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ query = query.replace(reQuotedText, '');
|
|
|
|
+ }
|
|
|
|
+ if (m) {
|
|
|
|
+ text += (text ? ' ' : '') + m.groups.text;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // eslint-disable-next-line no-console
|
|
|
|
+ console.log('selector:', selector);
|
|
|
|
+ // eslint-disable-next-line no-console
|
|
|
|
+ console.log('text:', text);
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ ];
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ globalSearchList() {},
|
|
|
|
+}).register('globalSearch');
|