public function getCMSFields()
 {
     //scaffold cms fields without calling 'updateCMSFields'
     $fields = $this->scaffoldFormFields(array('includeRelations' => $this->ID > 0, 'tabbed' => true, 'ajaxSafe' => true));
     if ($grid = $fields->fieldByName("Root.ProductSelections.ProductSelections")) {
         //move field to main tab
         $fields->removeByName("ProductSelections");
         $fields->addFieldToTab("Root.Main", $grid);
         $grid->setConfig($conf = new GridFieldConfig_RecordEditor());
         $conf->removeComponentsByType("GridFieldDataColumns")->removeComponentsByType("GridFieldDataColumns")->removeComponentsByType("GridFieldFilterHeader")->removeComponentsByType("GridFieldPaginator")->removeComponentsByType("GridFieldPageCount")->addComponent(new GridFieldOrderableRows())->addComponent(new GridFieldEditableColumns());
         $summaryfields = MenuProductSelection::config()->summary_fields;
         unset($summaryfields['Group']);
         //add editable group column to grid
         $groups = $this->Groups();
         if ($groups->exists()) {
             $dropdown = DropdownField::create("GroupID", 'Grouping', $groups->map('ID', 'Title')->toArray())->setHasEmptyDefault(true);
             $summaryfields['GroupID'] = array('title' => 'Group', 'callback' => function ($record, $column, $grid) use($dropdown) {
                 return $dropdown;
             });
             $conf->getComponentByType('GridFieldDetailForm')->setItemEditFormCallback(function ($form, $component) use($dropdown) {
                 $fields = $form->Fields();
                 if (!$fields->fieldByName("GroupID")) {
                     $fields->push($dropdown);
                 }
             });
         }
         $conf->getComponentByType('GridFieldEditableColumns')->setDisplayFields($summaryfields);
         //re-add edit/delete row actions so they are in the correct order
         $conf->removeComponentsByType("GridFieldEditButton")->removeComponentsByType("GridFieldDeleteAction")->addComponent(new GridFieldEditButton())->addComponent(new GridFieldDeleteAction())->addComponent($importer = new GridFieldImporter('before'));
         $loader = $importer->getLoader($grid);
         $self = $this;
         $loader->mappableFields = array('Product.InternalItemID' => 'SKU / Product Identifier', 'Group.Title' => 'Group');
         $loader->transforms = array("Product.InternalItemID" => array("create" => false, "link" => true, "required" => true), "Group.Title" => array('list' => $this->Groups()));
         $loader->duplicateChecks = array("Product.InternalItemID" => "Product.InternalItemID");
     }
     if ($grid = $fields->fieldByName("Root.Groups.Groups")) {
         $conf = $grid->getConfig()->removeComponentsByType("GridFieldAddExistingAutocompleter")->removeComponentsByType('GridFieldDataColumns')->removeComponentsByType('GridFieldAddNewButton')->removeComponentsByType("GridFieldFilterHeader")->removeComponentsByType("GridFieldPaginator")->removeComponentsByType("GridFieldPageCount")->addComponent($newbutton = new GridFieldAddNewInlineButton())->addComponent(new GridFieldEditableColumns())->addComponent(new GridFieldOrderableRows());
         $newbutton->setTitle("Add Menu Grouping");
         $conf->getComponentByType('GridFieldEditableColumns')->setDisplayFields(array('Title' => function ($record, $column, $grid) {
             return new TextField($column, 'Title');
         }));
         //re-add edit/delete row actions so they are in the correct order
         $conf->removeComponentsByType("GridFieldEditButton")->removeComponentsByType("GridFieldDeleteAction")->addComponent(new GridFieldDeleteAction());
     }
     $this->extend('updateCMSFields', $fields);
     return $fields;
 }
 /**
  * Do the import using the configured importer.
  * @param  string $filepath
  * @param  array|null $colmap
  * @return BulkLoader_Result
  */
 public function importFile($filepath, $colmap = null, $hasheader = true, $cleardata = false)
 {
     $loader = $this->component->getLoader($this->gridField);
     $loader->deleteExistingRecords = $cleardata;
     //set or merge in given col map
     if (is_array($colmap)) {
         $loader->columnMap = $loader->columnMap ? array_merge($loader->columnMap, $colmap) : $colmap;
     }
     $loader->getSource()->setFilePath($filepath)->setHasHeader($hasheader);
     return $loader->load();
 }