Skip to content

Commit

Permalink
feat(software): seperate tables
Browse files Browse the repository at this point in the history
Closes #48
  • Loading branch information
ravenclaw900 committed Nov 27, 2021
1 parent 0773943 commit 7cb9b72
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 65 deletions.
4 changes: 2 additions & 2 deletions src/backend/src/shared.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,6 @@ pub struct ProcessList {
#[derive(SerJson)]
pub struct DPSoftwareData {
pub id: i16,
pub installed: bool,
pub name: String,
pub description: String,
pub dependencies: String,
Expand All @@ -88,7 +87,8 @@ pub struct DPSoftwareData {

#[derive(SerJson)]
pub struct DPSoftwareList {
pub software: Vec<DPSoftwareData>,
pub installed: Vec<DPSoftwareData>,
pub uninstalled: Vec<DPSoftwareData>,
pub response: String,
}

Expand Down
8 changes: 6 additions & 2 deletions src/backend/src/sockets.rs
Original file line number Diff line number Diff line change
Expand Up @@ -88,10 +88,12 @@ async fn software_handler(
data_recv: &mut Receiver<Option<shared::Request>>,
) {
let mut socket_send = socket_ptr.lock().await;
let software = systemdata::dpsoftware();
let _send = (*socket_send)
.send(Message::text(SerJson::serialize_json(
&shared::DPSoftwareList {
software: systemdata::dpsoftware(),
uninstalled: software.0,
installed: software.1,
response: String::new(),
},
)))
Expand All @@ -116,10 +118,12 @@ async fn software_handler(
std::string::String::from_utf8(cmd.args(arg_list).output().unwrap().stdout)
.unwrap()
.replace("", "");
let software = systemdata::dpsoftware();
let _send = socket_send
.send(Message::text(SerJson::serialize_json(
&shared::DPSoftwareList {
software: systemdata::dpsoftware(),
uninstalled: software.0,
installed: software.1,
response: out,
},
)))
Expand Down
52 changes: 23 additions & 29 deletions src/backend/src/systemdata.rs
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ pub async fn processes() -> Vec<shared::ProcessData> {
}

#[allow(clippy::too_many_lines)]
pub fn dpsoftware() -> Vec<shared::DPSoftwareData> {
pub fn dpsoftware() -> (Vec<shared::DPSoftwareData>, Vec<shared::DPSoftwareData>) {
let free_out = Command::new("/boot/dietpi/dietpi-software")
.arg("free")
.output()
Expand All @@ -226,22 +226,15 @@ pub fn dpsoftware() -> Vec<shared::DPSoftwareData> {
.unwrap()
.stdout;
let out_list = from_utf8(&out).unwrap().lines().collect::<Vec<&str>>();
let mut software_list = Vec::new();
let mut installed_list = Vec::new();
let mut uninstalled_list = Vec::new();
let mut index = 0_i16;
software_list.reserve(match out_list.len().checked_sub(9) {
uninstalled_list.reserve(match out_list.len().checked_sub(9) {
Some(num) => num,
None => return software_list,
None => return (uninstalled_list, installed_list),
});
'software: for element in out_list.iter().skip(4).take(out_list.len() - 4) {
if free_list.contains(&(index as i16)) {
software_list.push(shared::DPSoftwareData {
id: -1,
installed: false,
name: String::new(),
description: String::new(),
dependencies: String::new(),
docs: String::new(),
});
index += 1;
}
let mut id = 0;
Expand Down Expand Up @@ -273,14 +266,6 @@ pub fn dpsoftware() -> Vec<shared::DPSoftwareData> {
}
3 => {
if el1.contains("DISABLED") {
software_list.push(shared::DPSoftwareData {
id: -1,
installed: false,
name: String::new(),
description: String::new(),
dependencies: String::new(),
docs: String::new(),
});
index += 1;
continue 'software;
}
Expand All @@ -296,17 +281,26 @@ pub fn dpsoftware() -> Vec<shared::DPSoftwareData> {
_ => {}
}
}
software_list.push(shared::DPSoftwareData {
id,
dependencies: depends,
docs,
name,
description: desc,
installed,
});
if installed {
installed_list.push(shared::DPSoftwareData {
id,
dependencies: depends,
docs,
name,
description: desc,
});
} else {
uninstalled_list.push(shared::DPSoftwareData {
id,
dependencies: depends,
docs,
name,
description: desc,
});
}
index += 1;
}
software_list
(uninstalled_list, installed_list)
}

#[allow(clippy::cast_sign_loss, clippy::cast_possible_truncation)]
Expand Down
4 changes: 2 additions & 2 deletions src/frontend/src/App.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@
interface socketData {
// Software page
software?: software[];
uninstalled?: software[];
installed?: software[];
response?: string;
// Process page
processes?: processes[];
Expand All @@ -46,7 +47,6 @@
interface software {
id: number;
installed: boolean;
name: string;
description: string;
dependencies: string;
Expand Down
77 changes: 47 additions & 30 deletions src/frontend/src/pages/Software.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -6,53 +6,50 @@
export let socketSend = (cmd, args) => {};
interface softwareData {
software?: software[];
uninstalled?: software[];
installed?: software[];
response?: string;
}
interface software {
id: number;
installed: boolean;
name: string;
description: string;
dependencies: string;
docs: string;
}
let installTemp = [];
let installTemp: boolean[] = [];
let installArray = [];
let nameList = "";
let uninstall;
let installTable = false;
let needInstallTemp = true;
let running = false;
const installTempCreate = () => {
if (needInstallTemp) {
for (let i = 0; i < socketData.software.length; i++) {
installTemp[socketData.software[i].id] =
socketData.software[i].installed;
installTemp = [];
for (
let i = 0;
i <
socketData[installTable ? "installed" : "uninstalled"].length;
i++
) {
installTemp[
socketData[installTable ? "installed" : "uninstalled"][i].id
] = false;
}
}
needInstallTemp = false;
running = false;
};
function checkButton() {
uninstall = undefined;
installArray = [];
for (const i of socketData.software) {
if (i.installed != installTemp[i.id]) {
if (
uninstall !== undefined &&
uninstall !== !installTemp[i.id]
) {
alert(
"ERROR: cannot install and uninstall at the same time"
);
installTemp[i.id] = !installTemp[i.id];
return;
}
uninstall = !installTemp[i.id];
for (const i of socketData[
installTable ? "installed" : "uninstalled"
]) {
if (installTemp[i.id] == true) {
installArray = [...installArray, i.id];
}
}
Expand All @@ -66,7 +63,9 @@
} else {
nameList += ", ";
}
nameList += socketData.software[installArray[i]].name;
nameList += socketData[
installTable ? "installed" : "uninstalled"
].find((o) => o.id == installArray[i]).name;
if (i == installArray.length - 1) {
nameList += ")";
}
Expand All @@ -75,33 +74,51 @@
function sendSoftware() {
socketSend(
uninstall == true ? "uninstall" : "install",
installTable ? "uninstall" : "install",
installArray.map((val) => {
return val.toString();
})
);
running = true;
}
$: socketData.software && installTempCreate();
// Runs once data is recieved or table is changed
$: socketData.uninstalled && installTempCreate();
$: (installTable == true || installTable == false) &&
((needInstallTemp = true), installTempCreate());
$: socketData.software && installTemp && (checkButton(), getNameList());
// Runs every time installTemp array is changed
$: socketData.uninstalled && installTemp && (checkButton(), getNameList());
</script>

<main>
{#if socketData.software}
{#if socketData.uninstalled}
<div class="border-b-2 border-gray-500">
<button
class="border-1 border-b-0 border-gray-500 p-1 focus:outline-none{installTable
? ''
: ' bg-gray-200 dark:bg-gray-700'}"
on:click={() => (installTable = false)}>Not installed</button
>
<button
class="border-1 border-b-0 border-gray-500 p-1 focus:outline-none{installTable
? ' bg-gray-200 dark:bg-gray-700'
: ''}"
on:click={() => (installTable = true)}>Installed</button
>
</div>
<table
class="border border-gray-300 dark:border-gray-700 w-full table-fixed break-words"
>
<tr class="table-header">
<th>ID</th>
<th>Installed</th>
<th>{installTable ? "Uninstall" : "Install"}</th>
<th>Name</th>
<th>Description</th>
<th>Dependencies</th>
<th>Documentation link</th>
</tr>
{#each socketData.software as software}
{#each socketData[installTable ? "installed" : "uninstalled"] as software}
{#if software.id != -1}
<tr
class="mt-32 even:bg-white odd:bg-gray-200 dark:even:bg-black dark:odd:bg-gray-800 dark:border-gray-600 border-t-2 border-gray-300 border-opacity-50"
Expand Down Expand Up @@ -141,15 +158,15 @@
<div class="flex justify-center my-2">
<button
on:click={sendSoftware}
class="rounded border {uninstall == true
class="rounded border {installTable
? 'bg-red-500 border-red-600 hover:bg-red-700'
: 'bg-green-500 border-green-600 hover:bg-green-700'} p-2 disabled:opacity-50"
disabled={installArray.length == 0 || running}
>
{#if running}
<Fa icon={faCircleNotch} class="animate-spin" />
{/if}
{uninstall == true ? "Uni" : "I"}nstall{nameList}
{installTable ? "Uni" : "I"}nstall{nameList}
</button>
</div>
{#if socketData.response != ""}
Expand Down

0 comments on commit 7cb9b72

Please sign in to comment.