Skip to content

Commit

Permalink
v.1.2.2
Browse files Browse the repository at this point in the history
Work on optimizing core files and fix a few logic flaws
  • Loading branch information
KmancusoRonik committed Oct 10, 2024
1 parent cb01612 commit b73a10b
Show file tree
Hide file tree
Showing 18 changed files with 1,690 additions and 670 deletions.
45 changes: 32 additions & 13 deletions admin/class-ronik-base-admin.php
Original file line number Diff line number Diff line change
Expand Up @@ -430,12 +430,30 @@ public function rmc_media_sync(){

sleep(10);



// Check if images have the preserved attributes.
// $transient_rmc_media_cleaner_media_data_collectors_image_id_array_not_preserve = get_transient( 'rmc_media_cleaner_media_data_collectors_image_id_array_not_preserve' );
// if( ! empty( $transient_rmc_media_cleaner_media_data_collectors_image_id_array_not_preserve ) ) {
// $rmc_media_cleaner_media_data_collectors_image_id_array_not_preserve_finalized = $transient_rmc_media_cleaner_media_data_collectors_image_id_array_not_preserve;
// } else {
// }
$rmc_media_cleaner_media_data_collectors_image_id_array_not_preserved = $RmcDataGathering->imagePreserveAudit( $rmc_media_cleaner_media_data_collectors_image_id_array );
// Save the response so we don't have to call again until tomorrow.
set_transient( 'rmc_media_cleaner_media_data_collectors_image_id_array_not_preserve' , $rmc_media_cleaner_media_data_collectors_image_id_array_not_preserved , DAY_IN_SECONDS );

$rbpHelper->ronikdesigns_write_log_devmode('Media Cleaner: Ref 1b, rmc_media_sync running, transient: Check if images have the preserved attributes. ' .count($rmc_media_cleaner_media_data_collectors_image_id_array_not_preserved) , 'low', 'rbp_media_cleaner');





// Image Id Thumbnail Auditor.
$transient_rmc_media_cleaner_media_data_collectors_image_thumbnail_auditor_array = get_transient( 'rmc_media_cleaner_media_data_collectors_image_thumbnail_auditor_array' );
if( ! empty( $transient_rmc_media_cleaner_media_data_collectors_image_thumbnail_auditor_array ) ) {
$rmc_media_cleaner_media_data_collectors_image_thumbnail_auditor_array = $transient_rmc_media_cleaner_media_data_collectors_image_thumbnail_auditor_array;
} else {
$rmc_media_cleaner_media_data_collectors_image_thumbnail_auditor_array = $RmcDataGathering->imageThumbnailAuditor( $rmc_media_cleaner_media_data_collectors_posts_array, $rmc_media_cleaner_media_data_collectors_image_id_array, $select_attachment_type );
$rmc_media_cleaner_media_data_collectors_image_thumbnail_auditor_array = $RmcDataGathering->imageThumbnailAuditor( $rmc_media_cleaner_media_data_collectors_posts_array, $rmc_media_cleaner_media_data_collectors_image_id_array_not_preserved, $select_attachment_type );
// Save the response so we don't have to call again until tomorrow.
set_transient( 'rmc_media_cleaner_media_data_collectors_image_thumbnail_auditor_array' , $rmc_media_cleaner_media_data_collectors_image_thumbnail_auditor_array , DAY_IN_SECONDS );
}
Expand Down Expand Up @@ -506,26 +524,27 @@ public function rmc_media_sync(){
}
$rbpHelper->ronikdesigns_write_log_devmode('Media Cleaner: Ref 1b, rmc_media_sync running, transient: Check the image inside the filesystem. This checks if the image hardcoded into any of the files. ' .count($rmc_media_cleaner_media_data_collectors_image_filesystem_auditor_array) , 'low', 'rbp_media_cleaner');

// Check if images have the preserved attributes.
// $transient_rmc_media_cleaner_media_data_collectors_image_id_array_not_preserve = get_transient( 'rmc_media_cleaner_media_data_collectors_image_id_array_not_preserve' );
// if( ! empty( $transient_rmc_media_cleaner_media_data_collectors_image_id_array_not_preserve ) ) {
// $rmc_media_cleaner_media_data_collectors_image_id_array_not_preserve_finalized = $transient_rmc_media_cleaner_media_data_collectors_image_id_array_not_preserve;
// } else {
// }
$rmc_media_cleaner_media_data_collectors_image_id_array_not_preserve_finalized = $RmcDataGathering->imagePreserveAudit( $rmc_media_cleaner_media_data_collectors_image_filesystem_auditor_array );
// Save the response so we don't have to call again until tomorrow.
set_transient( 'rmc_media_cleaner_media_data_collectors_image_id_array_not_preserve' , $rmc_media_cleaner_media_data_collectors_image_id_array_not_preserve_finalized , DAY_IN_SECONDS );











set_transient( 'rmc_media_cleaner_media_data_collectors_image_id_array_progress' , '98%' , DAY_IN_SECONDS );
sleep(10);

$rbpHelper->ronikdesigns_write_log_devmode('Media Cleaner: Ref 1b, rmc_media_sync running, transient: Check if images have the preserved attributes. ' .count($rmc_media_cleaner_media_data_collectors_image_id_array_not_preserve_finalized) , 'low', 'rbp_media_cleaner');


set_transient( 'rmc_media_cleaner_media_data_collectors_image_id_array_progress' , '99%' , DAY_IN_SECONDS );
sleep(10);

set_transient( 'rmc_media_cleaner_media_data_collectors_image_id_array_finalized' , $rmc_media_cleaner_media_data_collectors_image_id_array_not_preserve_finalized , DAY_IN_SECONDS );
$RmcDataGathering->imageMarker( $rmc_media_cleaner_media_data_collectors_image_id_array_not_preserve_finalized );
set_transient( 'rmc_media_cleaner_media_data_collectors_image_id_array_finalized' , $rmc_media_cleaner_media_data_collectors_image_filesystem_auditor_array , DAY_IN_SECONDS );
$RmcDataGathering->imageMarker( $rmc_media_cleaner_media_data_collectors_image_filesystem_auditor_array );
sleep(1);
set_transient( 'rmc_media_cleaner_media_data_collectors_image_id_array_progress' , 'DONE' , DAY_IN_SECONDS );
$rbpHelper->ronikdesigns_write_log_devmode('Media Cleaner: Ref 1b, rmc_media_sync running, transient: FINISHED SYNC ' , 'low', 'rbp_media_cleaner');
Expand Down
124 changes: 116 additions & 8 deletions admin/interface/components/MediaCleaner/MediaCollector.jsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,20 @@
import React, { useState, useEffect, useCallback } from 'react';
import MediaTable from './MediaTable';

const { MediaCollectorTable, PreservedMediaCollectorTable } = MediaTable;
const { FilterMedia, MediaCollectorTable, PreservedMediaCollectorTable } = MediaTable;

const MediaCollector = ({ type }) => {
const [pageDetector, setPageDetector] = useState(getQueryParam('page', 'options-ronik-base_media_cleaner') == 'options-ronik-base_media_cleaner' ? 'mediacollector' : 'mediacollectorpreserved');
let fileSize = 'large';
// if(pageDetector == 'mediacollectorpreserved'){
// fileSize = 'all';
// }

const MediaCollector = () => {
const [hasLoaded, setHasLoaded] = useState(false);
const [mediaCollector, setMediaCollector] = useState(null);
const [filterPager, setFilterPager] = useState(parseInt(getQueryParam('page_number', 0)));
const [filterMode, setFilterMode] = useState(getQueryParam('filter_size', 'all'));
const [filterMode, setFilterMode] = useState(getQueryParam('filter_size', fileSize));

const [filterType, setFilterType] = useState(getQueryParam('filter_type', 'all'));
const [mediaCollectorLow, setMediaCollectorLow] = useState(null);
const [mediaCollectorHigh, setMediaCollectorHigh] = useState(null);
Expand Down Expand Up @@ -113,11 +120,13 @@ const MediaCollector = () => {
setHasLoaded(false);
const route = selectedDataFormValues.includes("all") ? 'all' : selectedDataFormValues.join('?');
const endpoint = filterMode ? `${filterMode}?filter=${route}` : `all?filter=${route}`;

// alert(pageDetector);
fetch(`/wp-json/mediacleaner/v1/mediacollector/${endpoint}`)
.then(response => response.json())
.then(data => {
if (data.length) {

setMediaCollectorPreserved(data)
setMediaCollector(data);
setTimeout(() => {
setHasLoaded(true); // Simulate delay
Expand Down Expand Up @@ -155,7 +164,7 @@ const MediaCollector = () => {

// Function to handle filter size changes
const filter_size = useCallback(async (e) => {
setHasLoaded(false);
setHasLoaded(false);
const filter = e.target.getAttribute("data-filter");
if (filter) {
setFilterMode(filter);
Expand Down Expand Up @@ -217,7 +226,40 @@ const MediaCollector = () => {
});
const result = await response.json();
if (result?.data === 'Reload') {
setTimeout(() => location.reload(), 50);

// alert('preserveImageId' + preserveImageId);
// alert('unPreserveImageId' + unPreserveImageId);
let $res_message,$res_url;

if(preserveImageId !== 'invalid'){
$res_message = "Media is preserved. Would you like to view the preserved content?";
$res_url = '/wp-admin/admin.php?page=options-ronik-base_preserved&filter_size=large&page_number=0&media_id='+preserveImageId;
}
if(unPreserveImageId !== 'invalid'){
$res_message = "Media is unpreserved. Would you like to view the unpreserved content?";
$res_url = '/wp-admin/admin.php?page=options-ronik-base_media_cleaner&filter_size=large&page_number=0&media_id='+unPreserveImageId;
}




if (confirm($res_message)) {
// User clicked OK
// Redirect to the specified URL
setTimeout(() => {
window.location.href = $res_url;
}, 50); // Add a slight delay (100ms)

} else {
// User clicked Cancel
// Do nothing or perform an alternative action
setTimeout(() => location.reload(), 50);
}





}
} catch (error) {
console.error('[WP Pageviews Plugin handlePostDataPreserve]', error);
Expand Down Expand Up @@ -280,10 +322,62 @@ const MediaCollector = () => {
return 'Loading...';
}

// Function to get the value of a query parameter from the URL
function getQueryParameter(name) {
const urlParams = new URLSearchParams(window.location.search);
return urlParams.get(name);
}


// Function to scroll to the element with matching data-media-id
function scrollToMediaItem(mediaId, offset = 0) {
if (!mediaId) return; // Exit if no mediaId is provided

// Find the element with the matching data-media-id attribute
const element = document.querySelector(`tr[data-media-id="${mediaId}"]`);

if (element) {
element.classList.add('highlighted'); // Replace 'highlighted' with your desired class name

// Calculate the position to scroll to, accounting for the offset
const elementPosition = element.getBoundingClientRect().top + window.scrollY;
const scrollToPosition = elementPosition - offset;

// Smoothly scroll to the calculated position
window.scrollTo({
top: scrollToPosition,
behavior: 'smooth'
});
} else {
console.log(`Element with data-media-id="${mediaId}" not found.`);
}
}
// Specify an offset value (e.g., 100 pixels)
const offsetValue = 100;
// Get the 'media_id' parameter value from the URL
const mediaId = getQueryParameter('media_id');




// Set a delay (e.g., 500 milliseconds) before calling the scrollToMediaItem function
setTimeout(() => {
scrollToMediaItem(mediaId, offsetValue);
}, 500);



return (
<>
<div className="message"> </div>
{/* <FilterMedia
selectedFormValues={selectedFormValues}
setFilterMode={setFilterMode}
setSelectedFormValues={setSelectedFormValues}
setSelectedDataFormValues={setSelectedDataFormValues}
/> */}
<MediaCollectorTable
type={type}
mediaCollector={mediaCollector}
selectedFormValues={selectedFormValues}
filterMode={filterMode}
Expand All @@ -301,11 +395,25 @@ const MediaCollector = () => {
activateDelete={activateDelete}
activatePreserve={activatePreserve}
/>
<h1>Preserved Files</h1>
<PreservedMediaCollectorTable
type={type}
mediaCollectorPreserved={mediaCollectorPreserved}
filter={filterMode}
activatePreserve={activatePreserve}
setFilterMode={setFilterMode}
selectedFormValues={selectedFormValues}
filterMode={filterMode}
setSelectedFormValues={setSelectedFormValues}
setSelectedDataFormValues={setSelectedDataFormValues}
setFilterPager={setFilterPager}
setFilterType={setFilterType}
filter_size={filter_size}
filterPager={filterPager}
filter={filterMode}
filterType={filterType}
mediaCollectorHigh={mediaCollectorHigh}
mediaCollectorLow={mediaCollectorLow}
activateDelete={activateDelete}

/>
</>
);
Expand Down
144 changes: 144 additions & 0 deletions admin/interface/components/MediaCleaner/MediaFilter.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
import React, { useMemo, useEffect, useState } from 'react';
import Select, { components } from 'react-select';

// Custom ClearIndicator to clear all selected values
const ClearIndicator = (props) => {
const {
clearValue, // Function to clear all selected values
innerProps: { ref, ...restInnerProps },
} = props;

return (
<div
{...restInnerProps}
ref={ref}
onClick={() => {
console.log('ClearIndicator clicked');
clearValue(); // Clear the select component's internal state
props.setSelectedFormValues([]); // Clear all values in the state
props.setSelectedDataFormValues([]); // Clear all data form values
props.setManualClear(true); // Set manual clear flag
console.log('Cleared all selected values');
}}
style={{ cursor: 'pointer' }}
>
<span style={{ fontSize: '16px' }}></span> {/* Custom X (clear) icon */}
</div>
);
};

// FilterType component
const FilterType = ({
selectedFormValues,
setFilterMode,
setSelectedFormValues,
setSelectedDataFormValues,
}) => {
// Define individual options (no "all" option)
const options = useMemo(() => [
{ value: 'jpg', label: 'JPG' },
{ value: 'gif', label: 'GIF' },
{ value: 'png', label: 'PNG' },
{ value: 'video', label: 'Video' },
{ value: 'misc', label: 'Misc' },
], []);

// State to control the open/close of the select dropdown
const [menuIsOpen, setMenuIsOpen] = useState(false);
const [manualClear, setManualClear] = useState(false);

// Initialize all options as selected when the component first renders
useEffect(() => {
console.log('useEffect triggered');
console.log('Selected Form Values:', selectedFormValues);
console.log('Manual Clear Flag:', manualClear);

if (!manualClear && (!selectedFormValues || selectedFormValues.length === 0)) {
console.log('Preselecting all options');
// setSelectedFormValues(options);
// setSelectedDataFormValues(options.map(option => option.value));
}

// Check if selectedFormValues exists and contains the 'all' option
if (!manualClear && selectedFormValues && selectedFormValues.length > 0 && selectedFormValues[0]?.value === 'all') {
console.log('"All" option is selected, preselecting all options again');
setSelectedFormValues(options);
setSelectedDataFormValues(options.map(option => option.value));
}

// Reset the manualClear flag after handling
if (manualClear) {
console.log('Resetting manual clear flag');
setManualClear(false);
}
}, [options, selectedFormValues, setSelectedFormValues, setSelectedDataFormValues, manualClear]);

// Function to toggle the dropdown
const toggleMenuIsOpen = () => {
setMenuIsOpen((prevState) => !prevState);
};

return (
<div className="select-container">
<button className="add-button" onClick={toggleMenuIsOpen}>
<span>+</span>
</button>
<Select
closeMenuOnSelect={false}
value={selectedFormValues} // Preselect all options
isMulti
options={options}
isSearchable={false} // Prevent typing in the input field
styles={{
control: (provided, state) => ({
...provided,
boxShadow: 'none', // Remove the box shadow
borderColor: state.isFocused ? 'transparent' : provided.borderColor, // Remove the border when focused
'&:hover': {
borderColor: 'transparent', // Ensure the border is also removed on hover
},
}),
}}
menuIsOpen={menuIsOpen} // Control menu open/close state
onChange={(selected) => {
console.log('Select onChange triggered');
console.log('Selected Values:', selected);
// setFilterMode('all'); // Set filter mode to 'all'

setFilterMode('large'); // Set filter mode to 'all'

// Update the selected values (will handle both adding and removing)
setSelectedFormValues(selected || []); // Ensure empty array if no selection

// If no items are selected, set an empty array, otherwise update with selected values
const newDataArr = selected ? selected.map(option => option.value) : [];
setSelectedDataFormValues(newDataArr);

// Close the menu if all items are cleared
if (!selected || selected.length === 0) {
console.log('All items cleared, closing menu');
setMenuIsOpen(false);
}
}}
components={{
DropdownIndicator: () => null, // Disable caret by setting DropdownIndicator to null
ClearIndicator: (props) => (
<ClearIndicator
{...props}
setSelectedFormValues={setSelectedFormValues}
setSelectedDataFormValues={setSelectedDataFormValues}
setManualClear={setManualClear} // Pass function to set manual clear flag
/>
),
}}
noOptionsMessage={() => "No media formats available"} // Customize the "No options" message
onMenuClose={() => {
console.log('Menu closed');
setMenuIsOpen(false);
}} // Ensure menu closes when selection is made
/>
</div>
);
};

export default FilterType;
Loading

0 comments on commit b73a10b

Please sign in to comment.