function TrashController()

in public/explorer.js [1257:1420]


function TrashController($scope, SharedService) {
  DEBUG.log('TrashController init');
  window.trashScope = $scope; // for debugging
  $scope.trash = { title: null, button: null, objects: [] };

  // Cache jquery selectors
  const $btnDelete = $('#trash-btn-delete');
  const $btnCancel = $('#trash-btn-cancel');

  //
  // Delete a list of objects from the provided S3 bucket
  //
  $scope.deleteFiles = (Bucket, objects, recursion) => {
      DEBUG.log('Delete files:', objects);

      $scope.$apply(() => {
          $scope.trash.trashing = true;
      });

      for (let ii = 0; ii < objects.length; ii++) {
          DEBUG.log('Delete key:', objects[ii].Key);
          DEBUG.log('Object:', objects[ii]);
          DEBUG.log('Index:', ii);

          const s3 = new AWS.S3(AWS.config);

          // If the user is deleting a folder then recursively list
          // objects and delete them
          if (isfolder(objects[ii].Key) && SharedService.getSettings().delimiter) {
              const params = { Bucket, Prefix: objects[ii].Key };
              s3.listObjects(params, (err, data) => {
                  if (err) {
                      if (!recursion) {
                          // AccessDenied is a normal consequence of lack of permission
                          // and we do not treat this as completely unexpected
                          if (err.code === 'AccessDenied') {
                              $(`#trash-td-${ii}`).html('<span class="trasherror">Access Denied</span>');
                          } else {
                              DEBUG.log(JSON.stringify(err));
                              $(`#trash-td-${ii}`).html(`<span class="trasherror">Failed:&nbsp${err.code}</span>`);
                              SharedService.showError(params, err);
                          }
                      } else {
                          DEBUG.log(JSON.stringify(err));
                          SharedService.showError(params, err);
                      }
                  } else if (data.Contents.length > 0) {
                      $scope.deleteFiles(Bucket, data.Contents, true);
                  }
              });
          }

          const params = { Bucket, Key: objects[ii].Key };

          DEBUG.log('Delete params:', params);
          s3.deleteObject(params, (err, _data) => {
              if (err) {
                  if (!recursion) {
                      // AccessDenied is a normal consequence of lack of permission
                      // and we do not treat this as completely unexpected
                      if (err.code === 'AccessDenied') {
                          $(`#trash-td-${ii}`).html('<span class="trasherror">Access Denied</span>');
                      } else {
                          DEBUG.log(JSON.stringify(err));
                          $(`#trash-td-${ii}`).html(`<span class="trasherror">Failed:&nbsp${err.code}</span>`);
                          SharedService.showError(params, err);
                      }
                  } else {
                      DEBUG.log(JSON.stringify(err));
                      SharedService.showError(params, err);
                  }
              } else {
                  DEBUG.log('Deleted', objects[ii].Key, 'from', Bucket);
                  let count = $btnDelete.attr('data-filecount');

                  if (!recursion) {
                      $(`#trash-td-${ii}`).html('<span class="trashdeleted">Deleted</span>');
                      $btnDelete.attr('data-filecount', --count);
                  }

                  // Update count in Delete button
                  $scope.$apply(() => {
                      $scope.trash.button = `Delete (${count})`;
                  });

                  // If all files deleted then update buttons
                  if (count === 0) {
                      $btnDelete.hide();
                      $btnCancel.text('Close');
                  }

                  // Refresh underlying folder view
                  SharedService.viewRefresh();
              }
          });
      }
  };

  $scope.$on('broadcastTrashObjects', (e, args) => {
      DEBUG.log('TrashController', 'broadcast trash objects', args);

      $scope.trash.objects = [];

      // Populate scope trash object array with objects to be deleted
      for (let ii = 0; ii < args.keys.length; ii++) {
          const obj = args.keys[ii];
          DEBUG.log('Object to be deleted:', obj);

          const object = path2short(isfolder(obj.Key)
              ? prefix2folder(obj.Key)
              : fullpath2filename(obj.Key));

          const folder = path2short(isfolder(obj.Key)
              ? prefix2parentfolder(obj.Key)
              : fullpath2pathname(obj.Key));

          const lastmodified = isfolder(obj.Key)
              ? ''
              : moment(obj.LastModified).fromNow();

          const timestamp = obj.LastModified
              ? moment(obj.LastModified).local().format('YYYY-MM-DD HH:mm:ss')
              : '';

          const objectclass = isfolder(obj.Key)
              ? ''
              : mapStorage[obj.StorageClass];

          const size = isfolder(obj.Key)
              ? ''
              : bytesToSize(obj.Size);

          $scope.trash.objects.push({
              object,
              folder,
              lastmodified,
              timestamp,
              objectclass,
              size,
          });
      }

      // Remove any prior click handler from Delete button
      $btnDelete.unbind('click');

      // Add new click handler for Delete button
      $btnDelete.click((e2) => {
          e2.preventDefault();
          $scope.deleteFiles(args.bucket, args.keys);
      });

      // Reset buttons for initial use
      $btnDelete.show();
      $btnCancel.text('Cancel');

      // Bind file count into button
      $btnDelete.attr('data-filecount', args.keys.length);
      $scope.trash.count = args.keys.length;
      $scope.trash.button = `Delete (${args.keys.length})`;
      $scope.trash.trashing = false;

      $('#TrashModal').modal({ keyboard: true, backdrop: 'static' });
  });
}