@@ -130,6 +130,48 @@ public static function createNewFolderMenuItemNameInput($fileListAncestor) {
130130 describedAs ("Name input in create new folder menu item in file list " );
131131 }
132132
133+ /**
134+ * @return Locator
135+ */
136+ public static function fileListHeader ($ fileListAncestor ) {
137+ return Locator::forThe ()->css ("thead " )->
138+ descendantOf ($ fileListAncestor )->
139+ describedAs ("Header in file list " );
140+ }
141+
142+ /**
143+ * @return Locator
144+ */
145+ public static function selectedFilesActionsMenuButton ($ fileListAncestor ) {
146+ return Locator::forThe ()->css (".actions-selected " )->
147+ descendantOf (self ::fileListHeader ($ fileListAncestor ))->
148+ describedAs ("Selected files actions menu button in file list " );
149+ }
150+
151+ /**
152+ * @return Locator
153+ */
154+ public static function selectedFilesActionsMenu () {
155+ return Locator::forThe ()->css (".filesSelectMenu " )->
156+ describedAs ("Selected files actions menu in file list " );
157+ }
158+
159+ /**
160+ * @return Locator
161+ */
162+ private static function selectedFilesActionsMenuItemFor ($ itemText ) {
163+ return Locator::forThe ()->xpath ("//a[normalize-space() = ' $ itemText'] " )->
164+ descendantOf (self ::selectedFilesActionsMenu ())->
165+ describedAs ($ itemText . " item in selected files actions menu in file list " );
166+ }
167+
168+ /**
169+ * @return Locator
170+ */
171+ public static function moveOrCopySelectedFilesMenuItem () {
172+ return self ::selectedFilesActionsMenuItemFor ("Move or copy " );
173+ }
174+
133175 /**
134176 * @return Locator
135177 */
@@ -148,6 +190,26 @@ public static function rowForFilePreceding($fileListAncestor, $fileName1, $fileN
148190 describedAs ("Row for file $ fileName1 preceding $ fileName2 in file list " );
149191 }
150192
193+ /**
194+ * @return Locator
195+ */
196+ public static function selectionCheckboxForFile ($ fileListAncestor , $ fileName ) {
197+ // Note that the element that the user interacts with is the label, not
198+ // the checbox itself.
199+ return Locator::forThe ()->css (".selection label " )->
200+ descendantOf (self ::rowForFile ($ fileListAncestor , $ fileName ))->
201+ describedAs ("Selection checkbox for file $ fileName in file list " );
202+ }
203+
204+ /**
205+ * @return Locator
206+ */
207+ public static function selectionCheckboxInputForFile ($ fileListAncestor , $ fileName ) {
208+ return Locator::forThe ()->css (".selection input[type=checkbox] " )->
209+ descendantOf (self ::rowForFile ($ fileListAncestor , $ fileName ))->
210+ describedAs ("Selection checkbox input for file $ fileName in file list " );
211+ }
212+
151213 /**
152214 * @return Locator
153215 */
@@ -265,6 +327,13 @@ public static function renameMenuItem() {
265327 return self ::fileActionsMenuItemFor ("Rename " );
266328 }
267329
330+ /**
331+ * @return Locator
332+ */
333+ public static function moveOrCopyMenuItem () {
334+ return self ::fileActionsMenuItemFor ("Move or copy " );
335+ }
336+
268337 /**
269338 * @return Locator
270339 */
@@ -296,6 +365,24 @@ public function iEnterInTheFolderNamed($folderName) {
296365 $ this ->actor ->find (self ::mainLinkForFile ($ this ->fileListAncestor , $ folderName ), 10 )->click ();
297366 }
298367
368+ /**
369+ * @Given I select :fileName
370+ */
371+ public function iSelect ($ fileName ) {
372+ $ this ->iSeeThatIsNotSelected ($ fileName );
373+
374+ $ this ->actor ->find (self ::selectionCheckboxForFile ($ this ->fileListAncestor , $ fileName ), 10 )->click ();
375+ }
376+
377+ /**
378+ * @Given I start the move or copy operation for the selected files
379+ */
380+ public function iStartTheMoveOrCopyOperationForTheSelectedFiles () {
381+ $ this ->actor ->find (self ::selectedFilesActionsMenuButton ($ this ->fileListAncestor ), 10 )->click ();
382+
383+ $ this ->actor ->find (self ::moveOrCopySelectedFilesMenuItem (), 2 )->click ();
384+ }
385+
299386 /**
300387 * @Given I open the details view for :fileName
301388 */
@@ -325,6 +412,15 @@ public function iRenameTo($fileName1, $fileName2) {
325412 $ this ->actor ->find (self ::renameInputForFile ($ this ->fileListAncestor , $ fileName1 ), 10 )->setValue ($ fileName2 . "\r" );
326413 }
327414
415+ /**
416+ * @Given I start the move or copy operation for :fileName
417+ */
418+ public function iStartTheMoveOrCopyOperationFor ($ fileName ) {
419+ $ this ->actor ->find (self ::fileActionsMenuButtonForFile ($ this ->fileListAncestor , $ fileName ), 10 )->click ();
420+
421+ $ this ->actor ->find (self ::moveOrCopyMenuItem (), 2 )->click ();
422+ }
423+
328424 /**
329425 * @Given I mark :fileName as favorite
330426 */
@@ -410,13 +506,32 @@ public function iSeeThatTheFileListContainsAFileNamed($fileName) {
410506 PHPUnit_Framework_Assert::assertNotNull ($ this ->actor ->find (self ::rowForFile ($ this ->fileListAncestor , $ fileName ), 10 ));
411507 }
412508
509+ /**
510+ * @Then I see that the file list does not contain a file named :fileName
511+ */
512+ public function iSeeThatTheFileListDoesNotContainAFileNamed ($ fileName ) {
513+ if (!WaitFor::elementToBeEventuallyNotShown (
514+ $ this ->actor ,
515+ self ::rowForFile ($ this ->fileListAncestor , $ fileName ),
516+ $ timeout = 10 * $ this ->actor ->getFindTimeoutMultiplier ())) {
517+ PHPUnit_Framework_Assert::fail ("The file list still contains a file named $ fileName after $ timeout seconds " );
518+ }
519+ }
520+
413521 /**
414522 * @Then I see that :fileName1 precedes :fileName2 in the file list
415523 */
416524 public function iSeeThatPrecedesInTheFileList ($ fileName1 , $ fileName2 ) {
417525 PHPUnit_Framework_Assert::assertNotNull ($ this ->actor ->find (self ::rowForFilePreceding ($ this ->fileListAncestor , $ fileName1 , $ fileName2 ), 10 ));
418526 }
419527
528+ /**
529+ * @Then I see that :fileName is not selected
530+ */
531+ public function iSeeThatIsNotSelected ($ fileName ) {
532+ PHPUnit_Framework_Assert::assertFalse ($ this ->actor ->find (self ::selectionCheckboxInputForFile ($ this ->fileListAncestor , $ fileName ), 10 )->isChecked ());
533+ }
534+
420535 /**
421536 * @Then I see that :fileName is marked as favorite
422537 */
0 commit comments