|  | @@ -1,6 +1,8 @@
 | 
	
		
			
				|  |  |  import { AttachmentStorage } from '/models/attachments';
 | 
	
		
			
				|  |  |  import { CardSearchPagedComponent } from '/client/lib/cardSearch';
 | 
	
		
			
				|  |  |  import SessionData from '/models/usersessiondata';
 | 
	
		
			
				|  |  | +import { QueryParams } from '/config/query-classes';
 | 
	
		
			
				|  |  | +import { OPERATOR_LIMIT } from '/config/search-const';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  BlazeComponent.extendComponent({
 | 
	
		
			
				|  |  |    subscription: null,
 | 
	
	
		
			
				|  | @@ -8,10 +10,13 @@ BlazeComponent.extendComponent({
 | 
	
		
			
				|  |  |    showBrokenCardsReport: new ReactiveVar(false),
 | 
	
		
			
				|  |  |    showOrphanedFilesReport: new ReactiveVar(false),
 | 
	
		
			
				|  |  |    showRulesReport: new ReactiveVar(false),
 | 
	
		
			
				|  |  | +  showCardsReport: new ReactiveVar(false),
 | 
	
		
			
				|  |  | +  sessionId: null,
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    onCreated() {
 | 
	
		
			
				|  |  |      this.error = new ReactiveVar('');
 | 
	
		
			
				|  |  |      this.loading = new ReactiveVar(false);
 | 
	
		
			
				|  |  | +    this.sessionId = SessionData.getSessionId();
 | 
	
		
			
				|  |  |    },
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    events() {
 | 
	
	
		
			
				|  | @@ -21,6 +26,7 @@ BlazeComponent.extendComponent({
 | 
	
		
			
				|  |  |          'click a.js-report-files': this.switchMenu,
 | 
	
		
			
				|  |  |          'click a.js-report-orphaned-files': this.switchMenu,
 | 
	
		
			
				|  |  |          'click a.js-report-rules': this.switchMenu,
 | 
	
		
			
				|  |  | +        'click a.js-report-cards': this.switchMenu,
 | 
	
		
			
				|  |  |        },
 | 
	
		
			
				|  |  |      ];
 | 
	
		
			
				|  |  |    },
 | 
	
	
		
			
				|  | @@ -64,68 +70,66 @@ BlazeComponent.extendComponent({
 | 
	
		
			
				|  |  |            this.showRulesReport.set(true);
 | 
	
		
			
				|  |  |            this.loading.set(false);
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  | +      } else if ('report-cards' === targetID) {
 | 
	
		
			
				|  |  | +        const qp = new QueryParams();
 | 
	
		
			
				|  |  | +        qp.addPredicate(OPERATOR_LIMIT, 300);
 | 
	
		
			
				|  |  | +        this.subscription = Meteor.subscribe(
 | 
	
		
			
				|  |  | +          'globalSearch',
 | 
	
		
			
				|  |  | +          this.sessionId,
 | 
	
		
			
				|  |  | +          qp.getParams(),
 | 
	
		
			
				|  |  | +          qp.text,
 | 
	
		
			
				|  |  | +          () => {
 | 
	
		
			
				|  |  | +            this.showCardsReport.set(true);
 | 
	
		
			
				|  |  | +            this.loading.set(false);
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +        );
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    },
 | 
	
		
			
				|  |  |  }).register('adminReports');
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -Template.filesReport.helpers({
 | 
	
		
			
				|  |  | -  attachmentFiles() {
 | 
	
		
			
				|  |  | +class AdminReport extends BlazeComponent {
 | 
	
		
			
				|  |  | +  collection;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  results() {
 | 
	
		
			
				|  |  |      // eslint-disable-next-line no-console
 | 
	
		
			
				|  |  |      // console.log('attachments:', AttachmentStorage.find());
 | 
	
		
			
				|  |  |      // console.log('attachments.count:', AttachmentStorage.find().count());
 | 
	
		
			
				|  |  | -    return AttachmentStorage.find();
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  rulesReport() {
 | 
	
		
			
				|  |  | -    const rules = [];
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    Rules.find().forEach(rule => {
 | 
	
		
			
				|  |  | -      rules.push({
 | 
	
		
			
				|  |  | -        _id: rule._id,
 | 
	
		
			
				|  |  | -        title: rule.title,
 | 
	
		
			
				|  |  | -        boardId: rule.boardId,
 | 
	
		
			
				|  |  | -        boardTitle: rule.board().title,
 | 
	
		
			
				|  |  | -        action: rule.action().fetch(),
 | 
	
		
			
				|  |  | -        trigger: rule.trigger().fetch(),
 | 
	
		
			
				|  |  | -      });
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return rules;
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | +    return this.collection.find();
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    resultsCount() {
 | 
	
		
			
				|  |  | -    return AttachmentStorage.find().count();
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | +    return this.collection.find().count();
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    fileSize(size) {
 | 
	
		
			
				|  |  |      return Math.round(size / 1024);
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    usageCount(key) {
 | 
	
		
			
				|  |  |      return Attachments.find({ 'copies.attachments.key': key }).count();
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | -});
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -Template.orphanedFilesReport.helpers({
 | 
	
		
			
				|  |  | -  attachmentFiles() {
 | 
	
		
			
				|  |  | -    // eslint-disable-next-line no-console
 | 
	
		
			
				|  |  | -    // console.log('attachments:', AttachmentStorage.find());
 | 
	
		
			
				|  |  | -    // console.log('attachments.count:', AttachmentStorage.find().count());
 | 
	
		
			
				|  |  | -    return AttachmentStorage.find();
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | +  abbreviate(text) {
 | 
	
		
			
				|  |  | +    if (text.length > 30) {
 | 
	
		
			
				|  |  | +      return `${text.substr(0, 29)}...`;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return text;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  resultsCount() {
 | 
	
		
			
				|  |  | -    return AttachmentStorage.find().count();
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | +(class extends AdminReport {
 | 
	
		
			
				|  |  | +  collection = AttachmentStorage;
 | 
	
		
			
				|  |  | +}.register('filesReport'));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  fileSize(size) {
 | 
	
		
			
				|  |  | -    return Math.round(size / 1024);
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | -});
 | 
	
		
			
				|  |  | +(class extends AdminReport {
 | 
	
		
			
				|  |  | +  collection = AttachmentStorage;
 | 
	
		
			
				|  |  | +}.register('orphanedFilesReport'));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -Template.rulesReport.helpers({
 | 
	
		
			
				|  |  | -  rows() {
 | 
	
		
			
				|  |  | +(class extends AdminReport {
 | 
	
		
			
				|  |  | +  collection = Rules;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  results() {
 | 
	
		
			
				|  |  |      const rules = [];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      Rules.find().forEach(rule => {
 | 
	
	
		
			
				|  | @@ -139,14 +143,25 @@ Template.rulesReport.helpers({
 | 
	
		
			
				|  |  |        });
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    // eslint-disable-next-line no-console
 | 
	
		
			
				|  |  |      console.log('rows:', rules);
 | 
	
		
			
				|  |  |      return rules;
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}.register('rulesReport'));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  resultsCount() {
 | 
	
		
			
				|  |  | -    return Rules.find().count();
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | -});
 | 
	
		
			
				|  |  | +(class extends AdminReport {
 | 
	
		
			
				|  |  | +  collection = Cards;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  userNames(userIds) {
 | 
	
		
			
				|  |  | +    let text = '';
 | 
	
		
			
				|  |  | +    userIds.forEach(userId => {
 | 
	
		
			
				|  |  | +      const user = Users.findOne(userId);
 | 
	
		
			
				|  |  | +      text += text ? ', ' : '';
 | 
	
		
			
				|  |  | +      text += user.username;
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    return text;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}.register('cardsReport'));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  class BrokenCardsComponent extends CardSearchPagedComponent {
 | 
	
		
			
				|  |  |    onCreated() {
 |