Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Config mail #75

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
188 changes: 188 additions & 0 deletions webui-src/app/config/config_mail.js
@@ -0,0 +1,188 @@
const m = require('mithril');
const rs = require('rswebui');
const widget = require('widgets');
const util = require('config/config_util');

const msgTagObj = {
tagId: 100,
tagName: '',
tagColor: '',
};
let tagArr = [];

async function handleSubmit(tagId) {
const modalContainer = document.getElementById('modal-container');
msgTagObj.tagId = typeof tagId === 'number' ? tagId : util.getRandomId(tagArr);
let tagNameAlreadyExists = false;
tagArr.forEach((item) => {
if (item.value.first === msgTagObj.tagName) tagNameAlreadyExists = true;
});
if (tagNameAlreadyExists) {
alert('Tag Name Already Exists');
} else {
rs.rsJsonApiRequest('/rsMsgs/setMessageTagType', {
tagId: msgTagObj.tagId,
text: msgTagObj.tagName,
rgb_color: parseInt(msgTagObj.tagColor.substring(1), 16),
});
modalContainer.style.display = 'none';
rs.rsJsonApiRequest('/rsMsgs/getMessageTagTypes').then((res) => (tagArr = res.body.tags.types));
}
}

const MessageTagForm = () => {
return {
view: (v) => {
const isCreateForm = v.attrs.tagItem === undefined;
return m(
'form.mail-tags-form',
{
onsubmit: isCreateForm ? handleSubmit : () => handleSubmit(v.attrs.tagItem.key),
},
[
m('h3', isCreateForm ? 'Create New Tag Type' : 'Edit Tag Type'),
m('hr'),
m('.input-field', [
m('label[for=tagName]', 'Enter Tag Name'),
m('input[type=text][id=tagName][placeholder="enter tag name"]', {
value: msgTagObj.tagName,
oninput: (e) => (msgTagObj.tagName = e.target.value),
}),
]),
m('.input-field', [
m('label[for=tagColor]', 'Choose Tag Color'),
m('input[type=color][id=tagColor]', {
value: msgTagObj.tagColor,
oninput: (e) => (msgTagObj.tagColor = e.target.value),
}),
]),
// v.attrs.tagItem !== undefined && m('p', v.attrs.tagItem.value.first),
m('button[type=submit]', 'Submit'),
]
);
},
};
};

const Mail = () => {
let distantMessagingPermissionFlag = 0;
return {
oninit: () => {
rs.rsJsonApiRequest('/rsMsgs/getMessageTagTypes').then(
(res) => (tagArr = res.body.tags.types)
);
rs.rsJsonApiRequest('/rsMsgs/getDistantMessagingPermissionFlags').then(
(res) => (distantMessagingPermissionFlag = res.body.retval)
);
},
view: () =>
m('.widget.widget-half.mail', [
m('.mail-tags__heading', m('h3', 'Distant Messages')),
m('hr'),
m('.permission-flag', [
m('p', 'Accept encrypted distant messages from: '),
m(
'select[id=setDistantMessagingPermission]',
zelfroster marked this conversation as resolved.
Show resolved Hide resolved
{
value: distantMessagingPermissionFlag,
oninput: (e) => (distantMessagingPermissionFlag = e.target.value),
onchange: () => {
rs.rsJsonApiRequest('/rsMsgs/setDistantMessagingPermissionFlags', {
flags: parseInt(distantMessagingPermissionFlag),
});
},
},
[
m(
'option',
{
value: util.RS_DISTANT_MESSAGING_PERMISSION_FLAG_FILTER_NONE,
},
'Everybody'
),
m(
'option',
{
value: util.RS_DISTANT_MESSAGING_PERMISSION_FLAG_FILTER_NON_CONTACTS,
},
'Contacts'
),
m(
'option',
{
value: util.RS_DISTANT_MESSAGING_PERMISSION_FLAG_FILTER_EVERYBODY,
},
'Nobody'
),
]
),
]),
m('br'),
m('.mail-tags__heading', [
m('h3', 'Mail Tags'),
m(
'button',
{
onclick: () => {
// set form fields to default values
msgTagObj.tagName = '';
msgTagObj.tagColor = '';
widget.popupMessage(m(MessageTagForm));
},
},
'Create New Tag'
),
]),
m('hr'),
m(
'div.mail-tags',
tagArr.length === 0
? m('h4', 'No Message Tags')
: m(
'div.mail-tags__container',
tagArr.map((tag) =>
m('.tag-item', { key: tag.key }, [
m('div.tag-item__color', {
style: {
backgroundColor: `#${tag.value.second.toString(16).padStart(6, '0')}`,
},
}),
m('p.tag-item__name', tag.value.first),
m('.tag-item__modify', [
m(
'button',
{
onclick: () => {
msgTagObj.tagName = tag.value.first;
msgTagObj.tagColor = `#${tag.value.second
.toString(16)
.padStart(6, '0')}`;
widget.popupMessage(m(MessageTagForm, { tagItem: tag }));
},
},
m('i.fas.fa-pen')
),
m(
'button.red',
{
onclick: () => {
rs.rsJsonApiRequest('/rsMsgs/removeMessageTagType', {
tagId: tag.key,
}).then((res) => {
if (res.body.retval)
tagArr = tagArr.filter((item) => item.key !== tag.key);
});
},
},
m('i.fas.fa-trash')
),
]),
])
)
)
),
]),
};
};

module.exports = Mail;
2 changes: 2 additions & 0 deletions webui-src/app/config/config_resolver.js
@@ -1,4 +1,5 @@
const m = require('mithril');
const rs = require('rswebui');

const widget = require('widgets');

Expand All @@ -8,6 +9,7 @@ const sections = {
services: require('config/config_services'),
files: require('config/config_files'),
people: require('config/config_people'),
mail: require('config/config_mail'),
};

const Layout = {
Expand Down
36 changes: 28 additions & 8 deletions webui-src/app/config/config_util.js
@@ -1,25 +1,45 @@
const m = require('mithril');
const rs = require('rswebui');

/* Visibility parameter for discovery */
const RS_VS_DISC_OFF = 0x0000;
const RS_VS_DISC_MINIMAL = 0x0001;
const RS_VS_DISC_FULL = 0x0002;
const RS_VS_DISC_OFF = 0x0000;
const RS_VS_DISC_MINIMAL = 0x0001;
const RS_VS_DISC_FULL = 0x0002;

const RS_VS_DHT_OFF = 0x0000;
const RS_VS_DHT_PASSIVE = 0x0001;
const RS_VS_DHT_FULL = 0x0002;
const RS_VS_DHT_OFF = 0x0000;
const RS_VS_DHT_PASSIVE = 0x0001;
const RS_VS_DHT_FULL = 0x0002;

const MAX_TAG_ID_VAL = 1000000;
const MIN_TAG_ID_VAL = 100;

const RS_DISTANT_MESSAGING_PERMISSION_FLAG_FILTER_NONE = 0;
const RS_DISTANT_MESSAGING_PERMISSION_FLAG_FILTER_NON_CONTACTS = 1;
const RS_DISTANT_MESSAGING_PERMISSION_FLAG_FILTER_EVERYBODY = 2;

function getRandomId(tagArr) {
const random = Math.floor(Math.random() * (MAX_TAG_ID_VAL - MIN_TAG_ID_VAL) + MIN_TAG_ID_VAL);
tagArr.forEach((tag) => {
if (tag.key === random) {
return getRandomId();
}
});
return random;
}

function tooltip(text) {
return m('.tooltip', [m('i.fas.fa-info-circle'), m('.tooltiptext', text)]);
}

module.exports = {
getRandomId,
tooltip,
RS_VS_DHT_FULL,
RS_VS_DHT_OFF,
RS_VS_DISC_FULL,
RS_VS_DHT_PASSIVE,
RS_VS_DISC_OFF,
RS_VS_DISC_MINIMAL
RS_VS_DISC_MINIMAL,
RS_DISTANT_MESSAGING_PERMISSION_FLAG_FILTER_NONE,
RS_DISTANT_MESSAGING_PERMISSION_FLAG_FILTER_NON_CONTACTS,
RS_DISTANT_MESSAGING_PERMISSION_FLAG_FILTER_EVERYBODY,
};
71 changes: 66 additions & 5 deletions webui-src/app/scss/pages/_config.scss
@@ -1,6 +1,67 @@
@use '../abstracts/variables' as *;

.config-node-panel {
position: relative;
bottom: 250px;
margin-left: 200px;
animation: fadein 0.5s;
}
position: relative;
bottom: 250px;
margin-left: 200px;
animation: fadein 0.5s;
}

.mail {
.permission-flag {
display: flex;
gap: 1rem;
}
&-tags {
padding: 8px;
border: 1px solid transparentize($dark-color, 0.8);
border-radius: 6px;
&__heading {
display: flex;
justify-content: space-between;
align-items: center;
& button {
height: max-content;
}
}
&__container {
display: flex;
flex-direction: column;
& .tag-item {
display: flex;
align-items: center;
gap: 4px;
border-bottom: 1px solid transparentize($dark-color, 0.9);
padding: 2px 0;

&:last-child {
border: none;
}
&__color {
width: 20px;
height: 20px;
aspect-ratio: 1;
}
&__name {
font-size: 1.25rem;
}
&__modify {
margin-left: auto;
font-size: 0.75rem;
display: flex;
gap: 4px;
}
&:hover {
background-color: $light-color;
}
}
}
}
}

.mail-tags-form .input-field {
margin-bottom: 0.5rem;
label {
margin-right: 0.5rem;
}
}
2 changes: 1 addition & 1 deletion webui-src/styles/app.css

Large diffs are not rendered by default.