Skip to content

Commit 120bc9b

Browse files
committed
Changes to correct issues with search consistency around nonFree setting
1 parent bd5592d commit 120bc9b

17 files changed

Lines changed: 600 additions & 543 deletions

File tree

kahuna/public/js/components/gr-collections-panel/gr-collections-panel.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,7 @@ grCollectionsPanel.controller('GrNodeCtrl',
183183
grCollectionTreeCtrl.onSelect({$collection: ctrl.node.data.data.path});
184184
};
185185

186-
ctrl.srefNonfree = () => storage.getJs("isNonFree", true) ? true : undefined;
187-
186+
ctrl.srefNonfree = () => storage.getJs("isNonFree", true) === 'true' ? 'true' : 'false';
188187

189188
};
190189
ctrl.searchWithModifiers = searchWithModifiers;

kahuna/public/js/components/gr-image-metadata/gr-image-metadata.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,7 @@ module.controller('grImageMetadataCtrl', [
413413
return storage.getJs(generateStoreName(key)).hidden;
414414
};
415415

416-
ctrl.srefNonfree = () => storage.getJs("isNonFree", true) ? true : undefined;
416+
ctrl.srefNonfree = () => storage.getJs("isNonFree", true) === 'true' ? 'true' : 'false';
417417

418418
function isUsefulMetadata(metadataKey) {
419419
return ignoredMetadata.indexOf(metadataKey) === -1;

kahuna/public/js/components/gr-my-uploads/gr-my-uploads.tsx

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,6 @@ export interface MyUploadsWrapperProps {
1717
props: MyUploadsProps;
1818
}
1919

20-
//-- logo click event --
21-
interface LogoClickEventDetail { showPaid: boolean }
22-
interface LogoClickEvent extends CustomEvent<LogoClickEventDetail> {optional?: string}
23-
2420
//-- filter change event --
2521
interface Filter { uploadedByMe: boolean }
2622
interface FilterChangeEventDetail { filter: Filter }
@@ -38,6 +34,10 @@ const MyUploads: React.FC<MyUploadsWrapperProps> = ({ props }) => {
3834

3935
const [myUploads, setMyUploads] = useState(props.myUploads);
4036

37+
useEffect(() => {
38+
setMyUploads(prev => prev === props.myUploads ? prev : props.myUploads);
39+
}, [props.myUploads]);
40+
4141
const handleCheckboxClick = () => {
4242
setMyUploads(prevChkd => {
4343
props.onChange(!prevChkd);
@@ -61,17 +61,18 @@ const MyUploads: React.FC<MyUploadsWrapperProps> = ({ props }) => {
6161
}
6262
};
6363

64-
const handleLogoClick = (event: LogoClickEvent) => {
65-
setMyUploads(false);
64+
const handleLogoClick = () => {
65+
setMyUploads(prev => prev ? false : prev);
6666
};
6767

6868
const handleFilterChange = (event: FilterChangeEvent) => {
69-
setMyUploads(event.detail.filter.uploadedByMe);
69+
const next = event.detail.filter.uploadedByMe;
70+
setMyUploads(prev => prev === next ? prev : next);
7071
};
7172

7273
const handleUploadedBy = (event: UploadedByEvent) => {
7374
const matches: boolean = (event.detail.userEmail === event.detail.uploadedBy);
74-
setMyUploads(matches);
75+
setMyUploads(prev => prev === matches ? prev : matches);
7576
};
7677

7778
useEffect(() => {

kahuna/public/js/components/gr-photoshoot/gr-photoshoot.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ photoshoot.controller('GrPhotoshootCtrl', [
7777
return photoshootService.batchRemove({ images: ctrl.images });
7878
};
7979

80-
ctrl.srefNonfree = () => storage.getJs("isNonFree", true) ? true : undefined;
80+
ctrl.srefNonfree = () => storage.getJs("isNonFree", true) === 'true' ? 'true' : 'false';
8181

8282
if (Boolean(ctrl.withBatch)) {
8383
const batchApplyEvent = 'events:batch-apply:photoshoot';

kahuna/public/js/components/gr-preset-labels/gr-preset-labels.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ presetLabels.controller('GrPresetLabelsCtrl', [
6262
ctrl.newLabel = '';
6363
}
6464

65-
ctrl.srefNonfree = () => storage.getJs("isNonFree", true) ? true : undefined;
65+
ctrl.srefNonfree = () => storage.getJs("isNonFree", true) === 'true' ? 'true' : 'false';
6666

6767
}
6868
]);

kahuna/public/js/components/gr-sort-control/base-sort-control.tsx

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import { DefaultSortOption, CollectionSortOption } from "./gr-sort-control-confi
55
import "./gr-sort-control.css";
66

77
const SELECT_OPTION = "Select an option";
8-
const DEFAULT_OPTION = DefaultSortOption.value;
98
const COLLECTION_OPTION = CollectionSortOption.value;
109
const CONTROL_TITLE = "Sort by:";
1110
const SORT_ORDER = "Sort order";
@@ -66,13 +65,13 @@ const hasClassInSelfOrParent = (node: Element | null, className: string): boolea
6665
};
6766

6867
export const BaseSortControl: React.FC<SortDropdownProps> = ({
69-
options,
70-
startSelectedOption,
71-
onSelect,
72-
startHasCollection,
73-
panelVisible,
74-
isSimple
75-
}) => {
68+
options,
69+
startSelectedOption,
70+
onSelect,
71+
startHasCollection,
72+
panelVisible,
73+
isSimple
74+
}) => {
7675

7776
const hasCollection = startHasCollection;
7877
const startSort:SortDropdownOption = startSelectedOption ? startSelectedOption : DefaultSortOption;
@@ -82,11 +81,23 @@ export const BaseSortControl: React.FC<SortDropdownProps> = ({
8281
const [currentIndex, setCurrentIndex] = useState(-1);
8382
const [isPanelVisible, setPanelVisible] = useState(panelVisible);
8483

84+
useEffect(() => {
85+
const nextSort = startSelectedOption ? startSelectedOption : DefaultSortOption;
86+
setSelection(nextSort);
87+
if (!nextSort.isCollection) {
88+
setPrevious(nextSort);
89+
}
90+
}, [startSelectedOption]);
91+
92+
useEffect(() => {
93+
setPanelVisible(panelVisible);
94+
}, [panelVisible]);
95+
8596
const handleArrowKeys = (event:KeyboardEvent<HTMLDivElement>) => {
8697
if (event.key === 'ArrowDown' ||
87-
event.key === 'ArrowUp' ||
88-
event.key === 'Enter' ||
89-
event.code === 'Space') {
98+
event.key === 'ArrowUp' ||
99+
event.key === 'Enter' ||
100+
event.code === 'Space') {
90101
event.preventDefault();
91102
event.stopPropagation();
92103
let rowCount = options.length;
@@ -126,16 +137,16 @@ export const BaseSortControl: React.FC<SortDropdownProps> = ({
126137

127138
const handlePanelShow = (event: any) => {
128139
const panel = event.detail.panel;
129-
if (panel === PANEL_IDENTIFIER) {
130-
setPanelVisible(true);
131-
}
140+
if (panel === PANEL_IDENTIFIER) {
141+
setPanelVisible(true);
142+
}
132143
};
133144

134145
const handlePanelHide = (event: any) => {
135146
const panel = event.detail.panel;
136-
if (panel === PANEL_IDENTIFIER || panel === SCROLL_IDENTIFIER) {
137-
setPanelVisible(false);
138-
}
147+
if (panel === PANEL_IDENTIFIER || panel === SCROLL_IDENTIFIER) {
148+
setPanelVisible(false);
149+
}
139150
};
140151

141152
window.addEventListener("mouseup", autoHideListener);

kahuna/public/js/components/gr-sort-control/gr-extended-sort-control.tsx

Lines changed: 47 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -24,25 +24,44 @@ export interface ExtendedSortWrapperProps {
2424

2525
const checkForCollection = (query:string): boolean => /~"[a-zA-Z0-9 #-_.://]+"/.test(query);
2626

27+
const deriveExtendedSortState = (
28+
query: string,
29+
orderBy: string,
30+
sortOptions: SortDropdownOption[],
31+
noTakenDateClause: string
32+
) => {
33+
let selectedSort = DefaultSortOption;
34+
if (!query.includes(noTakenDateClause)) {
35+
selectedSort = sortOptions.find(o => o.value === orderBy) || DefaultSortOption;
36+
}
37+
return {
38+
selectedSort,
39+
hasCollection: checkForCollection(query)
40+
};
41+
};
42+
2743
const ExtendedSortControl: React.FC<ExtendedSortWrapperProps> = ({ props }) => {
2844

2945
const noTakenDateClause = "-has:dateTaken";
3046
const takenDateClause = "has:dateTaken";
3147
const sortOptions = SortOptions;
32-
const orderBy = props.orderBy;
33-
const query = props.query;
34-
35-
let startSortOption = DefaultSortOption;
36-
if (!query.includes(noTakenDateClause) && (sortOptions.filter(o => o.value === orderBy)).length > 0) {
37-
startSortOption = sortOptions.find(o => o.value === orderBy);
38-
}
39-
40-
const startHasCollection = checkForCollection(query);
48+
const orderBy = props.orderBy || "";
49+
const query = props.query || "";
50+
const { selectedSort: startSortOption, hasCollection: startHasCollection } =
51+
deriveExtendedSortState(query, orderBy, sortOptions, noTakenDateClause);
4152
const [selSortOption, setSortOption] = useState<SortDropdownOption>(startSortOption);
4253
const [userTakenSelect, setUserTakenSelect] = useState<boolean>(props.userTakenSelect);
4354
const noTakenDateCount = props.noTakenDateCount;
4455
const [hasCollection, setHasCollection] = useState<boolean>(startHasCollection);
4556

57+
useEffect(() => {
58+
const { selectedSort, hasCollection: nextHasCollection } =
59+
deriveExtendedSortState(query, orderBy, sortOptions, noTakenDateClause);
60+
setSortOption(selectedSort);
61+
setHasCollection(nextHasCollection);
62+
setUserTakenSelect(Boolean(props.userTakenSelect));
63+
}, [query, orderBy, props.userTakenSelect]);
64+
4665
const onSortSelect = (selOption: SortDropdownOption) => {
4766
setSortOption(selOption);
4867
setUserTakenSelect(selOption.isTaken);
@@ -67,11 +86,11 @@ const ExtendedSortControl: React.FC<ExtendedSortWrapperProps> = ({ props }) => {
6786
};
6887

6988
const handleQueryChange = (e: any) => {
70-
const newQuery = e.detail.query ? (" " + e.detail.query) : "";
71-
setHasCollection(checkForCollection(newQuery));
72-
if (userTakenSelect && !newQuery.includes(takenDateClause)) {
73-
props.onSortSelect(DefaultSortOption, 'with', false);
74-
}
89+
const newQuery = e.detail.query ? (" " + e.detail.query) : "";
90+
setHasCollection(checkForCollection(newQuery));
91+
if (userTakenSelect && !newQuery.includes(takenDateClause)) {
92+
props.onSortSelect(DefaultSortOption, 'with', false);
93+
}
7594
};
7695

7796
window.addEventListener("logoClick", handleLogoClick);
@@ -87,24 +106,23 @@ const ExtendedSortControl: React.FC<ExtendedSortWrapperProps> = ({ props }) => {
87106

88107
return (
89108
<div className="extended-sort-control">
90-
<TabControl
91-
onSelect={onTabSelect}
92-
query={query}
93-
showTakenTab={userTakenSelect}
94-
noTakenDateCount={noTakenDateCount}
95-
panelVisible={props.collectionsPanelVisible}
96-
/>
97-
<BaseSortControl
98-
options={sortOptions}
99-
startSelectedOption={selSortOption}
100-
onSelect={onSortSelect}
101-
startHasCollection={hasCollection}
102-
panelVisible={props.infoPanelVisible}
103-
/>
109+
<TabControl
110+
onSelect={onTabSelect}
111+
query={query}
112+
showTakenTab={userTakenSelect}
113+
noTakenDateCount={noTakenDateCount}
114+
panelVisible={props.collectionsPanelVisible}
115+
/>
116+
<BaseSortControl
117+
options={sortOptions}
118+
startSelectedOption={selSortOption}
119+
onSelect={onSortSelect}
120+
startHasCollection={hasCollection}
121+
panelVisible={props.infoPanelVisible}
122+
/>
104123
</div>
105124
);
106125
};
107126

108127
export const extendedSortControl = angular.module('gr.extendedSortControl', [])
109128
.component('extendedSortControl', react2angular(ExtendedSortControl, ["props"]));
110-

kahuna/public/js/components/gr-sort-control/gr-sort-control.tsx

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,41 +16,43 @@ export interface SortWrapperProps {
1616
props: SortProps;
1717
}
1818

19-
const checkForCollection = (query: string): boolean => /~"[a-zA-Z0-9 #\-_.:/]+"/.test(query);
19+
const checkForCollection = (query:string): boolean => /~"[a-zA-Z0-9 #-_.://]+"/.test(query);
20+
21+
const deriveSortState = (query: string, orderBy: string, sortOptions: SortDropdownOption[]) => {
22+
const hasCollection = checkForCollection(query);
23+
if (hasCollection) {
24+
const collectionSort = sortOptions.find(o => o.isCollection) || DefaultSortOption;
25+
return { hasCollection, selectedSort: collectionSort };
26+
}
27+
28+
const selectedSort = sortOptions.find(o => o.value === orderBy) || DefaultSortOption;
29+
return { hasCollection, selectedSort };
30+
};
2031

2132
const SortControl: React.FC<SortWrapperProps> = ({ props }) => {
2233

2334
const sortOptions = SortOptions;
24-
const orderBy = props.orderBy;
25-
const query = props.query;
26-
const startHasCollection = checkForCollection(query);
27-
28-
let startSortOption = DefaultSortOption;
29-
if (startHasCollection) {
30-
if ((sortOptions.filter(o => o.isCollection)).length > 0) {
31-
startSortOption = sortOptions.find(o => o.isCollection);
32-
}
33-
} else {
34-
if ((sortOptions.filter(o => o.value === orderBy)).length > 0) {
35-
startSortOption = sortOptions.find(o => o.value === orderBy);
36-
}
37-
}
35+
const orderBy = props.orderBy || "";
36+
const query = props.query || "";
37+
const { hasCollection: startHasCollection, selectedSort: startSortOption } =
38+
deriveSortState(query, orderBy, sortOptions);
3839

3940
const [selSortOption, setSortOption] = useState<SortDropdownOption>(startSortOption);
4041
const [hasCollection, setHasCollection] = useState<boolean>(startHasCollection);
4142

43+
useEffect(() => {
44+
const { hasCollection: nextHasCollection, selectedSort } = deriveSortState(query, orderBy, sortOptions);
45+
setHasCollection(nextHasCollection);
46+
setSortOption(selectedSort);
47+
}, [query, orderBy]);
48+
4249
const onSortSelect = (selOption: SortDropdownOption) => {
4350
setSortOption(selOption);
4451
props.onSortSelect(selOption);
4552
};
4653

4754
// initialisation
4855
useEffect(() => {
49-
const handleLogoClick = (e: any) => {
50-
setSortOption(DefaultSortOption);
51-
props.onSortSelect(DefaultSortOption);
52-
};
53-
5456
const handleQueryChange = (e: any) => {
5557
const newQuery = e.detail.query ? (" " + e.detail.query) : "";
5658
const curHasCollec = e.detail.hasCollection ? e.detail.hasCollection : false;
@@ -70,12 +72,10 @@ const SortControl: React.FC<SortWrapperProps> = ({ props }) => {
7072
}
7173
};
7274

73-
window.addEventListener("logoClick", handleLogoClick);
7475
window.addEventListener("queryChangeEvent", handleQueryChange);
7576

7677
// Clean up the event listener when the component unmounts
7778
return () => {
78-
window.removeEventListener("logoClick", handleLogoClick);
7979
window.removeEventListener("queryChangeEvent", handleQueryChange);
8080
};
8181

kahuna/public/js/edits/image-editor.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,7 @@ imageEditor.controller('ImageEditorCtrl', [
440440
);
441441
}
442442

443-
ctrl.srefNonfree = () => storage.getJs("isNonFree", true) ? true : undefined;
443+
ctrl.srefNonfree = () => storage.getJs("isNonFree", true) === 'true' ? 'true' : 'false';
444444
};
445445
}]);
446446

kahuna/public/js/edits/list-editor.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ listEditor.controller('ListEditorCtrl', [
114114
}
115115
};
116116

117-
ctrl.srefNonfree = () => storage.getJs("isNonFree", true) ? true : undefined;
117+
ctrl.srefNonfree = () => storage.getJs("isNonFree", true) === 'true' ? 'true' : 'false';
118118

119119
const batchAddEvent = 'events:batch-apply:add-all';
120120
const batchRemoveEvent = 'events:batch-apply:remove-all';

0 commit comments

Comments
 (0)