enigma-bbs/mods/upload.js

149 lines
3.9 KiB
JavaScript
Raw Normal View History

/* jslint node: true */
'use strict';
// enigma-bbs
const MenuModule = require('../core/menu_module.js').MenuModule;
const ViewController = require('../core/view_controller.js').ViewController;
const theme = require('../core/theme.js');
const ansi = require('../core/ansi_term.js');
const Errors = require('../core/enig_error.js').Errors;
const stringFormat = require('../core/string_format.js');
const getSortedAvailableFileAreas = require('../core/file_area.js').getSortedAvailableFileAreas;
const getAreaDefaultStorageDirectory = require('../core/file_area.js').getAreaDefaultStorageDirectory;
// deps
const async = require('async');
const _ = require('lodash');
exports.moduleInfo = {
name : 'Upload',
desc : 'Module for classic file uploads',
author : 'NuSkooler',
};
const FormIds = {
options : 0,
fileDetails : 1,
};
const MciViewIds = {
options : {
area : 1, // area selection
uploadType : 2, // blind vs specify filename
fileName : 3, // for non-blind; not editable for blind
navMenu : 4, // next/cancel/etc.
},
fileDetails : {
tags : 1, // tag(s) for item
desc : 2, // defaults to 'desc' (e.g. from FILE_ID.DIZ)
accept : 3, // accept fields & continue
}
};
exports.getModule = class UploadModule extends MenuModule {
constructor(options) {
super(options);
this.availAreas = getSortedAvailableFileAreas(this.client, { writeAcs : true } );
this.menuMethods = {
navContinue : (formData, extraArgs, cb) => {
if(this.isBlindUpload()) {
// jump to fileDetails form
// :TODO: support blind
} else {
// jump to protocol selection
const areaUploadDir = this.getSelectedAreaUploadDirectory();
const modOpts = {
extraArgs : {
recvDirectory : areaUploadDir,
direction : 'recv',
}
};
return this.gotoMenu(this.menuConfig.config.fileTransferProtocolSelection || 'fileTransferProtocolSelection', modOpts, cb);
}
}
};
}
getSelectedAreaUploadDirectory() {
const areaSelectView = this.viewControllers.options.getView(MciViewIds.options.area);
const selectedArea = this.availAreas[areaSelectView.getData()];
return getAreaDefaultStorageDirectory(selectedArea);
}
isBlindUpload() { return 'blind' === this.uploadType; }
initSequence() {
const self = this;
async.series(
[
function before(callback) {
return self.beforeArt(callback);
},
function display(callback) {
return self.displayOptionsPage(false, callback);
}
],
() => {
return self.finishedLoading();
}
);
}
displayOptionsPage(cb) {
const self = this;
async.series(
[
function prepArtAndViewController(callback) {
return self.prepViewControllerWithArt(
'options',
FormIds.options,
{ clearScreen : true, trailingLF : false },
callback
);
},
function populateViews(callback) {
const areaSelectView = self.viewControllers.options.getView(MciViewIds.options.area);
areaSelectView.setItems( self.availAreas.map(areaInfo => areaInfo.name ) );
const uploadTypeView = self.viewControllers.options.getView(MciViewIds.options.uploadType);
const fileNameView = self.viewControllers.options.getView(MciViewIds.options.fileName);
const blindFileNameText = self.menuConfig.config.blindFileNameText || '(blind - filename ignored)';
uploadTypeView.on('index update', idx => {
self.uploadType = (0 === idx) ? 'blind' : 'non-blind';
if(self.isBlindUpload()) {
fileNameView.setText(blindFileNameText);
// :TODO: when blind, fileNameView should not be focus/editable
}
});
uploadTypeView.setFocusItemIndex(0); // default to blind
fileNameView.setText(blindFileNameText);
areaSelectView.redraw();
return callback(null);
}
],
err => {
if(cb) {
return cb(err);
}
}
);
}
};