RSNewWebUI/webui-src/app/files/files_manager.js

272 lines
8.9 KiB
JavaScript

const m = require('mithril');
const rs = require('rswebui');
const widget = require('widgets');
const futil = require('files/files_util');
const cutil = require('config/config_util');
const shareManagerInfo = `
This is a list of shared folders. You can add and remove folders using the buttons at the bottom.
e.g- You can click on Edit button and then modify any field. When you add a new folder, initially
all files in that folder are shared. You can separately share flags for each shared directory.
`;
const accessTooltipText = [
'Manage Control Access for Directories, The three options are for the following purpose.',
m('i.fas.fa-search'),
' Directory can be searched anonymously, ',
m('i.fas.fa-download'),
' Directory can be accessed anonymously, ',
m('i.fas.fa-eye'),
' Directory can be browsed by designated friends',
];
const addNewDirInfo = `For Security reasons, Browsers don't allow to read directories so Please
copy and paste the absolute path of the directory which you want to share.
`;
let sharedDirArr = [];
let isEditDisabled = true;
function loadSharedDirectories() {
rs.rsJsonApiRequest('/rsFiles/getSharedDirectories').then((res) => {
if (res.body.retval) sharedDirArr = res.body.dirs;
});
}
// Update Shared Directories when there is a corresponding event
rs.events[rs.RsEventsType.SHARED_DIRECTORIES] = {
handler: (event) => {
switch (event.mEventCode) {
case futil.RsSharedDirectoriesEventCode.SHARED_DIRS_LIST_CHANGED:
loadSharedDirectories();
break;
}
},
};
const AddSharedDirForm = () => {
let newDirPath = '';
function addNewSharedDirectory() {
// check if newDirPath already exists
const sharedDirArrExists = sharedDirArr.find((item) => item.filename === newDirPath);
if (sharedDirArrExists) {
alert('The path you entered already exists.');
return;
}
const newSharedDir = {
dir: {
filename: newDirPath,
virtualname: '',
shareflags: futil.DIR_FLAGS_ANONYMOUS_SEARCH | futil.DIR_FLAGS_ANONYMOUS_DOWNLOAD,
parent_groups: [],
},
};
rs.rsJsonApiRequest('/rsFiles/addSharedDirectory', { ...newSharedDir }).then((res) => {
if (res.body.retval) {
loadSharedDirectories();
}
widget.popupMessage(
m('.widget', [
m('.widget__heading', m('h3', 'Add Shared Directory')),
m(
'.widget__body',
m(
'p',
res.body.retval
? 'Successfully Added Directory to Shared List'
: 'Error in Adding Directory to Shared List'
)
),
])
);
});
}
return {
view: () =>
m('.widget', [
m('.widget__heading', m('h3', 'Add New Directory')),
m('form.widget__body.share-manager__form', { onsubmit: addNewSharedDirectory }, [
m('blockquote.info', addNewDirInfo),
m('.share-manager__form_input', [
m('label', 'Enter absolute directory path :'),
m('input[type=text]', {
value: newDirPath,
oninput: (e) => (newDirPath = e.target.value),
}),
]),
m('button[type=submit]', 'Add Directory'),
]),
]),
};
};
const ManageVisibility = () => {
function handleSubmit() {
m.redraw();
const mContainer = document.getElementById('modal-container');
mContainer.style.display = 'none';
}
return {
view: (v) => {
const { parentGroups } = v.attrs;
return m('.widget', [
m('.widget__heading', m('h3', 'Manage Visibility')),
m('form.widget__body', { onsubmit: handleSubmit }, [
Object.keys(futil.RsNodeGroupId).map((groupId) =>
m('div.manage-visibility', [
m(`label[for=${futil.RsNodeGroupId[groupId]}]`, futil.RsNodeGroupId[groupId]),
m(`input[type=checkbox][id=${futil.RsNodeGroupId[groupId]}]`, {
// if parentGroups is empty it means All friends nodes have Visibility
checked: parentGroups.includes(groupId),
onclick: () => {
if (parentGroups.includes(groupId)) {
const groupItemIndex = parentGroups.indexOf(groupId);
parentGroups.splice(groupItemIndex, 1);
} else {
parentGroups.push(groupId);
}
},
}),
])
),
m('button[type=submit]', 'OK'),
]),
]);
},
};
};
const ShareDirTable = () => {
return {
oninit: futil.loadRsNodeGroupId,
view: () => {
return m('table.share-manager__table', [
m(
'thead.share-manager__table_heading',
m('tr', [
m('td', 'Shared Directories'),
m('td', 'Visible Name'),
m('td', 'Access', cutil.tooltip(accessTooltipText)),
m('td', 'Visibility'),
])
),
m(
'tbody.share-manager__table_body',
sharedDirArr.length &&
sharedDirArr.map((sharedDirItem, index) => {
const {
filename,
virtualname,
shareflags,
parent_groups: parentGroups,
} = sharedDirItem;
const sharedFlags = futil.calcIndividualFlags(shareflags);
return m('tr', [
m(
'td',
m('input[type=text]', {
value: filename,
disabled: isEditDisabled,
oninput: (e) => {
sharedDirArr[index].filename = e.target.value;
},
})
),
m(
'td',
m('input[type=text]', {
value: virtualname,
disabled: isEditDisabled,
oninput: (e) => {
sharedDirArr[index].virtualname = e.target.value;
},
})
),
m(
'td.share-flags',
Object.keys(sharedFlags).map((flag) => {
return [
m(`input.share-flags-check[type=checkbox][id=${flag}]`, {
checked: sharedFlags[flag],
disabled: isEditDisabled,
}),
m(
`label.share-flags-label[for=${flag}]`,
{
onclick: () => {
if (isEditDisabled) return;
sharedFlags[flag] = !sharedFlags[flag];
sharedDirArr[index].shareflags = futil.calcShareFlagsValue(sharedFlags);
},
style: isEditDisabled && { color: '#7D7D7D' },
},
m(
// check the flag type then if its value is true then only render the icon
flag === 'isAnonymousSearch'
? sharedFlags[flag]
? 'i.fas.fa-search'
: 'span'
: flag === 'isAnonymousDownload'
? sharedFlags[flag]
? 'i.fas.fa-download'
: 'span'
: sharedFlags[flag]
? 'i.fas.fa-eye'
: 'span'
)
),
];
})
),
m(
'td',
{
// since this is not an input element, manually change color
style: { color: isEditDisabled ? '#6D6D6D' : 'black' },
onclick: () =>
!isEditDisabled && widget.popupMessage(m(ManageVisibility, { parentGroups })),
},
parentGroups.length === 0
? 'All Friend nodes'
: parentGroups.map((groupFlag) => futil.RsNodeGroupId[groupFlag]).join(', ')
),
]);
})
),
]);
},
};
};
const ShareManager = () => {
function setNewSharedDirectories() {
rs.rsJsonApiRequest('/rsFiles/setSharedDirectories', {
dirs: sharedDirArr,
});
}
return {
oninit: loadSharedDirectories,
view: () => {
return m('.widget', [
m('.widget__heading', m('h3', 'ShareManager')),
m('form.widget__body.share-manager', { onsubmit: setNewSharedDirectories }, [
m('blockquote.info', shareManagerInfo),
m(ShareDirTable),
m('.share-manager__actions', [
m('button', { onclick: () => widget.popupMessage(m(AddSharedDirForm)) }, 'Add New'),
m(
'button',
{ onclick: () => (isEditDisabled = !isEditDisabled) },
isEditDisabled ? 'Edit' : 'Apply and Close'
),
]),
]),
]);
},
};
};
module.exports = ShareManager;