Skip to content

Commit 296e426

Browse files
committed
Add school year to adoption and renewal forms
[CORE-758]
1 parent 34b09a4 commit 296e426

File tree

7 files changed

+74
-9
lines changed

7 files changed

+74
-9
lines changed

src/app/components/multiselect/book-tags/sf-book-context.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ function useContextValue({selected: selectedValues = [], booksAllowed}) {
2222
const [filter, setFilter] = React.useState('');
2323
const matchingBooks = React.useMemo(
2424
() => books.filter(
25-
(b) => b.text.toLowerCase().includes(filter.toLowerCase())
25+
(b) => b.text?.toLowerCase().includes(filter.toLowerCase())
2626
),
2727
[books, filter]
2828
);
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import React from 'react';
2+
import DropdownSelect from '~/components/select/drop-down/drop-down';
3+
4+
const now = new Date();
5+
const previousAcademicYear = now.getFullYear() - (
6+
now.getMonth() < 7 ? 2 : 1
7+
);
8+
9+
export default function YearSelector({
10+
selectedYear=(previousAcademicYear + 1).toString(),
11+
onValueUpdate
12+
}: {
13+
selectedYear?: string;
14+
onValueUpdate?: (value: string) => void
15+
}) {
16+
const yearOptions = React.useMemo(() =>
17+
[0, 1, 2].map((plusYears) => previousAcademicYear + plusYears)
18+
.map((startYear) => ({
19+
label: `${startYear}-${startYear + 1}`,
20+
value: startYear.toString(),
21+
selected: selectedYear === startYear.toString()
22+
})),
23+
[selectedYear]
24+
);
25+
26+
return (
27+
<label className="year-selector">
28+
I am reporting usage of OpenStax books for the
29+
<DropdownSelect
30+
name='baseYear'
31+
options={yearOptions}
32+
required
33+
onValueUpdate={onValueUpdate}
34+
/>
35+
school year
36+
</label>
37+
);
38+
}

src/app/pages/adoption/adoption.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import React, {useState, useRef} from 'react';
2+
import {useLocation} from 'react-router-dom';
23
import useDocumentHead, {useCanonicalLink} from '~/helpers/use-document-head';
34
import FormHeader from '~/components/form-header/form-header';
45
import RoleSelector from '~/components/role-selector/role-selector';
56
import StudentForm from '~/components/student-form/student-form';
67
import MultiPageForm from '~/components/multi-page-form/multi-page-form';
78
import ContactInfo from '~/components/contact-info/contact-info';
9+
import YearSelector from '~/components/year-selector/year-selector';
810
import {useAfterSubmit} from '~/components/book-selector/after-form-submit';
911
import BookSelector, {
1012
useSelectedBooks
@@ -16,7 +18,7 @@ import TrackingParameters from '~/components/tracking-parameters/tracking-parame
1618
import {useIntl} from 'react-intl';
1719
import './adoption.scss';
1820

19-
function BookSelectorPage({selectedBooksRef}) {
21+
function BookSelectorPage({selectedBooksRef, year}) {
2022
const [selectedBooks, toggleBook] = useSelectedBooks();
2123
const bookList = React.useMemo(
2224
() => selectedBooks.map((b) => b.value.replace(/ *\[.*/, '')).join('; '),
@@ -44,7 +46,7 @@ function BookSelectorPage({selectedBooksRef}) {
4446
<input type="hidden" name="subject_interest" value={bookList} />
4547
<label>
4648
<div className="control-group">
47-
<HowUsing selectedBooks={selectedBooks} />
49+
<HowUsing selectedBooks={selectedBooks} year={year} />
4850
</div>
4951
</label>
5052
</React.Fragment>
@@ -77,6 +79,9 @@ function FacultyForm({position, onPageChange}) {
7779
},
7880
[onSubmit]
7981
);
82+
const {search} = useLocation();
83+
const selectedYear = new window.URLSearchParams(search).get('year') ?? undefined;
84+
const [copyOfYear, setCopyOfYear] = React.useState();
8085

8186
return (
8287
<React.Fragment>
@@ -92,9 +97,12 @@ function FacultyForm({position, onPageChange}) {
9297
<input type="hidden" name="role" value="Instructor" />
9398
<input type="hidden" name="lead_source" value="Adoption Form" />
9499
<input type="hidden" name="process_adoptions" value={true} />
100+
<div className="year-selector-container">
101+
<YearSelector selectedYear={selectedYear} onValueUpdate={setCopyOfYear} />
102+
</div>
95103
<ContactInfo />
96104
</React.Fragment>
97-
<BookSelectorPage selectedBooksRef={selectedBooksRef} />
105+
<BookSelectorPage selectedBooksRef={selectedBooksRef} year={copyOfYear} />
98106
</MultiPageForm>
99107
</React.Fragment>
100108
);

src/app/pages/adoption/adoption.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
@import 'pattern-library/core/pattern-library/headers';
22

33
.adoption-form-v2 {
4+
.year-selector-container {
5+
margin-bottom: $normal-margin;
6+
}
7+
48
.hint {
59
@include set-font(helper-label);
610
color: text-color(helper);

src/app/pages/adoption/how-using/how-using.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ function reducer(state, action) {
7474
return {...state, ...action};
7575
}
7676

77-
export default function HowUsing({selectedBooks}) {
77+
export default function HowUsing({selectedBooks, year}) {
7878
const [bookData, dispatch] = React.useReducer(reducer, {});
7979
const [useData, udDispatch] = React.useReducer(reducer, {});
8080
const json = React.useMemo(() => {
@@ -91,9 +91,10 @@ export default function HowUsing({selectedBooks}) {
9191
});
9292

9393
return JSON.stringify({
94+
baseYear: year,
9495
Books: rewrittenBookData
9596
});
96-
}, [bookData, useData, selectedBooks]);
97+
}, [bookData, useData, selectedBooks, year]);
9798

9899
return (
99100
<div className="how-using">

src/app/pages/renewal-form/renewal-form.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {useLocation} from 'react-router-dom';
33
import linkHelper from '~/helpers/link';
44
import useUserContext from '~/contexts/user';
55
import useAdoptions from '~/models/renewals';
6+
import YearSelector from '~/components/year-selector/year-selector';
67
import TrackingParameters from '~/components/tracking-parameters/tracking-parameters';
78
// -- We'll be trying to do this for the next release.
89
// import _adoptionsPromise from './salesforce-data';
@@ -40,7 +41,7 @@ function useFormData(adoptions) {
4041
return {counts, updateCount, defaultCount};
4142
}
4243

43-
function HiddenFields({email, uuid, counts}) {
44+
function HiddenFields({email, uuid, counts, year}) {
4445
const {search} = useLocation();
4546
const params = new window.URLSearchParams(search);
4647
const fromValue = params.get('from');
@@ -49,11 +50,12 @@ function HiddenFields({email, uuid, counts}) {
4950
const {selectedItems} = useBookTagsContext();
5051
const json = React.useMemo(
5152
() => JSON.stringify({
53+
baseYear: year,
5254
'Books': selectedItems.map(
5355
({value: name}) => ({name, students: +counts[name]})
5456
)
5557
}),
56-
[selectedItems, counts]
58+
[selectedItems, counts, year]
5759
);
5860
const subjects = React.useMemo(
5961
() => selectedItems ? selectedItems.map((i) => i.value).join(';') : '',
@@ -141,6 +143,9 @@ function TheForm() {
141143
[select, counts, updateCount, defaultCount]
142144
);
143145
const [initialized, setInitialized] = React.useState(false);
146+
const {search} = useLocation();
147+
const selectedYear = new window.URLSearchParams(search).get('year') ?? undefined;
148+
const [copyOfYear, setCopyOfYear] = React.useState(selectedYear);
144149

145150
// Initialize selections from adoptions
146151
React.useEffect(
@@ -159,12 +164,13 @@ function TheForm() {
159164

160165
return (
161166
<form action={window.SETTINGS.renewalEndpoint} method="post">
162-
<HiddenFields email={email} uuid={uuid} counts={counts} />
167+
<HiddenFields email={email} uuid={uuid} counts={counts} year={copyOfYear} />
163168
<div className="fixed-fields">
164169
<FixedField label="First name" name="first_name" value={firstName} />
165170
<FixedField label="Last name" name="last_name" value={lastName} />
166171
<FixedField label="School name" name="school" value={school} />
167172
</div>
173+
<YearSelector selectedYear={selectedYear} onValueUpdate={setCopyOfYear} />
168174
<BooksAndStudentCounts counts={counts} updateCount={updateCount} />
169175
<input type="submit" />
170176
</form>

src/app/pages/renewal-form/renewal-form.scss

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,14 @@
1313
@include set-font(h2);
1414
}
1515

16+
label {
17+
font-weight: bold;
18+
19+
.Select {
20+
font-weight: normal;
21+
}
22+
}
23+
1624
form {
1725
background-color: ui-color(white);
1826
border: thin solid ui-color(form-border);

0 commit comments

Comments
 (0)