mirror of
https://github.com/Lissy93/awesome-privacy.git
synced 2026-03-11 08:55:33 +00:00
Adds option for user to Request deletion / edit directly from website
This commit is contained in:
parent
1bfc705890
commit
a0ec19002c
3 changed files with 216 additions and 0 deletions
120
web/src/components/things/DataActions.svelte
Normal file
120
web/src/components/things/DataActions.svelte
Normal 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>
|
||||
52
web/src/components/things/DeleteListing.svelte
Normal file
52
web/src/components/things/DeleteListing.svelte
Normal 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>
|
||||
44
web/src/utils/data-src-delete-n-edit.ts
Normal file
44
web/src/utils/data-src-delete-n-edit.ts
Normal 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: '' };
|
||||
}
|
||||
};
|
||||
Loading…
Reference in a new issue