enigma-bbs/core/file_base_area_select.js

110 lines
3.5 KiB
JavaScript

/* jslint node: true */
'use strict';
// enigma-bbs
const { MenuModule, MenuFlags } = require('./menu_module.js');
const { getSortedAvailableFileAreas } = require('./file_base_area.js');
const StatLog = require('./stat_log.js');
const SysProps = require('./system_property.js');
// deps
const async = require('async');
exports.moduleInfo = {
name: 'File Area Selector',
desc: 'Select from available file areas',
author: 'NuSkooler',
};
const MciViewIds = {
areaList: 1,
};
exports.getModule = class FileAreaSelectModule extends MenuModule {
constructor(options) {
super(options);
this.setMergedFlag(MenuFlags.NoHistory);
this.menuMethods = {
selectArea: (formData, extraArgs, cb) => {
const filterCriteria = {
areaTag: formData.value.areaTag,
};
const menuOpts = {
extraArgs: {
filterCriteria: filterCriteria,
},
menuFlags: [ MenuFlags.NoHistory ],
};
return this.gotoMenu(
this.menuConfig.config.fileBaseListEntriesMenu ||
'fileBaseListEntries',
menuOpts,
cb
);
},
};
}
mciReady(mciData, cb) {
super.mciReady(mciData, err => {
if (err) {
return cb(err);
}
const self = this;
async.waterfall(
[
function mergeAreaStats(callback) {
const areaStats = StatLog.getSystemStat(
SysProps.FileBaseAreaStats
) || { areas: {} };
// we could use 'sort' alone, but area/conf sorting has some special properties; user can still override
const availAreas = getSortedAvailableFileAreas(self.client);
availAreas.forEach(area => {
const stats = areaStats.areas[area.areaTag];
area.totalFiles = stats ? stats.files : 0;
area.totalBytes = stats ? stats.bytes : 0;
});
return callback(null, availAreas);
},
function prepView(availAreas, callback) {
self.prepViewController(
'allViews',
0,
mciData.menu,
(err, vc) => {
if (err) {
return callback(err);
}
const areaListView = vc.getView(MciViewIds.areaList);
areaListView.setItems(
availAreas.map(area =>
Object.assign(area, {
text: area.name,
data: area.areaTag,
})
)
);
areaListView.redraw();
return callback(null);
}
);
},
],
err => {
return cb(err);
}
);
});
}
};