mirror of
https://github.com/RetroShare/RSNewWebUI.git
synced 2026-09-14 11:05:47 +05:00
272 lines
8.9 KiB
JavaScript
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;
|