@@ -2195,6 +2195,17 @@ jQuery(document).ready(function ($) {
21952195 }
21962196 }
21972197
2198+ /**
2199+ * Function to initialize the frequency job settings
2200+ * Runs when the element `.js-backwpup-frequency-job` is found in the DOM.
2201+ */
2202+ function runWhenJobFormatSettingsLoaded ( ) {
2203+ const $element = $ ( ".js-backwpup-format-job" ) ;
2204+ if ( $element . length ) {
2205+ showArchiveFormatJobFields ( $element ) ;
2206+ }
2207+ }
2208+
21982209 /**
21992210 * MutationObserver: Watches for new elements being added to the DOM
22002211 * When a `.js-backwpup-frequency-job` field appears, it triggers `runWhenJobFrequencySettingsLoaded()`
@@ -2206,13 +2217,100 @@ jQuery(document).ready(function ($) {
22062217 if ( $ ( node ) . is ( ".js-backwpup-frequency-job" ) || $ ( node ) . find ( ".js-backwpup-frequency-job" ) . length ) {
22072218 runWhenJobFrequencySettingsLoaded ( ) ;
22082219 }
2220+ const format_job_element = $ ( node ) . find ( ".js-backwpup-format-job" ) ;
2221+ if ( $ ( node ) . is ( ".js-backwpup-format-job" ) || format_job_element . length ) {
2222+ showArchiveFormatJobFields ( format_job_element ) ;
2223+ }
22092224 } ) ;
22102225 } ) ;
22112226 } ) ;
22122227
22132228 // Start observing DOM changes on the entire document
22142229 observer . observe ( document . body , { childList : true , subtree : true } ) ;
22152230
2231+ /**
2232+ * Event Listener: Detect changes in format dropdown
2233+ * Calls `showArchiveFormatJobFields()` whenever the user selects a new frequency.
2234+ */
2235+ $document . on ( "change" , ".js-backwpup-format-job" , function ( ) {
2236+ showArchiveFormatJobFields ( $ ( this ) ) ;
2237+ } ) ;
2238+
2239+ /**
2240+ * Event Listener: Detect changes in archive name input
2241+ * Calls `showArchiveFormatJobFields()` whenever the user selects a new frequency.
2242+ */
2243+ $document . on ( "input" , ".js-backwpup-format-job-name" , function ( ) {
2244+ let name = $ ( this ) . val ( ) ;
2245+ let error_box = $ ( this ) . closest ( `div` ) . find ( `.js-backwpup-format-job-name-no-hash` ) ;
2246+ if ( ! name ) {
2247+ return ;
2248+ }
2249+ if ( name . includes ( '%hash%' ) ) {
2250+ error_box . hide ( ) ;
2251+ } else {
2252+ error_box . show ( ) ;
2253+ }
2254+ //replace plaseholder
2255+ let name_preview_span = error_box . parent ( ) . find ( `.js-backwpup-format-archive-name` ) ;
2256+ let name_previev = name . trim ( ) . replace ( '%hash%' , name_preview_span . data ( 'hash' ) ) ;
2257+ const date = new Date ( ) ;
2258+ let hourIn12Format = date . getHours ( ) ;
2259+ let dayPart = 'am'
2260+ if ( hourIn12Format > 12 ) {
2261+ hourIn12Format = hourIn12Format - 12 ;
2262+ dayPart = 'pm'
2263+ }
2264+ name_previev = name_previev . replace ( '%d' , String ( date . getDay ( ) + 1 ) . padStart ( 2 , '0' ) ) ;
2265+ name_previev = name_previev . replace ( '%m' , String ( date . getMonth ( ) + 1 ) . padStart ( 2 , '0' ) ) ;
2266+ name_previev = name_previev . replace ( '%n' , String ( date . getMonth ( ) + 1 ) ) ;
2267+ name_previev = name_previev . replace ( '%j' , date . getDay ( ) + 1 ) ;
2268+ name_previev = name_previev . replace ( '%Y' , date . getFullYear ( ) ) ;
2269+ name_previev = name_previev . replace ( '%y' , String ( date . getFullYear ( ) ) . slice ( - 2 ) ) ;
2270+ name_previev = name_previev . replace ( '%a' , dayPart ) ;
2271+ name_previev = name_previev . replace ( '%A' , dayPart . toUpperCase ( ) ) ;
2272+ let btm = ( ( date . getHours ( ) * 60 + date . getMinutes ( ) ) * 86.4 / 100 ) . toFixed ( 0 ) ;
2273+ name_previev = name_previev . replace ( '%B' , btm ) ;
2274+ name_previev = name_previev . replace ( '%g' , hourIn12Format ) ;
2275+ name_previev = name_previev . replace ( '%G' , date . getHours ( ) ) ;
2276+ name_previev = name_previev . replace ( '%h' , String ( hourIn12Format ) . padStart ( 2 , '0' ) ) ;
2277+ name_previev = name_previev . replace ( '%H' , String ( date . getHours ( ) ) . padStart ( 2 , '0' ) ) ;
2278+ name_previev = name_previev . replace ( '%i' , date . getMinutes ( ) ) ;
2279+ name_previev = name_previev . replace ( '%s' , date . getSeconds ( ) ) ;
2280+ //replace special chars
2281+ let specialChars = [ '?' , '[' , ']' , '/' , '\\' , '=' , '<' , '>' , ':' , ';' , ',' , "'" , '"' , '&' , '$' , '#' , '*' , '(' , ')' , '|' , '~' , '`' , '!' , '{' , '}' ] ;
2282+ specialChars . forEach ( function ( char ) {
2283+ name_previev = name_previev . replace ( char , '' ) ;
2284+ } ) ;
2285+ let spaces = [ ' ' , '%20' , '+' ] ;
2286+ spaces . forEach ( function ( space ) {
2287+ name_previev = name_previev . replace ( space , '_' ) ;
2288+ } ) ;
2289+ let divider = [ '\t' , '\r' , '\n' ] ;
2290+ divider . forEach ( function ( divider ) {
2291+ name_previev = name_previev . replace ( divider , '-' ) ;
2292+ } ) ;
2293+ name_preview_span . text ( name_previev ) ;
2294+ } ) ;
2295+
2296+ /**
2297+ * Function to show/hide elements based on selected job archive format
2298+ * @param {string } element - the element to check.
2299+ */
2300+ function showArchiveFormatJobFields ( element ) {
2301+ let format = element . val ( ) ;
2302+ let alert_box = element . closest ( `div` ) . next ( `.js-backwpup-format-job-show-if-zip` ) ;
2303+ if ( format === ".zip" ) {
2304+ alert_box . show ( ) ;
2305+ } else {
2306+ alert_box . hide ( ) ;
2307+ }
2308+ let name_preview = alert_box . parent ( ) . find ( `.js-backwpup-format-archive-name-format` ) ;
2309+ if ( name_preview ) {
2310+ name_preview . text ( format ) ;
2311+ }
2312+ }
2313+
22162314 /**
22172315 * Event Listener: Detect changes in frequency dropdown
22182316 * Calls `showFrequencyJobFields()` whenever the user selects a new frequency.
@@ -2290,8 +2388,42 @@ jQuery(document).ready(function ($) {
22902388 ) ;
22912389 } ) ;
22922390
2391+
2392+ /**
2393+ * Event Listener: Handles the "Save Job Format Settings" button click
2394+ * Extracts form data and sends an AJAX request to save the job format settings.
2395+ */
2396+ $document . on ( "click" , "#save-job-format" , function ( ) {
2397+ const container = $ ( this ) . closest ( "article" ) ;
2398+
2399+ // Collect input values from the form
2400+ const data = {
2401+ archiveformat : container . find ( "select[name='archiveformat']" ) . val ( ) ,
2402+ archivename : container . find ( "input[name='archivename']" ) . val ( ) ,
2403+ job_id : container . find ( "input[name='job_id']" ) . val ( ) ,
2404+ } ;
2405+
2406+ // Send AJAX request to save job settings
2407+ requestWPApi (
2408+ backwpupApi . save_job_format ,
2409+ data ,
2410+ function ( response ) {
2411+ if ( response . status === 200 ) {
2412+ backwpupDisplaySettingsToast ( 'success' , response . message ) ;
2413+ // Close the settings sidebar
2414+ closeSidebar ( ) ;
2415+ }
2416+ if ( response . status === 500 ) {
2417+ backwpupDisplaySettingsToast ( 'danger' , response . error ) ;
2418+ }
2419+ } ,
2420+ "POST"
2421+ ) ;
2422+ } ) ;
2423+
22932424 // Run the job settings function on initial page load
22942425 runWhenJobFrequencySettingsLoaded ( ) ;
2426+ runWhenJobFormatSettingsLoaded ( ) ;
22952427
22962428 $document . on ( 'click' , '.backwpup-start-backup-job' , function ( ) {
22972429 startBackupProcess ( { 'job_id' : $ ( this ) . data ( 'job_id' ) } ) ;
0 commit comments