mirror of
https://github.com/CorentinTh/it-tools.git
synced 2025-04-20 14:56:17 -04:00
feat(new-tool): chmod calculator
This commit is contained in:
parent
94698cea50
commit
35b5187119
7 changed files with 204 additions and 1 deletions
|
@ -53,9 +53,11 @@ import {
|
||||||
NTooltip,
|
NTooltip,
|
||||||
NUpload,
|
NUpload,
|
||||||
NUploadDragger,
|
NUploadDragger,
|
||||||
|
NCheckbox,
|
||||||
} from 'naive-ui';
|
} from 'naive-ui';
|
||||||
|
|
||||||
const components = [
|
const components = [
|
||||||
|
NCheckbox,
|
||||||
NDynamicInput,
|
NDynamicInput,
|
||||||
NDatePicker,
|
NDatePicker,
|
||||||
NCode,
|
NCode,
|
||||||
|
|
68
src/tools/chmod-calculator/chmod-calculator.service.test.ts
Normal file
68
src/tools/chmod-calculator/chmod-calculator.service.test.ts
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
import { expect, describe, it } from 'vitest';
|
||||||
|
import { computeChmodOctalRepresentation } from './chmod-calculator.service';
|
||||||
|
|
||||||
|
describe('chmod-calculator', () => {
|
||||||
|
describe('computeChmodOctalRepresentation', () => {
|
||||||
|
it('get the octal representation from permissions', () => {
|
||||||
|
expect(
|
||||||
|
computeChmodOctalRepresentation({
|
||||||
|
permissions: {
|
||||||
|
owner: { read: true, write: true, execute: true },
|
||||||
|
group: { read: true, write: true, execute: true },
|
||||||
|
public: { read: true, write: true, execute: true },
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
).to.eql('777');
|
||||||
|
|
||||||
|
expect(
|
||||||
|
computeChmodOctalRepresentation({
|
||||||
|
permissions: {
|
||||||
|
owner: { read: false, write: false, execute: false },
|
||||||
|
group: { read: false, write: false, execute: false },
|
||||||
|
public: { read: false, write: false, execute: false },
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
).to.eql('000');
|
||||||
|
|
||||||
|
expect(
|
||||||
|
computeChmodOctalRepresentation({
|
||||||
|
permissions: {
|
||||||
|
owner: { read: false, write: true, execute: false },
|
||||||
|
group: { read: false, write: true, execute: true },
|
||||||
|
public: { read: true, write: false, execute: true },
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
).to.eql('235');
|
||||||
|
|
||||||
|
expect(
|
||||||
|
computeChmodOctalRepresentation({
|
||||||
|
permissions: {
|
||||||
|
owner: { read: true, write: false, execute: false },
|
||||||
|
group: { read: false, write: true, execute: false },
|
||||||
|
public: { read: false, write: false, execute: true },
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
).to.eql('421');
|
||||||
|
|
||||||
|
expect(
|
||||||
|
computeChmodOctalRepresentation({
|
||||||
|
permissions: {
|
||||||
|
owner: { read: false, write: false, execute: true },
|
||||||
|
group: { read: false, write: true, execute: false },
|
||||||
|
public: { read: true, write: false, execute: false },
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
).to.eql('124');
|
||||||
|
|
||||||
|
expect(
|
||||||
|
computeChmodOctalRepresentation({
|
||||||
|
permissions: {
|
||||||
|
owner: { read: false, write: true, execute: false },
|
||||||
|
group: { read: false, write: true, execute: false },
|
||||||
|
public: { read: false, write: true, execute: false },
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
).to.eql('222');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
17
src/tools/chmod-calculator/chmod-calculator.service.ts
Normal file
17
src/tools/chmod-calculator/chmod-calculator.service.ts
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
import _ from 'lodash';
|
||||||
|
import type { GroupPermissions, Permissions } from './chmod-calculator.types';
|
||||||
|
|
||||||
|
export { computeChmodOctalRepresentation };
|
||||||
|
|
||||||
|
function computeChmodOctalRepresentation({ permissions }: { permissions: Permissions }): string {
|
||||||
|
const permissionValue = { read: 4, write: 2, execute: 1 };
|
||||||
|
|
||||||
|
const getGroupPermissionValue = (permission: GroupPermissions) =>
|
||||||
|
_.reduce(permission, (acc, isPermSet, key) => acc + (isPermSet ? _.get(permissionValue, key, 0) : 0), 0);
|
||||||
|
|
||||||
|
return [
|
||||||
|
getGroupPermissionValue(permissions.owner),
|
||||||
|
getGroupPermissionValue(permissions.group),
|
||||||
|
getGroupPermissionValue(permissions.public),
|
||||||
|
].join('');
|
||||||
|
}
|
10
src/tools/chmod-calculator/chmod-calculator.types.ts
Normal file
10
src/tools/chmod-calculator/chmod-calculator.types.ts
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
export type Scope = 'read' | 'write' | 'execute';
|
||||||
|
export type Group = 'owner' | 'group' | 'public';
|
||||||
|
|
||||||
|
export type GroupPermissions = {
|
||||||
|
[k in Scope]: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type Permissions = {
|
||||||
|
[k in Group]: GroupPermissions;
|
||||||
|
};
|
83
src/tools/chmod-calculator/chmod-calculator.vue
Normal file
83
src/tools/chmod-calculator/chmod-calculator.vue
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<n-table :bordered="false" :bottom-bordered="false" single-column class="permission-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="text-center" scope="col"></th>
|
||||||
|
<th class="text-center" scope="col">Owner (u)</th>
|
||||||
|
<th class="text-center" scope="col">Group (g)</th>
|
||||||
|
<th class="text-center" scope="col">Public (o)</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr v-for="{ scope, title } of scopes" :key="scope">
|
||||||
|
<td class="line-header">{{ title }}</td>
|
||||||
|
<td v-for="group of groups" :key="group" class="text-center">
|
||||||
|
<!-- <n-switch v-model:value="permissions[group][scope]" /> -->
|
||||||
|
<n-checkbox v-model:checked="permissions[group][scope]" size="large" />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</n-table>
|
||||||
|
|
||||||
|
<div class="octal-result">
|
||||||
|
{{ octal }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<input-copyable :value="`chmod ${octal} path`" readonly style="margin-bottom: 5px" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { useThemeVars } from 'naive-ui';
|
||||||
|
import { computed, ref } from 'vue';
|
||||||
|
import { computeChmodOctalRepresentation } from './chmod-calculator.service';
|
||||||
|
import InputCopyable from '../../components/InputCopyable.vue';
|
||||||
|
|
||||||
|
import type { Group, Scope } from './chmod-calculator.types';
|
||||||
|
|
||||||
|
const themeVars = useThemeVars();
|
||||||
|
|
||||||
|
const scopes: { scope: Scope; title: string }[] = [
|
||||||
|
{ scope: 'read', title: 'Read (4)' },
|
||||||
|
{ scope: 'write', title: 'Write (2)' },
|
||||||
|
{ scope: 'execute', title: 'Execute (1)' },
|
||||||
|
];
|
||||||
|
const groups: Group[] = ['owner', 'group', 'public'];
|
||||||
|
|
||||||
|
const permissions = ref({
|
||||||
|
owner: { read: false, write: false, execute: false },
|
||||||
|
group: { read: false, write: false, execute: false },
|
||||||
|
public: { read: false, write: false, execute: false },
|
||||||
|
});
|
||||||
|
|
||||||
|
const octal = computed(() => computeChmodOctalRepresentation({ permissions: permissions.value }));
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.octal-result {
|
||||||
|
text-align: center;
|
||||||
|
font-size: 50px;
|
||||||
|
font-family: monospace;
|
||||||
|
color: v-bind('themeVars.primaryColor');
|
||||||
|
margin: 20px 0;
|
||||||
|
}
|
||||||
|
.permission-table {
|
||||||
|
td,
|
||||||
|
th {
|
||||||
|
padding: 15px;
|
||||||
|
|
||||||
|
@media screen and (max-width: 600px) {
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.line-header {
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: right;
|
||||||
|
max-width: 80px;
|
||||||
|
}
|
||||||
|
.text-center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
</style>
|
22
src/tools/chmod-calculator/index.ts
Normal file
22
src/tools/chmod-calculator/index.ts
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
import { FileInvoice } from '@vicons/tabler';
|
||||||
|
import { defineTool } from '../tool';
|
||||||
|
|
||||||
|
export const tool = defineTool({
|
||||||
|
name: 'Chmod calculator',
|
||||||
|
path: '/chmod-calculator',
|
||||||
|
description: 'Compute your chmod permissions and commands with this online chmod calculator.',
|
||||||
|
keywords: [
|
||||||
|
'chmod',
|
||||||
|
'calculator',
|
||||||
|
'file',
|
||||||
|
'permission',
|
||||||
|
'files',
|
||||||
|
'directory',
|
||||||
|
'folder',
|
||||||
|
'recursive',
|
||||||
|
'generator',
|
||||||
|
'octal',
|
||||||
|
],
|
||||||
|
component: () => import('./chmod-calculator.vue'),
|
||||||
|
icon: FileInvoice,
|
||||||
|
});
|
|
@ -1,6 +1,7 @@
|
||||||
import { LockOpen } from '@vicons/tabler';
|
import { LockOpen } from '@vicons/tabler';
|
||||||
import type { ToolCategory } from './tool';
|
import type { ToolCategory } from './tool';
|
||||||
|
|
||||||
|
import { tool as chmodCalculator } from './chmod-calculator';
|
||||||
import { tool as mimeTypes } from './mime-types';
|
import { tool as mimeTypes } from './mime-types';
|
||||||
import { tool as otpCodeGeneratorAndValidator } from './otp-code-generator-and-validator';
|
import { tool as otpCodeGeneratorAndValidator } from './otp-code-generator-and-validator';
|
||||||
import { tool as base64FileConverter } from './base64-file-converter';
|
import { tool as base64FileConverter } from './base64-file-converter';
|
||||||
|
@ -77,7 +78,7 @@ export const toolsByCategory: ToolCategory[] = [
|
||||||
{
|
{
|
||||||
name: 'Development',
|
name: 'Development',
|
||||||
icon: LockOpen,
|
icon: LockOpen,
|
||||||
components: [gitMemo, randomPortGenerator, crontabGenerator, jsonViewer, sqlPrettify],
|
components: [gitMemo, randomPortGenerator, crontabGenerator, jsonViewer, sqlPrettify, chmodCalculator],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Math',
|
name: 'Math',
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue