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);