diff --git a/.prettierrc.json b/.prettierrc.json
index 64f22de..9ddd2fd 100644
--- a/.prettierrc.json
+++ b/.prettierrc.json
@@ -1,9 +1,6 @@
{
- "endOfLine": "lf",
- "printWidth": 100,
- "semi": true,
- "singleQuote": true,
- "trailingComma": "es5",
- "tabWidth": 2,
- "useTabs": true
+ "printWidth": 100,
+ "singleQuote": true,
+ "trailingComma": "es5",
+ "tabWidth": 2
}
diff --git a/index.js b/index.js
index ab824a2..c0122d2 100644
--- a/index.js
+++ b/index.js
@@ -3,221 +3,221 @@ import { ISSUE_DATA } from './data.js';
import { useState } from 'preact/hooks';
const AttendeeList = ({ attendees, addAttendee, removeAttendee }) => {
- const members = ['@andybons', '@bradfitz', '@ianlancetaylor', '@rsc', '@spf13', '@griesemer'];
- return (
- <>
-
Attendees
-
- >
- );
+ const members = ['@andybons', '@bradfitz', '@ianlancetaylor', '@rsc', '@spf13', '@griesemer'];
+ return (
+ <>
+ Attendees
+
+ >
+ );
};
const Issue = ({ issue, selected, note, onClick, updateNote }) => (
-
-
-
-
-
+
+
+
+
+
);
const IssueList = ({
- issues,
- selectedIssues,
- addSelectedIssue,
- removeSelectedIssue,
- notes,
- updateNote,
+ issues,
+ selectedIssues,
+ addSelectedIssue,
+ removeSelectedIssue,
+ notes,
+ updateNote,
}) => {
- const [filter, setFilter] = useState('');
- const [filteredIssues, setFilteredIssues] = useState([...issues]);
+ const [filter, setFilter] = useState('');
+ const [filteredIssues, setFilteredIssues] = useState([...issues]);
- const filterIssues = filter => {
- setFilter(filter);
- const filteredIssues = issues.filter(issue => {
- if (filter.trim() === '') {
- return true;
- }
- filter = filter.toLowerCase();
- return (
- issue.title.toLowerCase().includes(filter) ||
- (issue.number + '').toLowerCase().includes(filter)
- );
- });
- setFilteredIssues(filteredIssues);
- };
+ const filterIssues = filter => {
+ setFilter(filter);
+ const filteredIssues = issues.filter(issue => {
+ if (filter.trim() === '') {
+ return true;
+ }
+ filter = filter.toLowerCase();
+ return (
+ issue.title.toLowerCase().includes(filter) ||
+ (issue.number + '').toLowerCase().includes(filter)
+ );
+ });
+ setFilteredIssues(filteredIssues);
+ };
- return (
- <>
- Issues
-
-
- {filteredIssues.map(issue => {
- return (
- {
- selected ? addSelectedIssue(issue) : removeSelectedIssue(issue);
- }}
- note={notes[issue.number]}
- updateNote={updateNote}
- >
- );
- })}
-
- >
- );
+ return (
+ <>
+ Issues
+
+
+ {filteredIssues.map(issue => {
+ return (
+ {
+ selected ? addSelectedIssue(issue) : removeSelectedIssue(issue);
+ }}
+ note={notes[issue.number]}
+ updateNote={updateNote}
+ >
+ );
+ })}
+
+ >
+ );
};
const MinutesOutput = ({ attendees, issues, selectedIssues, notes }) => {
- return (
- <>
- Minutes
-
- **
- {new Date().toISOString().substr(0, 10)} /{' '}
- {Array.from(attendees)
- .sort()
- .join(', ')}
- **
- {'\n\n'}
- {issues
- .filter(issue => {
- return selectedIssues.has(issue.number);
- })
- .map(issue => {
- return { ...issue, ['title']: issue.title.replace(/proposal: /i, '') };
- })
- .sort((i1, i2) => i1.title.localeCompare(i2.title))
- .map(issue => {
- return (
- `- #${issue.number} **${issue.title.replace('*', '\\*')}**\n` +
- (notes[issue.number] || '')
- .split('\n')
- .filter(line => line.trim() !== '')
- .map(line => ` - ${line}`)
- .join('\n') +
- '\n'
- );
- })}
-
- >
- );
+ return (
+ <>
+ Minutes
+
+ **
+ {new Date().toISOString().substr(0, 10)} /{' '}
+ {Array.from(attendees)
+ .sort()
+ .join(', ')}
+ **
+ {'\n\n'}
+ {issues
+ .filter(issue => {
+ return selectedIssues.has(issue.number);
+ })
+ .map(issue => {
+ return { ...issue, ['title']: issue.title.replace(/proposal: /i, '') };
+ })
+ .sort((i1, i2) => i1.title.localeCompare(i2.title))
+ .map(issue => {
+ return (
+ `- #${issue.number} **${issue.title.replace('*', '\\*')}**\n` +
+ (notes[issue.number] || '')
+ .split('\n')
+ .filter(line => line.trim() !== '')
+ .map(line => ` - ${line}`)
+ .join('\n') +
+ '\n'
+ );
+ })}
+
+ >
+ );
};
export default function App() {
- const [attendees, setAttendees] = useState(new Set());
+ const [attendees, setAttendees] = useState(new Set());
- const addAttendee = attendee => {
- attendees.add(attendee);
- setAttendees(new Set(attendees));
- };
+ const addAttendee = attendee => {
+ attendees.add(attendee);
+ setAttendees(new Set(attendees));
+ };
- const removeAttendee = attendee => {
- attendees.delete(attendee);
- setAttendees(new Set(attendees));
- };
+ const removeAttendee = attendee => {
+ attendees.delete(attendee);
+ setAttendees(new Set(attendees));
+ };
- const [selectedIssues, setSelectedIssues] = useState(new Set());
+ const [selectedIssues, setSelectedIssues] = useState(new Set());
- const addSelectedIssue = issue => {
- selectedIssues.add(issue.number);
- setSelectedIssues(new Set(selectedIssues));
- };
+ const addSelectedIssue = issue => {
+ selectedIssues.add(issue.number);
+ setSelectedIssues(new Set(selectedIssues));
+ };
- const removeSelectedIssue = issue => {
- selectedIssues.delete(issue.number);
- setSelectedIssues(new Set(selectedIssues));
- };
+ const removeSelectedIssue = issue => {
+ selectedIssues.delete(issue.number);
+ setSelectedIssues(new Set(selectedIssues));
+ };
- const [notes, updateNotes] = useState({}); // issue number -> notes
+ const [notes, updateNotes] = useState({}); // issue number -> notes
- return (
- <>
-
- Go Proposal Minutes Generator
-
-
-
-
-
{
- updateNotes({
- ...notes,
- [issue.number]: note,
- });
- }}
- >
-
-
-
-
-
- >
- );
+ return (
+ <>
+
+ Go Proposal Minutes Generator
+
+
+
+
+
{
+ updateNotes({
+ ...notes,
+ [issue.number]: note,
+ });
+ }}
+ >
+
+
+
+
+
+ >
+ );
}
diff --git a/style.css b/style.css
index 4e0dd2d..a8969c6 100644
--- a/style.css
+++ b/style.css
@@ -1,100 +1,100 @@
* {
- box-sizing: border-box;
- margin: 0;
- padding: 0;
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
}
html,
body {
- font: 14px/1.21 system-ui, sans-serif;
+ font: 14px/1.21 system-ui, sans-serif;
}
.Header {
- border-bottom: 1px solid #f1f2f3;
- padding: 0.75rem 0;
+ border-bottom: 1px solid #f1f2f3;
+ padding: 0.75rem 0;
}
.Header-text {
- font-weight: normal;
+ font-weight: normal;
}
main {
- display: flex;
+ display: flex;
}
h1 {
- text-align: center;
+ text-align: center;
}
h1,
h2,
h3,
h4 {
- margin-bottom: 0.25em;
+ margin-bottom: 0.25em;
}
ul {
- list-style: none;
- padding: 0;
+ list-style: none;
+ padding: 0;
}
li {
- padding: 0.15rem 0;
+ padding: 0.15rem 0;
}
label {
- cursor: pointer;
+ cursor: pointer;
}
a {
- display: inline-block;
- width: 5.5ch;
+ display: inline-block;
+ width: 5.5ch;
}
.App-input,
.App-output {
- padding: 1rem 1.5rem;
- width: 50%;
- max-width: 50%;
+ padding: 1rem 1.5rem;
+ width: 50%;
+ max-width: 50%;
}
.AttendeeList {
- margin-bottom: 1rem;
+ margin-bottom: 1rem;
}
.Attendee {
- display: inline-block;
+ display: inline-block;
}
.Attendee + .Attendee {
- margin-left: 0.75rem;
+ margin-left: 0.75rem;
}
.Attendee-checkbox {
- margin-right: 0.25rem;
+ margin-right: 0.25rem;
}
.Filter {
- align-items: center;
- display: flex;
- margin-bottom: 0.5rem;
+ align-items: center;
+ display: flex;
+ margin-bottom: 0.5rem;
}
.Filter-label {
- margin-right: 0.35rem;
+ margin-right: 0.35rem;
}
.Filter-input {
- flex: 1;
- font: inherit;
- padding: 0.25rem 0.15rem;
+ flex: 1;
+ font: inherit;
+ padding: 0.25rem 0.15rem;
}
.Issue {
- background-color: #f1f2f3;
- border-radius: 3px;
- padding: 0.5rem 0.25rem;
+ background-color: #f1f2f3;
+ border-radius: 3px;
+ padding: 0.5rem 0.25rem;
}
.Issue + .Issue {
- margin-top: 0.5rem;
+ margin-top: 0.5rem;
}
.Issue-label {
- display: block;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
+ display: block;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
}
.Issue-checkbox {
- margin-right: 0.5rem;
+ margin-right: 0.5rem;
}
.Issue-notes {
- height: 5rem;
- margin: 0.5rem 0 0 1.5rem;
- width: calc(100% - 1.75rem);
+ height: 5rem;
+ margin: 0.5rem 0 0 1.5rem;
+ width: calc(100% - 1.75rem);
}
.Minutes {
- overflow: auto;
- white-space: pre-wrap;
- word-break: break-all;
+ overflow: auto;
+ white-space: pre-wrap;
+ word-break: break-all;
}