Skip to content

Commit 11d3f39

Browse files
Resolves #109, File Tree Lines can be Added to Exclude/Include Pattern Through Click (#153)
* Add ability to click tree lines to exlcude / include in pattern input * Support visual change for swapping between include and exclude pattern Co-authored-by: Romain Courtois <romain@coderamp.io>
1 parent a91191b commit 11d3f39

File tree

3 files changed

+78
-6
lines changed

3 files changed

+78
-6
lines changed

src/server/templates/components/git_form.jinja

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,23 @@
1+
<script>
2+
function changePattern(element) {
3+
console.log("Pattern changed", element.value);
4+
let patternType = element.value;
5+
const files = document.getElementsByName("tree-line");
6+
7+
Array.from(files).forEach((element) => {
8+
if (element.textContent.includes("Directory structure:")) {
9+
return;
10+
}
11+
12+
element.classList.toggle('line-through');
13+
element.classList.toggle('text-gray-500');
14+
element.classList.toggle('hover:text-inherit');
15+
element.classList.toggle('hover:no-underline');
16+
element.classList.toggle('hover:line-through');
17+
element.classList.toggle('hover:text-gray-500');
18+
});
19+
}
20+
</script>
121
<div class="relative">
222
<div class="w-full h-full absolute inset-0 bg-gray-900 rounded-xl translate-y-2 translate-x-2"></div>
323
<div class="rounded-xl relative z-20 pl-8 sm:pl-10 pr-8 sm:pr-16 py-8 border-[3px] border-gray-900 bg-[#fff4da]">
@@ -34,6 +54,7 @@
3454
<div class="flex relative z-20 border-[3px] border-gray-900 rounded bg-white">
3555
<div class="relative flex items-center">
3656
<select id="pattern_type"
57+
onchange="changePattern(this)"
3758
name="pattern_type"
3859
class="w-21 py-2 pl-2 pr-6 appearance-none bg-[#e6e8eb] focus:outline-none border-r-[3px] border-gray-900">
3960
<option value="exclude"

src/server/templates/components/result.jinja

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,33 @@
1+
<script>
2+
function getFileName(line) {
3+
// Skips "|", "└", "├" found in file tree
4+
const index = line.search(/[a-zA-Z0-9]/);
5+
return line.substring(index).trim();
6+
}
7+
8+
function toggleFile(element) {
9+
const patternInput = document.getElementById("pattern");
10+
const patternFiles = patternInput.value ? patternInput.value.split(",").map(item => item.trim()) : [];
11+
12+
if (element.textContent.includes("Directory structure:")) {
13+
return;
14+
}
15+
16+
element.classList.toggle('line-through');
17+
element.classList.toggle('text-gray-500');
18+
19+
const fileName = getFileName(element.textContent);
20+
const fileIndex = patternFiles.indexOf(fileName);
21+
22+
if (fileIndex !== -1) {
23+
patternFiles.splice(fileIndex, 1);
24+
} else {
25+
patternFiles.push(fileName);
26+
}
27+
28+
patternInput.value = patternFiles.join(", ");
29+
}
30+
</script>
131
{% if result %}
232
<div class="mt-10" data-results>
333
<div class="relative">
@@ -61,8 +91,16 @@
6191
</div>
6292
<div class="relative">
6393
<div class="w-full h-full rounded bg-gray-900 translate-y-1 translate-x-1 absolute inset-0"></div>
64-
<textarea class="directory-structure w-full p-4 bg-[#fff4da] border-[3px] border-gray-900 rounded font-mono text-sm resize-y focus:outline-none relative z-10 h-[215px]"
65-
readonly>{{ tree }}</textarea>
94+
<div class="directory-structure w-full p-4 bg-[#fff4da] border-[3px] border-gray-900 rounded font-mono text-sm resize-y focus:outline-none relative z-10 h-[215px] overflow-auto"
95+
id="directory-structure-container"
96+
readonly>
97+
<input type="hidden" id="directory-structure-content" value="{{ tree }}" />
98+
{% for line in tree.splitlines() %}
99+
<div name="tree-line"
100+
class="cursor-pointer hover:line-through hover:text-gray-500"
101+
onclick="toggleFile(this)">{{ line }}</div>
102+
{% endfor %}
103+
</div>
66104
</div>
67105
</div>
68106
</div>

src/static/js/utils.js

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,24 @@
11
// Copy functionality
22
function copyText(className) {
3-
const textarea = document.querySelector('.' + className);
3+
let textToCopy;
4+
5+
if (className === 'directory-structure') {
6+
// For directory structure, get the hidden input value
7+
const hiddenInput = document.getElementById('directory-structure-content');
8+
if (!hiddenInput) return;
9+
textToCopy = hiddenInput.value;
10+
} else {
11+
// For other elements, get the textarea value
12+
const textarea = document.querySelector('.' + className);
13+
if (!textarea) return;
14+
textToCopy = textarea.value;
15+
}
16+
417
const button = document.querySelector(`button[onclick="copyText('${className}')"]`);
5-
if (!textarea || !button) return;
18+
if (!button) return;
619

720
// Copy text
8-
navigator.clipboard.writeText(textarea.value)
21+
navigator.clipboard.writeText(textToCopy)
922
.then(() => {
1023
// Store original content
1124
const originalContent = button.innerHTML;
@@ -110,7 +123,7 @@ function handleSubmit(event, showLoading = false) {
110123
}
111124

112125
function copyFullDigest() {
113-
const directoryStructure = document.querySelector('.directory-structure').value;
126+
const directoryStructure = document.getElementById('directory-structure-content').value;
114127
const filesContent = document.querySelector('.result-text').value;
115128
const fullDigest = `${directoryStructure}\n\nFiles Content:\n\n${filesContent}`;
116129
const button = document.querySelector('[onclick="copyFullDigest()"]');

0 commit comments

Comments
 (0)