Skip to main content
Inspiring
June 3, 2025
Question

Error Finding Recently Modified Files and FIX!

  • June 3, 2025
  • 2 replies
  • 157 views

I'm curious if anyone else has come across this issue and what is everyone going to use when Dreamweaver is truly dead. I like the tools it provides for web specific site building. Modernize and bring it into the future!

The "latest" version of Dreamweaver on Mac Sequoia has error when I try to Find Recently Modified Files:

While executing onClick in SelectRecentlyModified.html, the following
JavaScript error(s) occurred:
At line 370 of file "Macintosh HD:Applications:Adobe Dreamweaver 2021:Configuration:Menus:MM:SelectRecentlyModified.js":
DWfile.getAttributes(listitem) has no properties

/Applications/Adobe Dreamweaver 2021/configuration/Menus/MM/SelectRecentlyModified.js

 It is invoked here (See abnove)


With the help of AI, I fixed this file:
/Applications/Adobe Dreamweaver 2021/configuration/Menus/MM/SelectRecentlyModified.js

if (listItem && DWfile.exists(listItem) && DWfile.getAttributes(listItem).indexOf('D') != (-1)) {

The error you are seeing:

DWfile.getAttributes(listitem) has no properties

means that DWfile.getAttributes(listitem) is returning null or undefined, so trying to call .indexOf('D') on it fails.
Why This Happens
This can happen if:
DWfile.getAttributes(listitem) fails to get attributes (e.g., the file/folder doesn't exist, or there's a permissions issue).
DWfile.exists(listitem) is not correctly filtering out non-existent files/folders (sometimes it can return a false positive).
The Fix
The usual fix is to add a check to ensure that DWfile.getAttributes(listitem) returns a valid string before calling .indexOf('D'). For example:

var attrs = DWfile.getAttributes(listItem);
if (listItem && DWfile.exists(listItem) && attrs && attrs.indexOf('D') != -1) {
    // listItem is a folder
    if (!checkArray(ignoreFolders, tmpListItem)) {
        searchFolder(listItem);
    }
} else {
    // listItem is a file
    searchFile(listItem);
}

 

 

This way, if attrs is null or undefined, the code will not try to call .indexOf('D') and will skip to the else

 

Full content of fixed SelectRecentlyModified.js file is here:

 

// Copyright 2003-2007 Adobe Systems Incorporated.  All rights reserved.

//*************** GLOBAL CONSTANTS *****************
var TEAM_ADMIN_DLG_DATES = "TeamAdminDlgDates.html";
var TEAM_ADMIN_DLG_DAYS = "TeamAdminDlgDays.html";
var WEEK_BACK = "7";
var helpDoc = MM.HELP_recentlyModifiedMC;

//*************** GLOBAL VARIABLES *****************
var CK_VALUES = 
  {
     // Default values - names,Days must match cooresponding object names.
     CKName:'',
     CKDays:'' ,
     CKToMonth:'',
     CKFromMonth:'',
     CKToDay:'',
     CKFromDay:'',
     CKToYear:'',
     CKFromYear:'',
     CKDaysModified:''
  };
  PREF_OBJ = new Preferences(document.URL, CK_VALUES);

  MM.cmdArgument = new Array();

  var strModifiedBy = "";

  var fileArray = new Array();

//***************    LOCAL FUNCTIONS   ***************

//-------------------------------------------------------------------
// FUNCTION:
//   onChangeRadio()
//
// DESCRIPTION: Disables the fields associated with the unchecked Radio box 
//   
//
// ARGUMENTS:
//   none
//
// RETURNS:
//   none
//--------------------------------------------------------------------
function onChangeRadio()
{
   document.myForm.daysModifiedhid.value = DAYS_MODIFIED_OBJ.getSelectedIndex();
   if(DAYS_MODIFIED_OBJ.getSelectedIndex() == 1)
     {
        document.myForm.fromMonth.removeAttribute("disabled");
        document.myForm.fromDay.removeAttribute("disabled");
        document.myForm.fromYear.removeAttribute("disabled");
        document.myForm.toMonth.removeAttribute("disabled");
        document.myForm.toDay.removeAttribute("disabled");
        document.myForm.toYear.removeAttribute("disabled")
        document.myForm.numDays.disabled = true;
     }
     else if(DAYS_MODIFIED_OBJ.getSelectedIndex() == 0)
     {
        document.myForm.fromMonth.disabled = true;
        document.myForm.fromDay.disabled = true;
        document.myForm.fromYear.disabled = true;
        document.myForm.toMonth.disabled = true;
        document.myForm.toDay.disabled = true;
        document.myForm.toYear.disabled = true;
        document.myForm.numDays.removeAttribute("disabled");
     }   
}
 
//-------------------------------------------------------------------
// FUNCTION:
//   initializeUI()
//
// DESCRIPTION: Configures the UI of a dialog.
// 
//   
//
// ARGUMENTS:
//   none
//
// RETURNS:
//   nothing
//--------------------------------------------------------------------
function initializeUI() 
{  
   //Radio object
   DAYS_MODIFIED_OBJ = new RadioGroup("optDaysModified");
       	
   //From fields
   FROM_DAY_OBJ = new ListControl("fromDay");
   FROM_MONTH_OBJ= new ListControl("fromMonth");
   FROM_YEAR_OBJ = new ListControl("fromYear");

   //To fields
   TO_DAY_OBJ = new ListControl("toDay");
   TO_MONTH_OBJ = new ListControl("toMonth");
   TO_YEAR_OBJ = new ListControl("toYear");

   setCurrentDate();      //getting current date
   var strDateWeek = addDays(new Date(),WEEK_BACK); 
   fromDay = strDateWeek.getDate();
   fromYear = strDateWeek.getFullYear();
   var monthValues = new Array (0,1,2,3,4,5,6,7,8,9,10, 11);
   FROM_MONTH_OBJ.setAll (ARR_FullMonths, monthValues);
   TO_MONTH_OBJ.setAll (ARR_FullMonths,monthValues );
   FROM_MONTH_OBJ.setIndex (fromMonth);
   var yearArray = new Array();
   
   for (var index = startYear; index <= endYear ; index++)
   {
     yearArray.push(toYear - index);	
   }  
   
   FROM_YEAR_OBJ.setAll (yearArray, yearArray);
   TO_YEAR_OBJ.setAll (yearArray, yearArray);

   FROM_MONTH_OBJ.setIndex (fromMonth );
   TO_MONTH_OBJ.setIndex (toMonth);

   FROM_DAY_OBJ.pickValue (fromDay);
   TO_DAY_OBJ.pickValue (toDay);

   FROM_YEAR_OBJ.pickValue (fromYear);
   TO_YEAR_OBJ.pickValue (toYear); 
   	
   var intMonths = strDateWeek.getMonth();
   var strMonths = ARR_FullMonths[intMonths];
   var fullMonth = ARR_FullMonths;
   for (var i = 0; i < ARR_FullMonths.length; i++)
   {
      if (ARR_FullMonths[i] == strMonths)
      {
        FROM_MONTH_OBJ.setIndex(intMonths);
      }		
   }
   
   setDaysCombo(FROM_DAY_OBJ,fromMonth,fromYear,0);
   setDaysCombo(TO_DAY_OBJ,toMonth,toYear,0);
   FROM_DAY_OBJ.setIndex(fromDay-1);
   TO_DAY_OBJ.setIndex(toDay-1);
   
   PREF_OBJ.load();
 
   PREF_OBJ.initialize (
   {
      CKName : new PrefField(findObject('modifiedBy')),
      CKDays : new PrefField(findObject('numDays')),
      CKToMonth : new PrefSelectClass(TO_MONTH_OBJ),
      CKFromMonth : new PrefSelectClass(FROM_MONTH_OBJ),
      CKToDay : new PrefSelectClass(TO_DAY_OBJ),
      CKFromDay : new PrefSelectClass(FROM_DAY_OBJ),
      CKToYear : new PrefSelectClass(TO_YEAR_OBJ),
      CKFromYear : new PrefSelectClass(FROM_YEAR_OBJ),
      CKDaysModified : new PrefField(findObject('daysModifiedhid'))
    })
	
    fromMonth = FROM_MONTH_OBJ.getValue();
    toMonth = TO_MONTH_OBJ.getValue();
   
    fromYear = FROM_YEAR_OBJ.getValue();
    toYear = TO_YEAR_OBJ.getValue();
   
    toDay = TO_DAY_OBJ.getValue();
    fromDay = FROM_DAY_OBJ.getValue();
	
    var index = document.myForm.daysModifiedhid.value;
    DAYS_MODIFIED_OBJ.setSelectedIndex(index);
    onChangeRadio();
	
    setDaysCombo(FROM_DAY_OBJ,fromMonth,fromYear,1);
    setDaysCombo(TO_DAY_OBJ,toMonth,toYear,1);
    FROM_DAY_OBJ.setIndex(fromDay-1);
    TO_DAY_OBJ.setIndex(toDay-1);
		     
    localDir = dw.getCurrentSiteRoot();

    if(DWfile.exists(localDir+CONTRIBUTE_FOLDER+dwscripts.FILE_SEP+CONTRIBUTE_FILE))
    {
       document.myForm.modifiedBy.removeAttribute("disabled"); 
       condition = true;
    }
	if (condition == false)
    {
      var myContributeObj = findObject("Contribute");
	  myContributeObj.innerHTML = MM.MSG_contribute;
  }	
}  
   
   
//-------------------------------------------------------------------
// FUNCTION:
//   applyParams()
//
// DESCRIPTION: Applies or takes action.
//  Uses the preferences object to set and save the current settings.
//
// ARGUMENTS:
//   none
//
// RETURNS:
//   nothing
//--------------------------------------------------------------------
function applyParams() 
{
   // Get the current values from the UI and set the values.
   var bol = false;
   intNoofDays = document.myForm.numDays.value;
   if (document.myForm.optDaysModified[0].checked)
   {
      if (!validateInput())
        return;
   }
   var strFromMonth = FROM_MONTH_OBJ.get();
   var strToMonth = TO_MONTH_OBJ.get();
   var intFromDate = FROM_DAY_OBJ.get();
   var intToDate=TO_DAY_OBJ.get();
   var strFromYear = FROM_YEAR_OBJ.get();
   var strToYear =TO_YEAR_OBJ.get(); 
   var curDate =  new Date();
   var curMonth;
   var curDay;
   var curYear;   
   curDay = curDate.getDate();
   curYear = curDate.getFullYear();
   curMonth = curDate.getMonth() + 1;
    
   // This current date 
   strCurrentDt = new Date(curMonth + "/" + curDay + "/" + curYear);
     
   // This is To date	 
   if (dreamweaver.appVersion && ((dreamweaver.appVersion.indexOf('ja') != -1) || (dreamweaver.appVersion.indexOf('zh') != -1)))
		strToTotalDateBetween = strToYear + "/" + strToMonth + "/" + intToDate;
   else
	    strToTotalDateBetween = strToMonth + " " + intToDate + "," + " " + strToYear;
  
   // This is From date
   if (dreamweaver.appVersion && ((dreamweaver.appVersion.indexOf('ja') != -1) || (dreamweaver.appVersion.indexOf('zh') != -1)))
		strFromTotalDateBetween = strFromYear + "/" + strFromMonth + "/" + intFromDate ;
   else
		strFromTotalDateBetween = strFromMonth + " " + intFromDate + "," + " " + strFromYear;
   

   var fromDate = new Date();
   var toDate = new Date ();

   //From fields 
   fromDate.setDate(FROM_DAY_OBJ.getValue());
   fromDate.setMonth(FROM_MONTH_OBJ.getValue());
   fromDate.setYear(FROM_YEAR_OBJ.getValue());

   // This Total From date
   strFromTotalDate = fromDate.valueOf();
	
   //To fields 
   toDate.setDate(TO_DAY_OBJ.getValue());
   toDate.setMonth(TO_MONTH_OBJ.getValue());    
   toDate.setYear(TO_YEAR_OBJ.getValue());

   // This Total To date
   strToTotalDate = toDate.valueOf();
   
   PREF_OBJ.set(); 
   PREF_OBJ.save();
      
   //calling search local site function 
   
   searchLocalSite();
   site.setSelection(fileArray);  

   if (DAYS_MODIFIED_OBJ.getSelectedIndex() == 1)  
   {	 
     if (fileArray == '')
	 {   
 	   dw.runCommand(TEAM_ADMIN_DLG_DATES, strFromTotalDateBetween, strToTotalDateBetween, strModifiedBy, condition);
	 } 
	 else
	 {
	   window.close(); 
	 }
	 bol = MM.cmdArgument.pop(bol);
	 if(bol)
	   window.close();
	 	 		
   }
   else
   {	
     if (fileArray == '')
     {   
       dw.runCommand(TEAM_ADMIN_DLG_DAYS, intNoofDays, strModifiedBy, condition);
	 } 
	 else
	 {
	   window.close(); 
	 }
	 bol = MM.cmdArgument.pop(bol);
	 if(bol)
	   window.close(); 
     
	} //end if loop
	 //setting the focus to site -> local
	site.setFocus("local");
}// end init 


//-------------------------------------------------------------------
// FUNCTION:
//   canAcceptCommand()
//
// DESCRIPTION: Determines whether the menu item should be active or dimmed. 
//
// ARGUMENTS:
//   none
//
// RETURNS:
//   Boolean value that indicates whether the item should be enabled.
//--------------------------------------------------------------------
function canAcceptCommand()
{
    return (site.getCurrentSite() != '');
}


//-------------------------------------------------------------------
// FUNCTION:
//   searchLocalSite()
//
// DESCRIPTION: Search if the site is a Contribute site or not and if the Modified By: text box is null or not
//
// ARGUMENTS:
//   none
//
// RETURNS:
//   nothing
//--------------------------------------------------------------------
function searchLocalSite()
{
   searchFolder(localDir);
   strModifiedBy = document.myForm.modifiedBy.value;
}
 
 
//-------------------------------------------------------------------
// FUNCTION:
//   searchFolder()
//
// DESCRIPTION: Search if the folder is existing in the selected site.
//
// ARGUMENTS:
//   folder
//
// RETURNS:
//   nothing
//-------------------------------------------------------------------- 
function searchFolder(folder) {
   var separator = "";
   var listFiles = DWfile.listFolder(folder);

   for (var i = 0; i < listFiles.length; i++) {
       var tmpListItem = listFiles[i];

       if (folder != localDir) {
           separator = dwscripts.FILE_SEP;
       }

       var listItem = folder + separator + listFiles[i];

       // Ensure the item exists and has attributes before accessing it
       var attrs = DWfile.getAttributes(listItem);
       if (listItem && DWfile.exists(listItem) && attrs && attrs.indexOf('D') != -1) {
           // listItem is a folder
           if (!checkArray(ignoreFolders, tmpListItem)) {
               searchFolder(listItem);
           }
       } else {
           // listItem is a file
           searchFile(listItem);
       }
   }
}

//------------------------------------------------------------------- 
// FUNCTION:
//   hexToDec()
//
// DESCRIPTION: If pass hexadecimal, it will convert to seconds.
//   
//
// ARGUMENTS:
//   strVal
//
// RETURNS:
//   nothing
//--------------------------------------------------------------------
function hexToDec(strVal)
{
  return parseInt(strVal,16);
}

//-------------------------------------------------------------------
// FUNCTION:
//   checkModifiedByNotNull()
//
// DESCRIPTION: Finds the files satisfying the criteria with Modified By: field as not null and 
//   generates the result in the result window in a separate html file  
// ARGUMENTS:
//   none
//
// RETURNS:
//   nothing
//--------------------------------------------------------------------

function checkModifiedByNotNull()
{ 
   var strLastDate;

   var fromTotalDate;
   var toTotalDate;
   var fileDate;
   var noteHandle;
   var theKeys;  
   var theValue;
   var strFileDate = DWfile.getModificationDateObj(fileName);
   
   strLastDate = addDays(new Date(),intNoofDays-1);
   strLastDate = new Date(strLastDate.getFullYear(),strLastDate.getMonth(),strLastDate.getDate(),0,0,0,0);

   var intFileMonth = strFileDate.getMonth() + 1;
   var intFileDate = strFileDate.getDate();
   var intFileYear = strFileDate.getFullYear();
	  
   noteHandle = MMNotes.open(fileName);
   if (noteHandle > 0)
   {
     theKeys = MMNotes.getKeys(noteHandle);  

     for(var j=0; j< theKeys.length; j++)
     {
       if (theKeys[j] == 'ccLastSubmitter')
       {  
          theValue = MMNotes.get(noteHandle, theKeys[j]);
          strModifiedBy = theValue; 
       }
     } //end for loop
    } // end if	
   
   if (DAYS_MODIFIED_OBJ.getSelectedIndex() == 0)    
   {  
	   
      if ((strLastDate <= strFileDate) && (document.myForm.modifiedBy.value.toLowerCase()  == strModifiedBy.toLowerCase().match(document.myForm.modifiedBy.value, "i")))           
      {  
        fileArray.push(fileName);    
	    strModifiedBy = "";
      }  
    }  
    else
    {   
       if (strToTotalDate <= strFromTotalDate) 
       {
          fromTotalDate = strToTotalDate;
          toTotalDate = strFromTotalDate;
       }
       else
       {
          fromTotalDate = strFromTotalDate;
          toTotalDate = strToTotalDate;
       } 
   	  // add 1 day to include the toTotalDate date
	  toTotalDate = new Date(toTotalDate + (24*60*60*1000-1));   
	   
       if ((fromTotalDate <= strFileDate) && (strFileDate <= toTotalDate) && (document.myForm.modifiedBy.value.toLowerCase()  == strModifiedBy.toLowerCase().match(document.myForm.modifiedBy.value, "i")))
       {   
	      fileArray.push(fileName);
	      strModifiedBy = "";
       }  
    } // end if  
    //site.setSelection(fileArray) ;  
}  


//-------------------------------------------------------------------
// FUNCTION:
//   checkModifiedByNull()
//
// DESCRIPTION: Finds the files satisfying the criteria with Modified By: field as null  and 
//      generates the result in the result window in a separate html file 
//
// ARGUMENTS:
//   none
//
// RETURNS:
//   nothing
//--------------------------------------------------------------------
function checkModifiedByNull()
{
   var strLastDate;  
   var fromTotalDate;
   var toTotalDate;
   var fileDate; 
   var strFileDate = DWfile.getModificationDateObj(fileName);

   if (!strFileDate) {
       // Skip the current file if the date couldn't be retrieved
       return;
   }
   
   // Ensure the properties are accessible
   var intFileMonth = strFileDate.getMonth() + 1;
   var intFileDate = strFileDate.getDate();
   var intFileYear = strFileDate.getFullYear();

   strLastDate = addDays(new Date(),intNoofDays-1);
   strLastDate = new Date(strLastDate.getFullYear(),strLastDate.getMonth(),strLastDate.getDate(),0,0,0,0);
   var intFileMonth = strFileDate.getMonth() + 1;
   var intFileDate = strFileDate.getDate();
   var intFileYear = strFileDate.getFullYear();
   
   if (DAYS_MODIFIED_OBJ.getSelectedIndex() == 0)
   {    
      if ((strLastDate <= strFileDate))
      {    
         fileArray.push(fileName);  
	 	     strModifiedBy = "";
      } 
   }  //end if
   else 
   { 
       if (strToTotalDate <= strFromTotalDate) 
       {
	  fromTotalDate = strToTotalDate;
          toTotalDate = strFromTotalDate;
       }
       else
       {
          fromTotalDate = strFromTotalDate;
          toTotalDate = strToTotalDate;
       }  
  	  // add 1 day to include the toTotalDate date
	  toTotalDate = new Date(toTotalDate + (24*60*60*1000-1));   
       if ((fromTotalDate <= strFileDate) && (strFileDate <= toTotalDate))          
       {	 
          fileArray.push(fileName);
	      strModifiedBy = "";
       } 
   } //else if  
   //site.setSelection(fileArray) ;   
} 

I got an error posting this message and do not know what was changed. Beware.
Your post has been changed because invalid HTML was found in the message body. The invalid HTML has been removed. Please review the message and submit the message when you are satisfied.

 

2 replies

Nancy OShea
Community Expert
Community Expert
June 4, 2025

Right-click on Local File Panel, display date Modified.

 

Click on Modified label to sort by date (Ascending ↑ or Descending ↓)

 

In this example, recently modified files are on top. 

 

Hope that helps.

 

 

Nancy O'Shea— Product User & Community Expert
seethingsAuthor
Inspiring
June 3, 2025

Note that a Dreamweaver restart is necessary for it to work, likely due to cached files.