Adds option for user to Request deletion / edit directly from website

This commit is contained in:
Alicia Sykes 2024-03-05 23:14:27 +00:00
parent 1bfc705890
commit a0ec19002c
3 changed files with 216 additions and 0 deletions

View file

@ -0,0 +1,120 @@
<script lang="ts">
import { onMount } from "svelte";
import { fetchSrcData, makeRemovalRequest, makeEditRequest } from '@utils/data-src-delete-n-edit';
import FontAwesome from '@components/form/FontAwesome.svelte';
export let categoryName: string;
export let sectionName: string;
export let serviceName: string;
let lineNumbers: { start: number, end: number } | null = null;
let yamlContent = '';
const getGitHubSrcFile = () => {
if (lineNumbers) {
const baseFile = 'https://github.com/lissy93/awesome-privacy/blob/main/awesome-privacy.yml';
return `${baseFile}#L${lineNumbers.start}-L${lineNumbers.end}`;
}
return '';
};
const getIframeSrc = () => {
const host = 'https://github-embed.as93.net';
const target = encodeURIComponent(getGitHubSrcFile());
const opts = 'style=color-brewer&type=code&showBorder=on&showLineNumbers=on&showFileMeta=on&showFullPath=on&showCopy=on';
return `${host}/iframe.html?target=${target}&${opts}`;
};
onMount(async () => {
const results = await fetchSrcData(categoryName, sectionName, serviceName);
lineNumbers = results.lineNumbers
yamlContent = results.yamlContent;
});
</script>
{#if lineNumbers}
<h4>Edit {serviceName} Data</h4>
<p>
You can view or edit this {serviceName}'s entry in
<a href={getGitHubSrcFile()}>
this section
</a>
of <code>awesome-privacy.yml</code> in our GitHub repo.
</p>
<h4>Origin Data</h4>
<iframe
frameborder="0"
scrolling="no"
class="yaml-embed"
allow="clipboard-write"
title="awesome-privacy.yml"
src={getIframeSrc()}></iframe>
<h4>Edit/Delete Request</h4>
<div class="button-wrap">
<a class="button-link" target="_blank"
href={makeRemovalRequest(categoryName, sectionName, serviceName, yamlContent)}>
<FontAwesome iconName="delete" /> Delete {serviceName}
</a>
<a class="button-link" target="_blank"
href={makeEditRequest(categoryName, sectionName, serviceName, yamlContent)}>
<FontAwesome iconName="edit" /> Submit Edit to {serviceName}
</a>
</div>
{/if}
<style lang="scss">
h4 {
font-size: 1.4rem;
margin-bottom: 0;
}
p {
margin: 0.25rem 0 0.5rem 0;
}
.button-wrap {
display: flex;
gap: 1rem;
justify-content: center;
margin: 1rem auto;
@media(max-width: 768px) {
flex-direction: column;
}
}
.button-link {
background: var(--accent-3);
border: 1px solid var(--foreground);
box-shadow: 3px 3px 0 var(--foreground);
color: var(--accent-fg);
text-decoration: none;
border-radius: 18px;
padding: 0.5rem 1rem;
font-weight: bold;
min-width: 15rem;
display: inline-block;
text-align: center;
font-family: "Lekton",sans-serif;
font-size: 1.2rem;
:global(svg) {
width: 1rem;
height: 1rem;
}
}
.yaml-embed {
width: 100%;
height: 370px;
border: 1px solid var(--accent-3);
border-radius: var(--curve-lg);
padding: 0;
margin: 1rem auto;
box-shadow: 3px 3px 0 var(--accent-3);
}
</style>

View file

@ -0,0 +1,52 @@
<script lang="ts">
import FontAwesome from '@components/form/FontAwesome.svelte';
import { fetchSrcData, makeRemovalRequest, makeEditRequest } from '@utils/data-src-delete-n-edit';
import { onMount } from 'svelte';
export let categoryName: string;
export let sectionName: string;
export let serviceName: string;
let yamlContent = '';
onMount(async () => {
const results = await fetchSrcData(categoryName, sectionName, serviceName);
yamlContent = results.yamlContent;
});
</script>
<div class="actions">
<a title="Edit" target="_blank"
href={makeEditRequest(categoryName, sectionName, serviceName, yamlContent)}>
<FontAwesome iconName="edit" />
</a>
<a title="Delete" target="_blank"
href={makeRemovalRequest(categoryName, sectionName, serviceName, yamlContent)}>
<FontAwesome iconName="delete" />
</a>
</div>
<style lang="scss">
.actions {
position: absolute;
right: 1rem;
top: 1rem;
width: 2.8rem;
gap: 1rem;
opacity: 0;
display: flex;
transition: all 0.2s ease-in-out;
a {
color: var(--foreground);
width: 1rem;
transition: all 0.2s ease-in-out;
&:hover {
color: var(--accent-3);
}
}
}
</style>

View file

@ -0,0 +1,44 @@
import { slugify } from '@utils/fetch-data';
export const makeRemovalRequest = (categoryName: string, sectionName: string, serviceName: string, yaml?: string) => {
const title = `[REMOVAL] ${serviceName}`;
const under = `**${serviceName}** (source: [${categoryName}${sectionName}${serviceName}`
+ `](https://github.com/Lissy93/awesome-privacy/tree/main#${slugify(sectionName)}))`;
const removalData = `&title=${encodeURIComponent(title)}&removal-data=`
+ `${encodeURIComponent(yaml || '')}&service-title=${encodeURIComponent(under)}`;
const issueCreate = 'https://github.com/Lissy93/awesome-privacy/issues/new'
const baseOptions = '?assignees=lissy93&labels=Suggested+Removal%2CAwaiting+'
+ 'Review&projects=&template=removal.yml'
return `${issueCreate}${baseOptions}${removalData}`;
};
export const makeEditRequest = (categoryName: string, sectionName: string, serviceName: string, yaml?: string) => {
const title = `[AMENDMENT] ${serviceName}`;
const under = `**${serviceName}** (source: [${categoryName}${sectionName}${serviceName}`
+ `](https://github.com/Lissy93/awesome-privacy/tree/main#${slugify(sectionName)}))`;
const removalData = `&title=${encodeURIComponent(title)}&amendment-data=`
+ `${encodeURIComponent(yaml || '')}&service-title=${encodeURIComponent(under)}`;
const issueCreate = 'https://github.com/Lissy93/awesome-privacy/issues/new'
const baseOptions = '?assignees=lissy93&labels=Suggested+Removal%2CAwaiting+'
+ 'Review&projects=&template=amendment.yml'
return `${issueCreate}${baseOptions}${removalData}`;
};
export const fetchSrcData = async (categoryName: string, sectionName: string, serviceName: string) => {
const lineNumberData = await fetch('/api/line-numbers.json')
.then((res) => res.json());
if ( lineNumberData
&& lineNumberData[categoryName]
&& lineNumberData[categoryName][sectionName]
&& lineNumberData[categoryName][sectionName][serviceName]
) {
return {
lineNumbers: lineNumberData[categoryName][sectionName][serviceName].lineNumbers,
yamlContent: lineNumberData[categoryName][sectionName][serviceName].yaml,
};
} else {
console.error('No line number data found for', categoryName, sectionName, serviceName);
return { lineNumbers: [], yamlContent: '' };
}
};