diff --git a/kahuna/public/js/components/gr-collections-panel/gr-collections-panel.js b/kahuna/public/js/components/gr-collections-panel/gr-collections-panel.js
index 9a50ca7595..f40d61316a 100644
--- a/kahuna/public/js/components/gr-collections-panel/gr-collections-panel.js
+++ b/kahuna/public/js/components/gr-collections-panel/gr-collections-panel.js
@@ -183,8 +183,7 @@ grCollectionsPanel.controller('GrNodeCtrl',
grCollectionTreeCtrl.onSelect({$collection: ctrl.node.data.data.path});
};
- ctrl.srefNonfree = () => storage.getJs("isNonFree", true) ? true : undefined;
-
+ ctrl.srefNonfree = () => storage.getJs("isNonFree", true) === 'true' ? 'true' : 'false';
};
ctrl.searchWithModifiers = searchWithModifiers;
diff --git a/kahuna/public/js/components/gr-image-metadata/gr-image-metadata.js b/kahuna/public/js/components/gr-image-metadata/gr-image-metadata.js
index 8edc2647be..f8488c697e 100644
--- a/kahuna/public/js/components/gr-image-metadata/gr-image-metadata.js
+++ b/kahuna/public/js/components/gr-image-metadata/gr-image-metadata.js
@@ -413,7 +413,7 @@ module.controller('grImageMetadataCtrl', [
return storage.getJs(generateStoreName(key)).hidden;
};
- ctrl.srefNonfree = () => storage.getJs("isNonFree", true) ? true : undefined;
+ ctrl.srefNonfree = () => storage.getJs("isNonFree", true) === 'true' ? 'true' : 'false';
function isUsefulMetadata(metadataKey) {
return ignoredMetadata.indexOf(metadataKey) === -1;
diff --git a/kahuna/public/js/components/gr-my-uploads/gr-my-uploads.tsx b/kahuna/public/js/components/gr-my-uploads/gr-my-uploads.tsx
index ceb54ca44b..2eb74d27bc 100644
--- a/kahuna/public/js/components/gr-my-uploads/gr-my-uploads.tsx
+++ b/kahuna/public/js/components/gr-my-uploads/gr-my-uploads.tsx
@@ -17,10 +17,6 @@ export interface MyUploadsWrapperProps {
props: MyUploadsProps;
}
-//-- logo click event --
-interface LogoClickEventDetail { showPaid: boolean }
-interface LogoClickEvent extends CustomEvent {optional?: string}
-
//-- filter change event --
interface Filter { uploadedByMe: boolean }
interface FilterChangeEventDetail { filter: Filter }
@@ -38,6 +34,10 @@ const MyUploads: React.FC = ({ props }) => {
const [myUploads, setMyUploads] = useState(props.myUploads);
+ useEffect(() => {
+ setMyUploads(prev => prev === props.myUploads ? prev : props.myUploads);
+ }, [props.myUploads]);
+
const handleCheckboxClick = () => {
setMyUploads(prevChkd => {
props.onChange(!prevChkd);
@@ -61,17 +61,18 @@ const MyUploads: React.FC = ({ props }) => {
}
};
- const handleLogoClick = (event: LogoClickEvent) => {
- setMyUploads(false);
+ const handleLogoClick = () => {
+ setMyUploads(prev => prev ? false : prev);
};
const handleFilterChange = (event: FilterChangeEvent) => {
- setMyUploads(event.detail.filter.uploadedByMe);
+ const next = event.detail.filter.uploadedByMe;
+ setMyUploads(prev => prev === next ? prev : next);
};
const handleUploadedBy = (event: UploadedByEvent) => {
const matches: boolean = (event.detail.userEmail === event.detail.uploadedBy);
- setMyUploads(matches);
+ setMyUploads(prev => prev === matches ? prev : matches);
};
useEffect(() => {
diff --git a/kahuna/public/js/components/gr-photoshoot/gr-photoshoot.js b/kahuna/public/js/components/gr-photoshoot/gr-photoshoot.js
index b5ba6c7dca..a4f5a954f9 100644
--- a/kahuna/public/js/components/gr-photoshoot/gr-photoshoot.js
+++ b/kahuna/public/js/components/gr-photoshoot/gr-photoshoot.js
@@ -77,7 +77,7 @@ photoshoot.controller('GrPhotoshootCtrl', [
return photoshootService.batchRemove({ images: ctrl.images });
};
- ctrl.srefNonfree = () => storage.getJs("isNonFree", true) ? true : undefined;
+ ctrl.srefNonfree = () => storage.getJs("isNonFree", true) === 'true' ? 'true' : 'false';
if (Boolean(ctrl.withBatch)) {
const batchApplyEvent = 'events:batch-apply:photoshoot';
diff --git a/kahuna/public/js/components/gr-preset-labels/gr-preset-labels.js b/kahuna/public/js/components/gr-preset-labels/gr-preset-labels.js
index 5294f160c6..d05a1e7731 100644
--- a/kahuna/public/js/components/gr-preset-labels/gr-preset-labels.js
+++ b/kahuna/public/js/components/gr-preset-labels/gr-preset-labels.js
@@ -62,7 +62,7 @@ presetLabels.controller('GrPresetLabelsCtrl', [
ctrl.newLabel = '';
}
- ctrl.srefNonfree = () => storage.getJs("isNonFree", true) ? true : undefined;
+ ctrl.srefNonfree = () => storage.getJs("isNonFree", true) === 'true' ? 'true' : 'false';
}
]);
diff --git a/kahuna/public/js/components/gr-sort-control/base-sort-control.tsx b/kahuna/public/js/components/gr-sort-control/base-sort-control.tsx
index 8881a02635..cd713d0875 100644
--- a/kahuna/public/js/components/gr-sort-control/base-sort-control.tsx
+++ b/kahuna/public/js/components/gr-sort-control/base-sort-control.tsx
@@ -82,6 +82,18 @@ export const BaseSortControl: React.FC = ({
const [currentIndex, setCurrentIndex] = useState(-1);
const [isPanelVisible, setPanelVisible] = useState(panelVisible);
+ useEffect(() => {
+ const nextSort = startSelectedOption ? startSelectedOption : DefaultSortOption;
+ setSelection(nextSort);
+ if (!nextSort.isCollection) {
+ setPrevious(nextSort);
+ }
+ }, [startSelectedOption]);
+
+ useEffect(() => {
+ setPanelVisible(panelVisible);
+ }, [panelVisible]);
+
const handleArrowKeys = (event:KeyboardEvent) => {
if (event.key === 'ArrowDown' ||
event.key === 'ArrowUp' ||
diff --git a/kahuna/public/js/components/gr-sort-control/gr-extended-sort-control.tsx b/kahuna/public/js/components/gr-sort-control/gr-extended-sort-control.tsx
index 95e3115d28..b324d39c3d 100644
--- a/kahuna/public/js/components/gr-sort-control/gr-extended-sort-control.tsx
+++ b/kahuna/public/js/components/gr-sort-control/gr-extended-sort-control.tsx
@@ -24,25 +24,44 @@ export interface ExtendedSortWrapperProps {
const checkForCollection = (query:string): boolean => /~"[a-zA-Z0-9 #-_.://]+"/.test(query);
+const deriveExtendedSortState = (
+ query: string,
+ orderBy: string,
+ sortOptions: SortDropdownOption[],
+ noTakenDateClause: string
+) => {
+ let selectedSort = DefaultSortOption;
+ if (!query.includes(noTakenDateClause)) {
+ selectedSort = sortOptions.find(o => o.value === orderBy) || DefaultSortOption;
+ }
+ return {
+ selectedSort,
+ hasCollection: checkForCollection(query)
+ };
+};
+
const ExtendedSortControl: React.FC = ({ props }) => {
const noTakenDateClause = "-has:dateTaken";
const takenDateClause = "has:dateTaken";
const sortOptions = SortOptions;
- const orderBy = props.orderBy;
- const query = props.query;
-
- let startSortOption = DefaultSortOption;
- if (!query.includes(noTakenDateClause) && (sortOptions.filter(o => o.value === orderBy)).length > 0) {
- startSortOption = sortOptions.find(o => o.value === orderBy);
- }
-
- const startHasCollection = checkForCollection(query);
+ const orderBy = props.orderBy || "";
+ const query = props.query || "";
+ const { selectedSort: startSortOption, hasCollection: startHasCollection } =
+ deriveExtendedSortState(query, orderBy, sortOptions, noTakenDateClause);
const [selSortOption, setSortOption] = useState(startSortOption);
const [userTakenSelect, setUserTakenSelect] = useState(props.userTakenSelect);
const noTakenDateCount = props.noTakenDateCount;
const [hasCollection, setHasCollection] = useState(startHasCollection);
+ useEffect(() => {
+ const { selectedSort, hasCollection: nextHasCollection } =
+ deriveExtendedSortState(query, orderBy, sortOptions, noTakenDateClause);
+ setSortOption(selectedSort);
+ setHasCollection(nextHasCollection);
+ setUserTakenSelect(Boolean(props.userTakenSelect));
+ }, [query, orderBy, props.userTakenSelect]);
+
const onSortSelect = (selOption: SortDropdownOption) => {
setSortOption(selOption);
setUserTakenSelect(selOption.isTaken);
diff --git a/kahuna/public/js/components/gr-sort-control/gr-sort-control.tsx b/kahuna/public/js/components/gr-sort-control/gr-sort-control.tsx
index 962565bae0..c86f09f6e4 100644
--- a/kahuna/public/js/components/gr-sort-control/gr-sort-control.tsx
+++ b/kahuna/public/js/components/gr-sort-control/gr-sort-control.tsx
@@ -18,39 +18,41 @@ export interface SortWrapperProps {
const checkForCollection = (query:string): boolean => /~"[a-zA-Z0-9 #-_.://]+"/.test(query);
+const deriveSortState = (query: string, orderBy: string, sortOptions: SortDropdownOption[]) => {
+ const hasCollection = checkForCollection(query);
+ if (hasCollection) {
+ const collectionSort = sortOptions.find(o => o.isCollection) || DefaultSortOption;
+ return { hasCollection, selectedSort: collectionSort };
+ }
+
+ const selectedSort = sortOptions.find(o => o.value === orderBy) || DefaultSortOption;
+ return { hasCollection, selectedSort };
+};
+
const SortControl: React.FC = ({ props }) => {
const sortOptions = SortOptions;
- const orderBy = props.orderBy;
- const query = props.query;
- const startHasCollection = checkForCollection(query);
-
- let startSortOption = DefaultSortOption;
- if (startHasCollection) {
- if ((sortOptions.filter(o => o.isCollection)).length > 0) {
- startSortOption = sortOptions.find(o => o.isCollection);
- }
- } else {
- if ((sortOptions.filter(o => o.value === orderBy)).length > 0) {
- startSortOption = sortOptions.find(o => o.value === orderBy);
- }
- }
+ const orderBy = props.orderBy || "";
+ const query = props.query || "";
+ const { hasCollection: startHasCollection, selectedSort: startSortOption } =
+ deriveSortState(query, orderBy, sortOptions);
const [selSortOption, setSortOption] = useState(startSortOption);
const [hasCollection, setHasCollection] = useState(startHasCollection);
+ useEffect(() => {
+ const { hasCollection: nextHasCollection, selectedSort } = deriveSortState(query, orderBy, sortOptions);
+ setHasCollection(nextHasCollection);
+ setSortOption(selectedSort);
+ }, [query, orderBy]);
+
const onSortSelect = (selOption: SortDropdownOption) => {
setSortOption(selOption);
props.onSortSelect(selOption);
};
- // initialisation
- useEffect(() => {
- const handleLogoClick = (e: any) => {
- setSortOption(DefaultSortOption);
- props.onSortSelect(DefaultSortOption);
- };
-
+ // initialisation
+ useEffect(() => {
const handleQueryChange = (e: any) => {
const newQuery = e.detail.query ? (" " + e.detail.query) : "";
const curHasCollec = e.detail.hasCollection ? e.detail.hasCollection : false;
@@ -70,12 +72,10 @@ const SortControl: React.FC = ({ props }) => {
}
};
- window.addEventListener("logoClick", handleLogoClick);
window.addEventListener("queryChangeEvent", handleQueryChange);
// Clean up the event listener when the component unmounts
return () => {
- window.removeEventListener("logoClick", handleLogoClick);
window.removeEventListener("queryChangeEvent", handleQueryChange);
};
diff --git a/kahuna/public/js/edits/image-editor.js b/kahuna/public/js/edits/image-editor.js
index 5ab6364074..a7dc8fde20 100644
--- a/kahuna/public/js/edits/image-editor.js
+++ b/kahuna/public/js/edits/image-editor.js
@@ -439,7 +439,7 @@ imageEditor.controller('ImageEditorCtrl', [
);
}
- ctrl.srefNonfree = () => storage.getJs("isNonFree", true) ? true : undefined;
+ ctrl.srefNonfree = () => storage.getJs("isNonFree", true) === 'true' ? 'true' : 'false';
};
}]);
diff --git a/kahuna/public/js/edits/list-editor.js b/kahuna/public/js/edits/list-editor.js
index c26f84e547..7203793902 100644
--- a/kahuna/public/js/edits/list-editor.js
+++ b/kahuna/public/js/edits/list-editor.js
@@ -114,7 +114,7 @@ listEditor.controller('ListEditorCtrl', [
}
};
- ctrl.srefNonfree = () => storage.getJs("isNonFree", true) ? true : undefined;
+ ctrl.srefNonfree = () => storage.getJs("isNonFree", true) === 'true' ? 'true' : 'false';
const batchAddEvent = 'events:batch-apply:add-all';
const batchRemoveEvent = 'events:batch-apply:remove-all';
diff --git a/kahuna/public/js/image/controller.js b/kahuna/public/js/image/controller.js
index b2d6119a64..8c4984ba75 100644
--- a/kahuna/public/js/image/controller.js
+++ b/kahuna/public/js/image/controller.js
@@ -28,6 +28,9 @@ import '../components/gu-date/gu-date';
import {radioList} from '../components/gr-radio-list/gr-radio-list';
import {cropUtil} from '../util/crop';
import { List } from 'immutable';
+
+const toNonFreeString = (val) => (val === true || val === 'true') ? 'true' : 'false';
+
const image = angular.module('kahuna.image.controller', [
'util.rx',
'util.storage',
@@ -228,11 +231,11 @@ image.controller('ImageCtrl', [
const showPaid = session.user.permissions.showPaid ? session.user.permissions.showPaid : undefined;
const defaultNonFreeFilter = {
isDefault: true,
- isNonFree: showPaid ? showPaid : false
+ isNonFree: toNonFreeString(showPaid)
};
storage.setJs("defaultNonFreeFilter", defaultNonFreeFilter, true);
window.dispatchEvent(new CustomEvent("logoClick", {
- detail: {showPaid: defaultNonFreeFilter.isNonFree},
+ detail: {showPaid: defaultNonFreeFilter.isNonFree === 'true'},
bubbles: true
}));
scrollPosition.resetToTop();
diff --git a/kahuna/public/js/preview/image.js b/kahuna/public/js/preview/image.js
index f0709c84a5..fe313a7140 100644
--- a/kahuna/public/js/preview/image.js
+++ b/kahuna/public/js/preview/image.js
@@ -126,7 +126,7 @@ image.controller('uiPreviewImageCtrl', [
return collection.data.cssColour && `background-color: ${collection.data.cssColour}`;
};
- ctrl.srefNonfree = () => storage.getJs("isNonFree", true) ? true : undefined;
+ ctrl.srefNonfree = () => storage.getJs("isNonFree", true) === 'true' ? 'true' : 'false';
ctrl.orderTakenBy = () => {
let orderBy = storage.getJs('orderBy', false);
return (orderBy && orderBy.includes('taken'));
diff --git a/kahuna/public/js/search/index.js b/kahuna/public/js/search/index.js
index 5672a738b8..002c37d594 100644
--- a/kahuna/public/js/search/index.js
+++ b/kahuna/public/js/search/index.js
@@ -32,6 +32,8 @@ import collectionsPanelTemplate from
import {cropUtil} from '../util/crop';
import { COLLECTION_SORT_VALUE } from '../components/gr-sort-control/gr-sort-control-config';
+const toNonFreeString = (val) => (val === true || val === 'true') ? 'true' : 'false';
+
export var search = angular.module('kahuna.search', [
'ct.ui.router.extras.dsr',
'kahuna.search.query',
@@ -111,12 +113,12 @@ search.config(['$stateProvider', '$urlMatcherFactoryProvider',
const showPaid = session.user.permissions.showPaid ? session.user.permissions.showPaid : undefined;
const defaultNonFreeFilter = {
isDefault: true,
- isNonFree: showPaid ? showPaid : false
+ isNonFree: toNonFreeString(showPaid)
};
storage.setJs("defaultNonFreeFilter", defaultNonFreeFilter, true);
$state.go('search.results', {nonFree: defaultNonFreeFilter.isNonFree});
window.dispatchEvent(new CustomEvent("logoClick", {
- detail: {showPaid: defaultNonFreeFilter.isNonFree},
+ detail: {showPaid: defaultNonFreeFilter.isNonFree === 'true'},
bubbles: true
}));
scrollPosition.resetToTop();
@@ -125,7 +127,7 @@ search.config(['$stateProvider', '$urlMatcherFactoryProvider',
if ($state.current.name === 'search') {
mediaApi.getSession().then(session => {
- storage.setJs('isNonFree', session.user.permissions.showPaid, true);
+ storage.setJs('isNonFree', toNonFreeString(session.user.permissions.showPaid), true);
});
}
diff --git a/kahuna/public/js/search/query-filter.js b/kahuna/public/js/search/query-filter.js
index 763c9c99f2..230ee565a7 100644
--- a/kahuna/public/js/search/query-filter.js
+++ b/kahuna/public/js/search/query-filter.js
@@ -42,7 +42,8 @@ queryFilters.factory('searchWithModifiers',
const shift = $event.getModifierState('Shift');
if (alt || shift) {
$event.preventDefault();
- const nonFree = storage.getJs("isNonFree", true) ? true : undefined;
+ const storedNonFree = storage.getJs("isNonFree", true);
+ const nonFree = storedNonFree === 'true' ? 'true' : 'false';
return $state.go('search.results', {
query: updateQueryWithModifiers(fieldName, fieldValue, alt, shift, $stateParams.query),
diff --git a/kahuna/public/js/search/query.js b/kahuna/public/js/search/query.js
index 72c85bf4c5..794845f326 100644
--- a/kahuna/public/js/search/query.js
+++ b/kahuna/public/js/search/query.js
@@ -28,6 +28,9 @@ import {
} from "../components/gr-sort-control/gr-sort-control-config";
import {getFeatureSwitchActive} from "../components/gr-feature-switch-panel/gr-feature-switch-panel";
+const toNonFreeString = (val) => (val === true || val === 'true') ? 'true' : 'false';
+const isNonFreeString = (val) => val === 'true';
+
export var query = angular.module('kahuna.search.query', [
// Note: temporarily disabled for performance reasons, see above
// 'ngAnimate',
@@ -77,6 +80,7 @@ query.controller('SearchQueryCtrl', [
ctrl.usePermissionsFilter = window._clientConfig.usePermissionsFilter;
ctrl.filterMyUploads = false;
+ let lastUploadedByEventKey;
ctrl.initialShowPaidEvent = ($stateParams.nonFree === undefined && ctrl.usePermissionsFilter) ? false : true;
ctrl.shouldDisplayAISearchOption = getFeatureSwitchActive("enable-ai-search");
@@ -88,7 +92,7 @@ query.controller('SearchQueryCtrl', [
//--react - angular interop events--
function raisePayableImagesEvent(showPaid) {
- const boolShowPaid = (showPaid === true || showPaid === "true") ? true : false;
+ const boolShowPaid = toNonFreeString(showPaid) === 'true';
const customEvent = new CustomEvent('setPayableImages', {
detail: {showPaid: boolShowPaid},
bubbles: true
@@ -114,8 +118,14 @@ query.controller('SearchQueryCtrl', [
function raiseUploadedByCheckEvent() {
if (ctrl.user) {
+ const uploadedBy = ctrl.filter ? ctrl.filter.uploadedBy : undefined;
+ const eventKey = `${ctrl.user.email}|${uploadedBy || ''}`;
+ if (eventKey === lastUploadedByEventKey) {
+ return;
+ }
+ lastUploadedByEventKey = eventKey;
const customEvent = new CustomEvent('uploadedByEvent', {
- detail: { userEmail: ctrl.user.email, uploadedBy: $stateParams.uploadedBy },
+ detail: { userEmail: ctrl.user.email, uploadedBy: uploadedBy },
bubbles: true
});
window.dispatchEvent(customEvent);
@@ -151,17 +161,19 @@ query.controller('SearchQueryCtrl', [
storage.setJs("isUploadedByMe", ctrl.filter.uploadedByMe, true);
}
- function manageDefaultNonFree(filter) {
+ function manageDefaultNonFree() {
const defaultNonFreeFilter = storage.getJs("defaultNonFreeFilter", true);
if (defaultNonFreeFilter && defaultNonFreeFilter.isDefault === true){
- let newNonFree = defaultNonFreeFilter.isNonFree ? "true" : undefined;
- if (newNonFree !== filter.nonFree) {
- storage.setJs("isNonFree", newNonFree ? newNonFree : false, true);
- storage.setJs("defaultIsNonFree", newNonFree ? newNonFree : false, true);
- storage.setJs("isUploadedByMe", false, true);
- storage.setJs("defaultNonFreeFilter", {isDefault: false, isNonFree: false}, true);
- ctrl.filter.orgOwned = false;
+ const newNonFree = toNonFreeString(defaultNonFreeFilter.isNonFree);
+ storage.setJs("isNonFree", newNonFree, true);
+ storage.setJs("defaultIsNonFree", newNonFree, true);
+ storage.setJs("isUploadedByMe", false, true);
+ storage.setJs("defaultNonFreeFilter", {isDefault: false, isNonFree: newNonFree}, true);
+ ctrl.filterMyUploads = false;
+ if (ctrl.myUploadsProps) {
+ syncMyUploadsProps();
}
+ ctrl.filter.orgOwned = false;
Object.assign(ctrl.filter, {nonFree: newNonFree, uploadedByMe: false, uploadedBy: undefined});
raiseFilterChangeEvent(ctrl.filter);
}
@@ -245,9 +257,9 @@ query.controller('SearchQueryCtrl', [
// eslint-disable-next-line complexity
function watchSearchChange(newFilter, sender) {
- let showPaid = newFilter.nonFree ? newFilter.nonFree : false;
- if (sender && sender == "filterChange" && !newFilter.nonFree) {
- showPaid = ctrl.user.permissions.showPaid;
+ let showPaid = toNonFreeString(newFilter.nonFree);
+ if (ctrl.usePermissionsFilter && sender && sender === "filterChange" && newFilter.nonFree === undefined) {
+ showPaid = toNonFreeString(ctrl.user.permissions.showPaid);
}
storage.setJs("isNonFree", showPaid, true);
@@ -273,15 +285,15 @@ query.controller('SearchQueryCtrl', [
//--update filter elements--
manageUploadedBy(newFilter, sender);
- manageDefaultNonFree(newFilter);
+ manageDefaultNonFree();
manageOrgOwnedSetting(newFilter);
const { nonFree, uploadedByMe } = ctrl.filter;
let nonFreeCheck = nonFree;
if (ctrl.usePermissionsFilter && nonFreeCheck === undefined) {
const defaultShowPaid = storage.getJs("defaultIsNonFree", true);
- nonFreeCheck = defaultShowPaid;
- } else if (!ctrl.usePermissionsFilter && (nonFreeCheck === 'false' || nonFreeCheck === false)) {
+ nonFreeCheck = defaultShowPaid === 'true' ? 'true' : 'false';
+ } else if (!ctrl.usePermissionsFilter && nonFreeCheck === 'false') {
nonFreeCheck = undefined;
}
ctrl.filter.nonFree = nonFreeCheck;
@@ -299,8 +311,16 @@ query.controller('SearchQueryCtrl', [
}
//-my uploads-
+ function syncMyUploadsProps() {
+ ctrl.myUploadsProps = {
+ ...ctrl.myUploadsProps,
+ myUploads: ctrl.filterMyUploads
+ };
+ }
+
function selectMyUploads(myUploadsChecked) {
ctrl.filterMyUploads = myUploadsChecked;
+ syncMyUploadsProps();
watchSearchChange(ctrl.filter, "selectMyUploads");
}
@@ -328,12 +348,12 @@ query.controller('SearchQueryCtrl', [
function updatePermissionsChips (permissionsSel, showChargeable) {
ctrl.permissionsProps.selectedOption = permissionsSel;
ctrl.filter.query = updateFilterChips(permissionsSel, ctrl.filter.query);
- ctrl.filter.nonFree = showChargeable;
+ ctrl.filter.nonFree = toNonFreeString(showChargeable);
watchSearchChange(ctrl.filter, "updatePermissionsChips");
}
function chargeableChange (showChargeable) {
- ctrl.filter.nonFree = showChargeable;
+ ctrl.filter.nonFree = toNonFreeString(showChargeable);
watchSearchChange(ctrl.filter, "chargeableChange");
}
@@ -344,7 +364,7 @@ query.controller('SearchQueryCtrl', [
selectedOption: pfDefPerm,
onSelect: updatePermissionsChips,
onChargeable: chargeableChange,
- chargeable: ctrl.filter.nonFree ? ctrl.filter.nonFree : ($stateParams.nonFree == "true"),
+ chargeable: (ctrl.filter.nonFree || $stateParams.nonFree) === "true",
query: ctrl.filter.query
};
//-end permissions filter-
@@ -479,39 +499,49 @@ query.controller('SearchQueryCtrl', [
//-uploaded by me-
const isUploadedByMe = storage.getJs("isUploadedByMe", true);
ctrl.user = session.user;
- if (isUploadedByMe === null) {
- ctrl.filter.uploadedByMe = ctrl.filter.uploadedBy === ctrl.user.email;
- ctrl.filterMyUploads = ctrl.filter.uploadedByMe;
- storage.setJs("isUploadedByMe",ctrl.filter.uploadedByMe);
+ if (ctrl.filter.uploadedBy === ctrl.user.email) {
+ ctrl.filter.uploadedByMe = true;
+ ctrl.filterMyUploads = true;
+ storage.setJs("isUploadedByMe", true);
+ } else if (isUploadedByMe === null) {
+ ctrl.filter.uploadedByMe = ctrl.filter.uploadedBy === ctrl.user.email;
+ ctrl.filterMyUploads = ctrl.filter.uploadedByMe;
+ storage.setJs("isUploadedByMe",ctrl.filter.uploadedByMe);
} else {
- if ((ctrl.filter.uploadedBy === ctrl.user.email) && !isUploadedByMe ) {
- ctrl.filter.uploadedByMe = true;
- ctrl.filterMyUploads = ctrl.filter.uploadedByMe;
- storage.setJs("isUploadedByMe",ctrl.filter.uploadedByMe);
- } else {
- ctrl.filter.uploadedByMe = isUploadedByMe;
- ctrl.filterMyUploads = isUploadedByMe;
- }
+ if ((ctrl.filter.uploadedBy === ctrl.user.email) && !isUploadedByMe ) {
+ ctrl.filter.uploadedByMe = true;
+ ctrl.filterMyUploads = ctrl.filter.uploadedByMe;
+ storage.setJs("isUploadedByMe",ctrl.filter.uploadedByMe);
+ } else {
+ ctrl.filter.uploadedByMe = isUploadedByMe;
+ ctrl.filterMyUploads = isUploadedByMe;
+ }
}
- //-default non free-
- const defNonFree = session.user.permissions ? session.user.permissions.showPaid : undefined;
- storage.setJs("defaultIsNonFree", defNonFree ? defNonFree : false, true);
- if (!ctrl.initialShowPaidEvent && (defNonFree === true || defNonFree === "true")) {
- ctrl.initialShowPaidEvent = true;
- raisePayableImagesEvent(defNonFree);
- }
+ syncMyUploadsProps();
+ raiseUploadedByCheckEvent();
- const isNonFree = storage.getJs("isNonFree", true);
- if (isNonFree === null) {
- ctrl.filter.nonFree = $stateParams.nonFree;
- storage.setJs("isNonFree", ctrl.filter.nonFree ? ctrl.filter.nonFree : (ctrl.usePermissionsFilter ? "false" : undefined), true);
- }
- else if (isNonFree === true || isNonFree === "true") {
- ctrl.filter.nonFree = "true";
- } else {
- ctrl.filter.nonFree = (ctrl.usePermissionsFilter ? "false" : undefined);
- }
+ //-default non free-
+ const defNonFree = session.user.permissions ? session.user.permissions.showPaid : undefined;
+ storage.setJs("defaultIsNonFree", toNonFreeString(defNonFree), true);
+ if (!ctrl.initialShowPaidEvent && toNonFreeString(defNonFree) === 'true') {
+ ctrl.initialShowPaidEvent = true;
+ raisePayableImagesEvent(defNonFree);
+ }
+
+ // If nonFree is provided in URL params, use that; otherwise use stored value
+ if ($stateParams.nonFree !== undefined) {
+ ctrl.filter.nonFree = toNonFreeString($stateParams.nonFree);
+ storage.setJs("isNonFree", ctrl.filter.nonFree, true);
+ } else {
+ const isNonFree = storage.getJs("isNonFree", true);
+ if (isNonFree === null) {
+ ctrl.filter.nonFree = toNonFreeString($stateParams.nonFree);
+ storage.setJs("isNonFree", ctrl.filter.nonFree, true);
+ } else {
+ ctrl.filter.nonFree = isNonFreeString(isNonFree) ? 'true' : 'false';
+ }
+ }
//-org owned-
const structuredQuery = structureQuery(ctrl.filter.query);
diff --git a/kahuna/public/js/services/telemetry.ts b/kahuna/public/js/services/telemetry.ts
index 8eea94fe53..9995909bc3 100644
--- a/kahuna/public/js/services/telemetry.ts
+++ b/kahuna/public/js/services/telemetry.ts
@@ -49,11 +49,10 @@ const sendFilterTelemetryEvent = (key: string, value: string, searchUuid: string
}, 1);
};
-export const sendTelemetryForQuery = (query: string, nonFree?: boolean | string, uploadedByMe?: boolean ) => {
+export const sendTelemetryForQuery = (query: string, nonFree?: string, uploadedByMe?: boolean ) => {
const structuredQuery = structureQuery(query || "");
const searchUuid = v4();
- // nonFree is unfortunately either a boolean, stringified boolean, or undefined
- const freeToUseOnly = (!(nonFree === 'true' || nonFree === true));
+ const freeToUseOnly = nonFree !== 'true';
const uploadedByMeOnly = (uploadedByMe);
// Only log for true - matching how these filters work in Grid (only applied when true)
diff --git a/kahuna/public/js/upload/controller.js b/kahuna/public/js/upload/controller.js
index 8ed693ce05..c25d359ef4 100644
--- a/kahuna/public/js/upload/controller.js
+++ b/kahuna/public/js/upload/controller.js
@@ -4,6 +4,8 @@ import './prompt/prompt';
import './recent/recent-uploads';
import '../services/scroll-position';
+const toNonFreeString = (val) => (val === true || val === 'true') ? 'true' : 'false';
+
var upload = angular.module('kahuna.upload.controller', [
'kahuna.upload.prompt',
'kahuna.upload.recent',
@@ -57,11 +59,11 @@ upload.controller('UploadCtrl', ['uploadManager', 'mediaApi', 'scrollPosition',
const showPaid = session.user.permissions.showPaid ? session.user.permissions.showPaid : undefined;
const defaultNonFreeFilter = {
isDefault: true,
- isNonFree: showPaid ? showPaid : false
+ isNonFree: toNonFreeString(showPaid)
};
storage.setJs("defaultNonFreeFilter", defaultNonFreeFilter, true);
window.dispatchEvent(new CustomEvent("logoClick", {
- detail: {showPaid: defaultNonFreeFilter.isNonFree},
+ detail: {showPaid: defaultNonFreeFilter.isNonFree === 'true'},
bubbles: true
}));
scrollPosition.resetToTop();
diff --git a/kahuna/public/js/upload/recent/recent-uploads.html b/kahuna/public/js/upload/recent/recent-uploads.html
index 1ac202e07c..3ea255e1b5 100644
--- a/kahuna/public/js/upload/recent/recent-uploads.html
+++ b/kahuna/public/js/upload/recent/recent-uploads.html
@@ -2,7 +2,7 @@
Loading…
- You haven’t uploaded anything yet.
+ You haven't uploaded anything yet.
-
diff --git a/kahuna/public/js/upload/recent/recent-uploads.js b/kahuna/public/js/upload/recent/recent-uploads.js
index 639b9d9bfe..6f85809d98 100644
--- a/kahuna/public/js/upload/recent/recent-uploads.js
+++ b/kahuna/public/js/upload/recent/recent-uploads.js
@@ -50,6 +50,7 @@ recentUploads.controller('RecentUploadsCtrl', [
ctrl.canBeDeleted = (image) => deletableImages.has(image.data.id);
+
const freeImageDeleteListener = $rootScope.$on('images-deleted', (e, images) => {
images.forEach(image => {
const index = ctrl.myUploads.data.findIndex(i => i.data.id === image.data.id);