From 9f9dc2533843aa8ada412471b5ef56b68b1b9364 Mon Sep 17 00:00:00 2001 From: Julian Seidenberg Date: Thu, 29 Mar 2012 13:34:55 +1300 Subject: [PATCH 01/56] ENHANCEMENT: SSF-38 initial rearranging of the insert image form to allow uploads as well as choosing an image from the CMS (and you can pick and choose from both) --- forms/HtmlEditorField.php | 60 +++++++++++++++++++++++++---------- javascript/HtmlEditorField.js | 24 ++++++++++++++ 2 files changed, 67 insertions(+), 17 deletions(-) diff --git a/forms/HtmlEditorField.php b/forms/HtmlEditorField.php index 3e688306c..fd83ae805 100644 --- a/forms/HtmlEditorField.php +++ b/forms/HtmlEditorField.php @@ -369,26 +369,54 @@ class HtmlEditorField_Toolbar extends RequestHandler { )); $numericLabelTmpl = '%d%s'; - $fields = new FieldList( - new LiteralField( - 'Heading', - sprintf('

%s

', _t('HtmlEditorField.IMAGE', 'Image')) - ), - - $contentComposite = new CompositeField( - new LiteralField('headerSelect', '

' . sprintf($numericLabelTmpl, '1', _t('HtmlEditorField.Find', 'Find')) . '

'), + + $fromCMS = new CompositeField( + new LiteralField('headerSelect', '

' . sprintf($numericLabelTmpl, '1', _t('HtmlEditorField.Find', 'Find')) . '

'), $selectComposite = new CompositeField( new TreeDropdownField('ParentID', _t('HtmlEditorField.FOLDER', 'Folder'), 'Folder'), $fileField - ), - - new LiteralField('headerEdit', '

' . sprintf($numericLabelTmpl, '2', _t('HtmlEditorField.EditDetails', 'Edit details')) . '

'), - $editComposite = new CompositeField( - new LiteralField('contentEdit', '
') ) - + ); + + $fromCMS->addExtraClass('content'); + $selectComposite->addExtraClass('content-select'); + + Requirements::css(SAPPHIRE_DIR . '/css/AssetUploadField.css'); + $computerUploadField = Object::create('UploadField', 'AssetUploadField', ''); + $computerUploadField->setConfig('previewMaxWidth', 40); + $computerUploadField->setConfig('previewMaxHeight', 30); + $computerUploadField->addExtraClass('ss-assetuploadfield'); + $computerUploadField->removeExtraClass('ss-uploadfield'); + $computerUploadField->setTemplate('AssetUploadField'); + $computerUploadField->setFolderName(Upload::$uploads_folder); + + $tabSet = new TabSet( + "MediaFormInsertImageTabs", + new Tab( + 'From your computer', + $computerUploadField + ), + new Tab( + 'From the CMS', + $fromCMS ) ); + + $allFields = new CompositeField( + $tabSet, + new LiteralField('headerEdit', '

' . sprintf($numericLabelTmpl, '2', _t('HtmlEditorField.EditDetails', 'Edit details')) . '

'), + $editComposite = new CompositeField( + new LiteralField('contentEdit', '
') + ) + ); + + $fields = new FieldList( + new LiteralField( + 'Heading', + sprintf('

%s

', _t('HtmlEditorField.IMAGE', 'Insert Image')) + ), + $allFields + ); $actions = new FieldList( FormAction::create('insertimage', _t('HtmlEditorField.BUTTONINSERT', 'Insert')) @@ -404,9 +432,7 @@ class HtmlEditorField_Toolbar extends RequestHandler { $actions ); - $contentComposite->addExtraClass('content'); - $selectComposite->addExtraClass('content-select'); - + $form->unsetValidator(); $form->disableSecurityToken(); $form->loadDataFrom($this); diff --git a/javascript/HtmlEditorField.js b/javascript/HtmlEditorField.js index 16b3bd770..5a2074bbc 100644 --- a/javascript/HtmlEditorField.js +++ b/javascript/HtmlEditorField.js @@ -696,6 +696,30 @@ ss.editorWrappers['default'] = ss.editorWrappers.tinyMCE; } }); + /** + * Show the second step after uploading an image + */ + $('.ss-assetuploadfield').entwine({ + onmatch: function() { + this._super(); + + // Always hide the "second step" part, we don't need it here + this.find('.ss-uploadfield-editandorganize').hide(); + + }, + onfileuploadstop: function(e) { + //get the uploaded file ID when this event triggers, signaling the upload has compeleted successfully + //always use the last one uploaded + var uploadedFileID = $('ul.ss-uploadfield-files').children('li.ss-uploadfield-item').last().data('fileid'); + + //trigger the detail view for filling out details about the file we are about to insert into TinyMCE + var form = this.closest('form'); + form.closest('form').showFileView(uploadedFileID); + form.redraw(); + } + + }); + /** * Represents a single selected file, together with a set of form fields to edit its properties. * Overload this based on the media type to determine how the HTML should be created. From 94e21d18e159222188d5b057ab4a1221f36b4068 Mon Sep 17 00:00:00 2001 From: Julian Seidenberg Date: Thu, 29 Mar 2012 15:09:20 +1300 Subject: [PATCH 02/56] MINOR: SSF-38 i18n of some of the form --- forms/HtmlEditorField.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forms/HtmlEditorField.php b/forms/HtmlEditorField.php index fd83ae805..80b328b9b 100644 --- a/forms/HtmlEditorField.php +++ b/forms/HtmlEditorField.php @@ -393,11 +393,11 @@ class HtmlEditorField_Toolbar extends RequestHandler { $tabSet = new TabSet( "MediaFormInsertImageTabs", new Tab( - 'From your computer', + _t('HtmlEditorField.FROMCOMPUTER','From your computer'), $computerUploadField ), new Tab( - 'From the CMS', + _t('HtmlEditorField.FROMCMS','From the CMS'), $fromCMS ) ); From ca83d845e19c8506153f39e95f9fd6276060d0fc Mon Sep 17 00:00:00 2001 From: Julian Seidenberg Date: Thu, 29 Mar 2012 16:55:51 +1300 Subject: [PATCH 03/56] ENHANCEMENT: SSF-38 added new template for the upload field that is used within a page image insertion dialog box. This upload field is slightly different from the one used in Files. E.g. it uses smaller fonts (h4 instead of h3) --- forms/HtmlEditorField.php | 2 +- templates/PageUploadField.ss | 38 ++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 templates/PageUploadField.ss diff --git a/forms/HtmlEditorField.php b/forms/HtmlEditorField.php index 80b328b9b..d982217fd 100644 --- a/forms/HtmlEditorField.php +++ b/forms/HtmlEditorField.php @@ -387,7 +387,7 @@ class HtmlEditorField_Toolbar extends RequestHandler { $computerUploadField->setConfig('previewMaxHeight', 30); $computerUploadField->addExtraClass('ss-assetuploadfield'); $computerUploadField->removeExtraClass('ss-uploadfield'); - $computerUploadField->setTemplate('AssetUploadField'); + $computerUploadField->setTemplate('PageUploadField'); $computerUploadField->setFolderName(Upload::$uploads_folder); $tabSet = new TabSet( diff --git a/templates/PageUploadField.ss b/templates/PageUploadField.ss new file mode 100644 index 000000000..f8e35a5a8 --- /dev/null +++ b/templates/PageUploadField.ss @@ -0,0 +1,38 @@ +
+ +

+ + 1 + <% _t('AssetUploadField.ChooseFiles', 'Choose files') %> + +

+ +
+ + +
+
+
+ <% _t('AssetUploadField.UPLOADOR', 'OR') %> +
+
+
+ <% _t('AssetUploadField.DROPAREA', 'Drop Area') %> + <% _t('AssetUploadField.DRAGFILESHERE', 'Drag files here') %> +
+
+
+
+ +
+

+ + 2 + <% _t('AssetUploadField.EDITANDORGANIZE', 'Edit & organize') %> + +

+
    +
    \ No newline at end of file From e67a777b4827bbe344e84fd28a100fd2f784ade0 Mon Sep 17 00:00:00 2001 From: Julian Seidenberg Date: Thu, 29 Mar 2012 17:27:12 +1300 Subject: [PATCH 04/56] MINOR: SSF-38 adding class for delete button on template --- templates/Includes/HtmlEditorField_viewfile.ss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/Includes/HtmlEditorField_viewfile.ss b/templates/Includes/HtmlEditorField_viewfile.ss index 988f18e3b..3a45c5b9f 100644 --- a/templates/Includes/HtmlEditorField_viewfile.ss +++ b/templates/Includes/HtmlEditorField_viewfile.ss @@ -2,7 +2,7 @@
    From 29d7a9a6797de5460be9e27c951ba60bd21b298a Mon Sep 17 00:00:00 2001 From: Julian Seidenberg Date: Thu, 29 Mar 2012 17:34:22 +1300 Subject: [PATCH 05/56] MINOR: SSF-38 adding some additional classes to delete button --- templates/Includes/HtmlEditorField_viewfile.ss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/Includes/HtmlEditorField_viewfile.ss b/templates/Includes/HtmlEditorField_viewfile.ss index 3a45c5b9f..5d013a770 100644 --- a/templates/Includes/HtmlEditorField_viewfile.ss +++ b/templates/Includes/HtmlEditorField_viewfile.ss @@ -2,7 +2,7 @@
    From 196ec032a0be67b1cc94a1d22aee65e2dda21ae9 Mon Sep 17 00:00:00 2001 From: Julian Seidenberg Date: Fri, 30 Mar 2012 11:10:16 +1300 Subject: [PATCH 06/56] MINOR: changing template to make delete icon appear in the list of uploaded files --- templates/Includes/HtmlEditorField_viewfile.ss | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/templates/Includes/HtmlEditorField_viewfile.ss b/templates/Includes/HtmlEditorField_viewfile.ss index 5d013a770..ded2dbc83 100644 --- a/templates/Includes/HtmlEditorField_viewfile.ss +++ b/templates/Includes/HtmlEditorField_viewfile.ss @@ -2,7 +2,9 @@
    From 98e197aff954e7ecb0cc3fb6effda821e78ebdae Mon Sep 17 00:00:00 2001 From: Julian Seidenberg Date: Fri, 30 Mar 2012 13:44:39 +1300 Subject: [PATCH 07/56] MINOR: SSF-38 renaming the PageUploadField template to HtmlEditorField_UploadField --- forms/HtmlEditorField.php | 2 +- .../{PageUploadField.ss => HtmlEditorField_UploadField.ss} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename templates/{PageUploadField.ss => HtmlEditorField_UploadField.ss} (100%) diff --git a/forms/HtmlEditorField.php b/forms/HtmlEditorField.php index d982217fd..ddb18236b 100644 --- a/forms/HtmlEditorField.php +++ b/forms/HtmlEditorField.php @@ -387,7 +387,7 @@ class HtmlEditorField_Toolbar extends RequestHandler { $computerUploadField->setConfig('previewMaxHeight', 30); $computerUploadField->addExtraClass('ss-assetuploadfield'); $computerUploadField->removeExtraClass('ss-uploadfield'); - $computerUploadField->setTemplate('PageUploadField'); + $computerUploadField->setTemplate('HtmlEditorField_UploadField'); $computerUploadField->setFolderName(Upload::$uploads_folder); $tabSet = new TabSet( diff --git a/templates/PageUploadField.ss b/templates/HtmlEditorField_UploadField.ss similarity index 100% rename from templates/PageUploadField.ss rename to templates/HtmlEditorField_UploadField.ss From 21109067152bda636d4217d565222c989e6a1350 Mon Sep 17 00:00:00 2001 From: Julian Seidenberg Date: Fri, 30 Mar 2012 13:45:53 +1300 Subject: [PATCH 08/56] BUGFIX: SSF-38 making the entwine selector for the upload field more specific, so it doesn't apply to every upload field in the CMS. Also, handling the case of uploading multiple files at once --- javascript/HtmlEditorField.js | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/javascript/HtmlEditorField.js b/javascript/HtmlEditorField.js index 5a2074bbc..56ef967e6 100644 --- a/javascript/HtmlEditorField.js +++ b/javascript/HtmlEditorField.js @@ -699,7 +699,7 @@ ss.editorWrappers['default'] = ss.editorWrappers.tinyMCE; /** * Show the second step after uploading an image */ - $('.ss-assetuploadfield').entwine({ + $('form.htmleditorfield-form.htmleditorfield-mediaform div.ss-assetuploadfield').entwine({ onmatch: function() { this._super(); @@ -708,13 +708,23 @@ ss.editorWrappers['default'] = ss.editorWrappers.tinyMCE; }, onfileuploadstop: function(e) { - //get the uploaded file ID when this event triggers, signaling the upload has compeleted successfully - //always use the last one uploaded - var uploadedFileID = $('ul.ss-uploadfield-files').children('li.ss-uploadfield-item').last().data('fileid'); - - //trigger the detail view for filling out details about the file we are about to insert into TinyMCE var form = this.closest('form'); - form.closest('form').showFileView(uploadedFileID); + + //update the editFields to show those Files that are newly uploaded + var editFieldIDs = []; + form.find('div.content-edit').find('div.ss-htmleditorfield-file').each(function(){ + //get the uploaded file ID when this event triggers, signaling the upload has compeleted successfully + editFieldIDs.push($(this).data('id')); + }); + var uploadedFiles = $('ul.ss-uploadfield-files').children('li.ss-uploadfield-item'); + uploadedFiles.each(function(){ + var uploadedID = $(this).data('fileid'); + if ($.inArray(uploadedID, editFieldIDs) == -1) { + //trigger the detail view for filling out details about the file we are about to insert into TinyMCE + form.showFileView(uploadedID); + } + }); + form.redraw(); } From c0fd9bf97c8bca03479c37ad6d8d29d53add0dbc Mon Sep 17 00:00:00 2001 From: Jeremy Bridson Date: Fri, 30 Mar 2012 14:33:20 +1300 Subject: [PATCH 09/56] ENHANCEMENT:SSF-38 - Styled in-content file upload dialog box. Also added fixes for cms-content-header box-shadow. --- admin/css/screen.css | 117 +++++++++-------- admin/images/btn-icon-s41050dc384.png | Bin 0 -> 17788 bytes admin/scss/_style.scss | 178 +++++++++++++++++--------- css/AssetUploadField.css | 4 +- scss/AssetUploadField.scss | 2 + 5 files changed, 186 insertions(+), 115 deletions(-) create mode 100644 admin/images/btn-icon-s41050dc384.png diff --git a/admin/css/screen.css b/admin/css/screen.css index 613a35646..22abbb05f 100644 --- a/admin/css/screen.css +++ b/admin/css/screen.css @@ -35,49 +35,49 @@ If more variables exist in the future, consider creating a variables file.*/ /** ---------------------------------------------------- Double tone borders http://daverupert.com/2011/06/two-tone-borders-with-css3/ ----------------------------------------------------- */ /** ----------------------------- Sprite images ----------------------------- */ /** Helper SCSS file for generating sprites for the interface. */ -.btn-icon-sprite, .ui-state-default .btn-icon-accept, .ui-state-default .btn-icon-accept_disabled, .ui-state-default .btn-icon-add, .ui-state-default .btn-icon-add_disabled, .ui-state-default .btn-icon-addpage, .ui-state-default .btn-icon-addpage_disabled, .ui-state-default .btn-icon-arrow-circle-135-left, .ui-state-default .btn-icon-back, .ui-state-default .btn-icon-back_disabled, .ui-state-default .btn-icon-chain--arrow, .ui-state-default .btn-icon-chain--exclamation, .ui-state-default .btn-icon-chain--minus, .ui-state-default .btn-icon-chain--pencil, .ui-state-default .btn-icon-chain--plus, .ui-state-default .btn-icon-chain-small, .ui-state-default .btn-icon-chain-unchain, .ui-state-default .btn-icon-chain, .ui-state-default .btn-icon-cross-circle, .ui-state-default .btn-icon-cross-circle_disabled, .ui-state-default .btn-icon-decline, .ui-state-default .btn-icon-decline_disabled, .ui-state-default .btn-icon-download-csv, .ui-state-default .btn-icon-drive-upload, .ui-state-default .btn-icon-drive-upload_disabled, .ui-state-default .btn-icon-magnifier, .ui-state-default .btn-icon-minus-circle, .ui-state-default .btn-icon-minus-circle_disabled, .ui-state-default .btn-icon-navigation, .ui-state-default .btn-icon-navigation_disabled, .ui-state-default .btn-icon-network-cloud, .ui-state-default .btn-icon-network-cloud_disabled, .ui-state-default .btn-icon-pencil, .ui-state-default .btn-icon-pencil_disabled, .ui-state-default .btn-icon-plug-disconnect-prohibition, .ui-state-default .btn-icon-plug-disconnect-prohibition_disabled, .ui-state-default .btn-icon-preview, .ui-state-default .btn-icon-preview_disabled, .ui-state-default .btn-icon-settings, .ui-state-default .btn-icon-settings_disabled, .ui-state-default .btn-icon-unpublish, .ui-state-default .btn-icon-unpublish_disabled { background: url('../images/btn-icon-sc495ceeeca.png') no-repeat; } +.btn-icon-sprite, .ui-state-default .btn-icon-accept, .ui-state-default .btn-icon-accept_disabled, .ui-state-default .btn-icon-add, .ui-state-default .btn-icon-add_disabled, .ui-state-default .btn-icon-addpage, .ui-state-default .btn-icon-addpage_disabled, .ui-state-default .btn-icon-arrow-circle-135-left, .ui-state-default .btn-icon-back, .ui-state-default .btn-icon-back_disabled, .ui-state-default .btn-icon-chain--arrow, .ui-state-default .btn-icon-chain--exclamation, .ui-state-default .btn-icon-chain--minus, .ui-state-default .btn-icon-chain--pencil, .ui-state-default .btn-icon-chain--plus, .ui-state-default .btn-icon-chain-small, .ui-state-default .btn-icon-chain-unchain, .ui-state-default .btn-icon-chain, .ui-state-default .btn-icon-cross-circle, .ui-state-default .btn-icon-cross-circle_disabled, .ui-state-default .btn-icon-decline, .ui-state-default .btn-icon-decline_disabled, .ui-state-default .btn-icon-download-csv, .ui-state-default .btn-icon-drive-upload, .ui-state-default .btn-icon-drive-upload_disabled, .ui-state-default .btn-icon-magnifier, .ui-state-default .btn-icon-minus-circle, .ui-state-default .btn-icon-minus-circle_disabled, .ui-state-default .btn-icon-navigation, .ui-state-default .btn-icon-navigation_disabled, .ui-state-default .btn-icon-network-cloud, .ui-state-default .btn-icon-network-cloud_disabled, .ui-state-default .btn-icon-pencil, .ui-state-default .btn-icon-pencil_disabled, .ui-state-default .btn-icon-plug-disconnect-prohibition, .ui-state-default .btn-icon-plug-disconnect-prohibition_disabled, .ui-state-default .btn-icon-preview, .ui-state-default .btn-icon-preview_disabled, .ui-state-default .btn-icon-settings, .ui-state-default .btn-icon-settings_disabled, .ui-state-default .btn-icon-unpublish, .ui-state-default .btn-icon-unpublish_disabled { background: url('../images/btn-icon-s41050dc384.png') no-repeat; } .ui-state-default .btn-icon-accept { background-position: 0 0; } .ui-state-default .btn-icon-accept_disabled { background-position: 0 -17px; } .ui-state-default .btn-icon-add { background-position: 0 -34px; } .ui-state-default .btn-icon-add_disabled { background-position: 0 -52px; } .ui-state-default .btn-icon-addpage { background-position: 0 -70px; } -.ui-state-default .btn-icon-addpage_disabled { background-position: 0 -88px; } -.ui-state-default .btn-icon-arrow-circle-135-left { background-position: 0 -104px; } -.ui-state-default .btn-icon-back { background-position: 0 -120px; } -.ui-state-default .btn-icon-back_disabled { background-position: 0 -136px; } -.ui-state-default .btn-icon-chain--arrow { background-position: 0 -151px; } -.ui-state-default .btn-icon-chain--exclamation { background-position: 0 -167px; } -.ui-state-default .btn-icon-chain--minus { background-position: 0 -183px; } -.ui-state-default .btn-icon-chain--pencil { background-position: 0 -199px; } -.ui-state-default .btn-icon-chain--plus { background-position: 0 -215px; } -.ui-state-default .btn-icon-chain-small { background-position: 0 -231px; } -.ui-state-default .btn-icon-chain-unchain { background-position: 0 -247px; } -.ui-state-default .btn-icon-chain { background-position: 0 -263px; } -.ui-state-default .btn-icon-cross-circle { background-position: 0 -279px; } -.ui-state-default .btn-icon-cross-circle_disabled { background-position: 0 -295px; } -.ui-state-default .btn-icon-decline { background-position: 0 -311px; } -.ui-state-default .btn-icon-decline_disabled { background-position: 0 -328px; } -.ui-state-default .btn-icon-download-csv { background-position: 0 -345px; } -.ui-state-default .btn-icon-drive-upload { background-position: 0 -363px; } -.ui-state-default .btn-icon-drive-upload_disabled { background-position: 0 -379px; } -.ui-state-default .btn-icon-magnifier { background-position: 0 -395px; } -.ui-state-default .btn-icon-minus-circle { background-position: 0 -411px; } -.ui-state-default .btn-icon-minus-circle_disabled { background-position: 0 -427px; } -.ui-state-default .btn-icon-navigation { background-position: 0 -443px; } -.ui-state-default .btn-icon-navigation_disabled { background-position: 0 -459px; } -.ui-state-default .btn-icon-network-cloud { background-position: 0 -475px; } -.ui-state-default .btn-icon-network-cloud_disabled { background-position: 0 -491px; } -.ui-state-default .btn-icon-pencil { background-position: 0 -507px; } -.ui-state-default .btn-icon-pencil_disabled { background-position: 0 -523px; } -.ui-state-default .btn-icon-plug-disconnect-prohibition { background-position: 0 -539px; } -.ui-state-default .btn-icon-plug-disconnect-prohibition_disabled { background-position: 0 -555px; } -.ui-state-default .btn-icon-preview { background-position: 0 -571px; } -.ui-state-default .btn-icon-preview_disabled { background-position: 0 -588px; } -.ui-state-default .btn-icon-settings { background-position: 0 -605px; } -.ui-state-default .btn-icon-settings_disabled { background-position: 0 -621px; } -.ui-state-default .btn-icon-unpublish { background-position: 0 -637px; } -.ui-state-default .btn-icon-unpublish_disabled { background-position: 0 -655px; } +.ui-state-default .btn-icon-addpage_disabled { background-position: 0 -86px; } +.ui-state-default .btn-icon-arrow-circle-135-left { background-position: 0 -102px; } +.ui-state-default .btn-icon-back { background-position: 0 -118px; } +.ui-state-default .btn-icon-back_disabled { background-position: 0 -134px; } +.ui-state-default .btn-icon-chain--arrow { background-position: 0 -149px; } +.ui-state-default .btn-icon-chain--exclamation { background-position: 0 -165px; } +.ui-state-default .btn-icon-chain--minus { background-position: 0 -181px; } +.ui-state-default .btn-icon-chain--pencil { background-position: 0 -197px; } +.ui-state-default .btn-icon-chain--plus { background-position: 0 -213px; } +.ui-state-default .btn-icon-chain-small { background-position: 0 -229px; } +.ui-state-default .btn-icon-chain-unchain { background-position: 0 -245px; } +.ui-state-default .btn-icon-chain { background-position: 0 -261px; } +.ui-state-default .btn-icon-cross-circle { background-position: 0 -277px; } +.ui-state-default .btn-icon-cross-circle_disabled { background-position: 0 -293px; } +.ui-state-default .btn-icon-decline { background-position: 0 -309px; } +.ui-state-default .btn-icon-decline_disabled { background-position: 0 -326px; } +.ui-state-default .btn-icon-download-csv { background-position: 0 -343px; } +.ui-state-default .btn-icon-drive-upload { background-position: 0 -361px; } +.ui-state-default .btn-icon-drive-upload_disabled { background-position: 0 -377px; } +.ui-state-default .btn-icon-magnifier { background-position: 0 -393px; } +.ui-state-default .btn-icon-minus-circle { background-position: 0 -409px; } +.ui-state-default .btn-icon-minus-circle_disabled { background-position: 0 -425px; } +.ui-state-default .btn-icon-navigation { background-position: 0 -441px; } +.ui-state-default .btn-icon-navigation_disabled { background-position: 0 -457px; } +.ui-state-default .btn-icon-network-cloud { background-position: 0 -473px; } +.ui-state-default .btn-icon-network-cloud_disabled { background-position: 0 -489px; } +.ui-state-default .btn-icon-pencil { background-position: 0 -505px; } +.ui-state-default .btn-icon-pencil_disabled { background-position: 0 -521px; } +.ui-state-default .btn-icon-plug-disconnect-prohibition { background-position: 0 -537px; } +.ui-state-default .btn-icon-plug-disconnect-prohibition_disabled { background-position: 0 -553px; } +.ui-state-default .btn-icon-preview { background-position: 0 -569px; } +.ui-state-default .btn-icon-preview_disabled { background-position: 0 -586px; } +.ui-state-default .btn-icon-settings { background-position: 0 -603px; } +.ui-state-default .btn-icon-settings_disabled { background-position: 0 -619px; } +.ui-state-default .btn-icon-unpublish { background-position: 0 -635px; } +.ui-state-default .btn-icon-unpublish_disabled { background-position: 0 -653px; } .icon { text-indent: -9999px; border: none; outline: none; } .icon.icon-24 { width: 24px; height: 24px; background: url('../images/menu-icons/24x24-s546fcae8fd.png'); } @@ -253,7 +253,7 @@ body.cms { overflow: hidden; } .cms-preview, .cms-menu, .cms-content, .cms-content-header, .cms-content-tools, .cms-content-fields, .cms-edit-form, .cms-preview, .cms-preview iframe, .cms-preview-controls { display: -moz-inline-box; -moz-box-orient: vertical; display: inline-block; vertical-align: middle; *vertical-align: auto; } .cms-preview, .cms-menu, .cms-content, .cms-content-header, .cms-content-tools, .cms-content-fields, .cms-edit-form, .cms-preview, .cms-preview iframe, .cms-preview-controls { *display: inline; } -.cms-content-header { padding: 0px 8px 8px; height: 32px; z-index: 60; background-image: url(../images/textures/cms_content_header.png); background-repeat: repeat; } +.cms-content-header { padding: 0px 8px 8px; height: 32px; z-index: 60; -moz-box-shadow: rgba(107, 120, 123, 0.5) 0 0 4px inset; -webkit-box-shadow: rgba(107, 120, 123, 0.5) 0 0 4px inset; -o-box-shadow: rgba(107, 120, 123, 0.5) 0 0 4px inset; box-shadow: rgba(107, 120, 123, 0.5) 0 0 4px inset; background-image: url(../images/textures/cms_content_header.png); background-repeat: repeat; } .cms-content-header a { color: #1556b2; } .cms-content-header .backlink { float: left; margin-top: 7px; } .cms-content-header .backlink span.btn-icon-back { height: 16px; } @@ -400,7 +400,7 @@ body.cms { overflow: hidden; } form.member-profile-form { padding: 0 16px 0 0; } form.member-profile-form .ui-tabs-nav .ui-state-default, form.member-profile-form .ui-tabs-nav .ui-widget-content .ui-state-default, form.member-profile-form .ui-tabs-nav .ui-widget-header .ui-state-default { border-top: none; } form.member-profile-form #Root_Permissions { clear: both; padding: 16px; } -form.member-profile-form #Root_Main { clear: both; padding: 16px; } +form.member-profile-form #Root_Main { clear: both; } form.member-profile-form #Root_Main .cms-help-toggle { text-indent: -9999em; display: inline-block; width: 20px; background: url(../images/question.png) no-repeat 0px 0px; } form.member-profile-form #FavouritePageID { margin-top: 8px; } form.member-profile-form #CsvFile .middleColumn { background: none !important; } @@ -465,23 +465,28 @@ form.member-profile-form .ui-tabs-nav .ui-corner-all, form.member-profile-form . .cms .ui-dialog .ss-ui-dialog.ui-dialog-content { padding-top: 0px; } .ui-dialog { background: url("../images/textures/bg_cms_main_content.png") repeat left top #f0f3f4; border: 3px solid #000 !important; border-radius: 8px; overflow: visible; padding: 0; } -.ui-dialog .ui-dialog-titlebar.ui-widget-header { font-size: 14px; background-color: #92a5b2; padding: 4px 4px 4px 16px; border-bottom: 2px solid #8399a7; background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2NlZDdkYyIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzkyYTViMiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ced7dc), color-stop(100%, #92a5b2)); background-image: -webkit-linear-gradient(#ced7dc, #92a5b2); background-image: -moz-linear-gradient(#ced7dc, #92a5b2); background-image: -o-linear-gradient(#ced7dc, #92a5b2); background-image: -ms-linear-gradient(#ced7dc, #92a5b2); background-image: linear-gradient(#ced7dc, #92a5b2); } +.ui-dialog .ui-dialog-titlebar.ui-widget-header { font-size: 14px; padding: 4px 4px 4px 16px; border: none; background-color: transparent; background-image: url(../images/textures/cms_content_header.png); background-repeat: repeat; -moz-box-shadow: rgba(107, 120, 123, 0.5) 0 0 4px inset; -webkit-box-shadow: rgba(107, 120, 123, 0.5) 0 0 4px inset; -o-box-shadow: rgba(107, 120, 123, 0.5) 0 0 4px inset; box-shadow: rgba(107, 120, 123, 0.5) 0 0 4px inset; } +.ui-dialog .cms-dialog-content { background: url("../images/textures/bg_cms_main_content.png") repeat left top #f0f3f4; padding-bottom: 8px; overflow: visible; } +.ui-dialog .cms-dialog-content .Actions { overflow: auto; margin: 8px 0; padding-bottom: 8px; float: right; } +.ui-dialog .cms-dialog-content .ss-tabset { z-index: 60; -moz-border-radius: none; -webkit-border-radius: none; -o-border-radius: none; -ms-border-radius: none; -khtml-border-radius: none; border-radius: none; } +.ui-dialog .cms-dialog-content .ss-tabset .tab { background: none; overflow-y: auto; } +.ui-dialog .cms-dialog-content .ss-tabset.ui-tabs { background: none; } +.ui-dialog .cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav { border: none; padding: 0 40px 0 0; float: right; margin-top: -44px; } +.ui-dialog .cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav li { font-weight: bold; line-height: 16px; padding: 12px 12px 10px; border-bottom: 2px solid #B3B3B3; } +.ui-dialog .cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: -1px; } +.ui-dialog .cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav li:first-child { margin-left: 15px; } +.ui-dialog .cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav .ui-state-focus a { outline: none; } +.ui-dialog .cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav .ui-state-default, .ui-dialog .cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav .ui-widget-content .ui-state-default, .ui-dialog .cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav .ui-widget-header .ui-state-default { background-color: #b0bec7; background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2IwYmVjNyIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzhjYTFhZSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA=='); background-size: 100%; background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #b0bec7), color-stop(100%, #8ca1ae)); background-image: -webkit-linear-gradient(#b0bec7, #8ca1ae); background-image: -moz-linear-gradient(#b0bec7, #8ca1ae); background-image: -o-linear-gradient(#b0bec7, #8ca1ae); background-image: -ms-linear-gradient(#b0bec7, #8ca1ae); background-image: linear-gradient(#b0bec7, #8ca1ae); border-right-color: #a6a6a6; border-left-color: #d9d9d9; border-bottom: none; border-top: none; text-shadow: white 0 1px 0; } +.ui-dialog .cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav .ui-state-active, .ui-dialog .cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav .ui-widget-content .ui-state-active, .ui-dialog .cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav .ui-widget-header .ui-state-active { background: #eceff1; border-right-color: #a6a6a6; border-left-color: #a6a6a6; margin-right: -1px; margin-left: -3px; z-index: 2; } +.ui-dialog .cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav .ui-state-active a, .ui-dialog .cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav .ui-widget-content .ui-state-active a, .ui-dialog .cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav .ui-widget-header .ui-state-active a { border-bottom: none; border-top: none; } +.ui-dialog .cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav .ui-corner-all, .ui-dialog .cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav .ui-corner-top, .ui-dialog .cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav .ui-corner-right, .ui-dialog .cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav .ui-corner-tr { border-radius: 0; } +.ui-dialog .cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav .ui-corner-all, .ui-dialog .cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav .ui-corner-top, .ui-dialog .cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav .ui-corner-left, .ui-dialog .cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav .ui-corner-tl { border-radius: 0; } +.ui-dialog .cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-panel { background: url("../images/textures/bg_cms_main_content.png") repeat left top #f0f3f4; overflow-x: hidden; } +.ui-dialog .cms-dialog-content .clear { clear: both; } .ui-dialog.loading { background-image: url(../images/spinner.gif); background-position: 50% 50%; background-repeat: no-repeat; } body.cms-dialog { overflow: auto; background: url("../images/textures/bg_cms_main_content.png") repeat left top #f0f3f4; } -.cms-dialog-content { background: url("../images/textures/bg_cms_main_content.png") repeat left top #f0f3f4; padding-bottom: 8px; } -.cms-dialog-content .Actions { overflow: auto; margin: 8px 0; padding-bottom: 8px; float: right; } -.cms-dialog-content .ss-tabset { z-index: 60; -moz-border-radius: none; -webkit-border-radius: none; -o-border-radius: none; -ms-border-radius: none; -khtml-border-radius: none; border-radius: none; } -.cms-dialog-content .ss-tabset .tab { background: none; overflow-y: auto; } -.cms-dialog-content .ss-tabset.ui-tabs { background: none; } -.cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav { border: none; padding: 0 40px 0 0; float: right; } -.cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav li { font-weight: bold; line-height: 16px; padding: 11px 12px 9px; border-bottom: 2px solid #B3B3B3; } -.cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: -1px; } -.cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav li:first-child { margin-left: 15px; } -.cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-panel { border: 1px solid #AAAAAA; background: url("../images/textures/bg_cms_main_content.png") repeat left top #f0f3f4; } -.cms-dialog-content .clear { clear: both; } - /** -------------------------------------------- "Insert X" forms -------------------------------------------- */ .htmleditorfield-linkform .step2 { margin-bottom: 16px; } @@ -492,7 +497,7 @@ body.cms-dialog { overflow: auto; background: url("../images/textures/bg_cms_mai .htmleditorfield-mediaform .ss-htmleditorfield-file .overview .thumbnail { display: inline-block; vertical-align: middle; padding: 4px; } .htmleditorfield-mediaform .ss-htmleditorfield-file .overview .thumbnail img { max-height: 24px; } .htmleditorfield-mediaform .ss-htmleditorfield-file .overview .title { display: inline-block; vertical-align: middle; background: #fff; border: 1px solid #b3b3b3; -moz-border-radius: 5px; -webkit-border-radius: 5px; -o-border-radius: 5px; -ms-border-radius: 5px; -khtml-border-radius: 5px; border-radius: 5px; margin-left: 16px; padding: 4px; } -.htmleditorfield-mediaform .ss-htmleditorfield-file .overview .action-delete { display: inline-block; } +.htmleditorfield-mediaform .ss-htmleditorfield-file .overview .action-delete { float: right; padding: 8px; background: none; border: none; } .htmleditorfield-mediaform .ss-htmleditorfield-file .details { padding: 16px; } /** -------------------------------------------- Search forms (used in AssetAdmin, ModelAdmin, etc) -------------------------------------------- */ @@ -536,7 +541,9 @@ form.import-form label.left { width: 250px; } /** This file defines the jstree base styling (see http://jstree.com), as well as any customizations (see bottom of file). The styles are usually added through jstree.js on DOM load, but we need it earlier in order to correctly display the uninitialized tree. */ .cms .jstree ul, .TreeDropdownField .treedropdownfield-panel .jstree ul { display: block; margin: 0; padding: 0; background: none; list-style-type: none; } -.cms .jstree li, .TreeDropdownField .treedropdownfield-panel .jstree li { display: block; margin: 0; padding: 0; list-style-type: none; display: block; min-height: 18px; line-height: 18px; white-space: nowrap; margin-left: 18px; min-width: 18px; } +.cms .jstree li, .TreeDropdownField .treedropdownfield-panel .jstree li { display: block; margin: 0; padding: 0; list-style-type: none; display: block; min-height: 18px; line-height: 18px; white-space: nowrap; min-width: 18px; } +.cms .jstree li li, .TreeDropdownField .treedropdownfield-panel .jstree li li { margin: 0; } +.cms .jstree li li li, .TreeDropdownField .treedropdownfield-panel .jstree li li li { margin-left: 10px; } .cms .jstree ins, .TreeDropdownField .treedropdownfield-panel .jstree ins { display: inline-block; text-decoration: none; width: 18px; height: 18px; margin: 0 0 0 0; padding: 0; float: left; } .cms .jstree a, .TreeDropdownField .treedropdownfield-panel .jstree a { display: inline-block; line-height: 16px; height: 16px; color: black; white-space: nowrap; text-decoration: none; padding: 1px 2px; margin: 0; border: 1px solid #fff; } .cms .jstree a:focus, .cms .jstree a:active, .cms .jstree a:hover, .TreeDropdownField .treedropdownfield-panel .jstree a:focus, .TreeDropdownField .treedropdownfield-panel .jstree a:active, .TreeDropdownField .treedropdownfield-panel .jstree a:hover { outline: none; text-decoration: none; cursor: pointer; text-shadow: none; } @@ -572,7 +579,7 @@ form.import-form label.left { width: 250px; } .cms .jstree a > ins, .TreeDropdownField .treedropdownfield-panel .jstree a > ins { height: 16px; width: 16px; } .cms .jstree a > .jstree-icon, .TreeDropdownField .treedropdownfield-panel .jstree a > .jstree-icon { margin-right: 3px; } .cms .jstree-rtl a > .jstree-icon, .TreeDropdownField .treedropdownfield-panel .jstree-rtl a > .jstree-icon { margin-left: 3px; margin-right: 0; } -.cms li.jstree-open > ul, .TreeDropdownField .treedropdownfield-panel li.jstree-open > ul { display: block; margin-left: -13px; } +.cms li.jstree-open > ul, .TreeDropdownField .treedropdownfield-panel li.jstree-open > ul { display: block; } .cms li.jstree-open > ul li ul, .TreeDropdownField .treedropdownfield-panel li.jstree-open > ul li ul { margin-left: 2px; } .cms li.jstree-closed > ul, .TreeDropdownField .treedropdownfield-panel li.jstree-closed > ul { display: none; } .cms #vakata-dragged ins, .TreeDropdownField .treedropdownfield-panel #vakata-dragged ins { display: block; text-decoration: none; width: 16px; height: 16px; margin: 0 0 0 0; padding: 0; position: absolute; top: 4px; left: 4px; -moz-border-radius: 4px; border-radius: 4px; -webkit-border-radius: 4px; } diff --git a/admin/images/btn-icon-s41050dc384.png b/admin/images/btn-icon-s41050dc384.png new file mode 100644 index 0000000000000000000000000000000000000000..1e891a5fc7e46a5713eb0530bd1fb42603052ab3 GIT binary patch literal 17788 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 Date: Mon, 2 Apr 2012 09:08:31 +1200 Subject: [PATCH 10/56] MINOR:added spaces to css. --- css/UnitTesting.css | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/css/UnitTesting.css b/css/UnitTesting.css index 99224bf62..472b51952 100644 --- a/css/UnitTesting.css +++ b/css/UnitTesting.css @@ -8,17 +8,17 @@ table.details tr { background: #eeeee0; } p { line-height: 1.5em; margin-top: 0.5em; margin-bottom: 1.0em; } -h1 { margin: 0px 0px 5px; font: 165% verdana,arial,helvetica; } +h1 { margin: 0px 0px 5px; font: 165% verdana, arial, helvetica; } -h2 { margin-top: 1em; margin-bottom: 0.5em; font: bold 125% verdana,arial,helvetica; } +h2 { margin-top: 1em; margin-bottom: 0.5em; font: bold 125% verdana, arial, helvetica; } -h3 { margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica; } +h3 { margin-bottom: 0.5em; font: bold 115% verdana, arial, helvetica; } -h4 { margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica; } +h4 { margin-bottom: 0.5em; font: bold 100% verdana, arial, helvetica; } -h5 { margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica; } +h5 { margin-bottom: 0.5em; font: bold 100% verdana, arial, helvetica; } -h6 { margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica; } +h6 { margin-bottom: 0.5em; font: bold 100% verdana, arial, helvetica; } .Error { font-weight: bold; color: red; } From 5c3c3cb347f63765c97796388724becdb3ae2f41 Mon Sep 17 00:00:00 2001 From: Julian Seidenberg Date: Tue, 3 Apr 2012 10:31:01 +1200 Subject: [PATCH 11/56] BUGFIX: SSF-38 removing the z-index on the TabSet so that the upload button works in the HtmlEditorField insert image lightbox. --- admin/css/screen.css | 2 +- admin/scss/_style.scss | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/admin/css/screen.css b/admin/css/screen.css index 22abbb05f..5a195d488 100644 --- a/admin/css/screen.css +++ b/admin/css/screen.css @@ -468,7 +468,7 @@ form.member-profile-form .ui-tabs-nav .ui-corner-all, form.member-profile-form . .ui-dialog .ui-dialog-titlebar.ui-widget-header { font-size: 14px; padding: 4px 4px 4px 16px; border: none; background-color: transparent; background-image: url(../images/textures/cms_content_header.png); background-repeat: repeat; -moz-box-shadow: rgba(107, 120, 123, 0.5) 0 0 4px inset; -webkit-box-shadow: rgba(107, 120, 123, 0.5) 0 0 4px inset; -o-box-shadow: rgba(107, 120, 123, 0.5) 0 0 4px inset; box-shadow: rgba(107, 120, 123, 0.5) 0 0 4px inset; } .ui-dialog .cms-dialog-content { background: url("../images/textures/bg_cms_main_content.png") repeat left top #f0f3f4; padding-bottom: 8px; overflow: visible; } .ui-dialog .cms-dialog-content .Actions { overflow: auto; margin: 8px 0; padding-bottom: 8px; float: right; } -.ui-dialog .cms-dialog-content .ss-tabset { z-index: 60; -moz-border-radius: none; -webkit-border-radius: none; -o-border-radius: none; -ms-border-radius: none; -khtml-border-radius: none; border-radius: none; } +.ui-dialog .cms-dialog-content .ss-tabset { -moz-border-radius: none; -webkit-border-radius: none; -o-border-radius: none; -ms-border-radius: none; -khtml-border-radius: none; border-radius: none; } .ui-dialog .cms-dialog-content .ss-tabset .tab { background: none; overflow-y: auto; } .ui-dialog .cms-dialog-content .ss-tabset.ui-tabs { background: none; } .ui-dialog .cms-dialog-content .ss-tabset.ui-tabs .ui-tabs-nav { border: none; padding: 0 40px 0 0; float: right; margin-top: -44px; } diff --git a/admin/scss/_style.scss b/admin/scss/_style.scss index f4800e2f1..e911b9c7c 100644 --- a/admin/scss/_style.scss +++ b/admin/scss/_style.scss @@ -1190,7 +1190,6 @@ form.member-profile-form { } .ss-tabset { - z-index: 60; @include border-radius(none); .tab { From f1e0951483c5345b7fa12630fde324c79b0ad962 Mon Sep 17 00:00:00 2001 From: Normann Lou Date: Tue, 3 Apr 2012 12:48:43 +1200 Subject: [PATCH 12/56] ENHANCEMENT: allow each dialog pop to have their own extra class. --- admin/javascript/LeftAndMain.js | 9 +++++---- admin/javascript/ssui.core.js | 3 +++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/admin/javascript/LeftAndMain.js b/admin/javascript/LeftAndMain.js index b8c77f4f0..8fbf1f010 100644 --- a/admin/javascript/LeftAndMain.js +++ b/admin/javascript/LeftAndMain.js @@ -382,18 +382,19 @@ jQuery.noConflict(); this._super(); var self = this, id = 'ss-ui-dialog-' + this.getUUID(); - var dialog = $('#' + id); if(!dialog.length) { dialog = $('
    '); $('body').append(dialog); } - - dialog.ssdialog({iframeUrl: this.attr('href'), autoOpen: true}); + + var extraClass = this.data('popupclass')?this.data('popupclass'):''; + + dialog.ssdialog({iframeUrl: this.attr('href'), autoOpen: true, dialogExtraClass: extraClass}); return false; } }); - + /** * Add styling to all contained buttons, and create buttonsets if required. */ diff --git a/admin/javascript/ssui.core.js b/admin/javascript/ssui.core.js index 281d439f2..b071f6e74 100644 --- a/admin/javascript/ssui.core.js +++ b/admin/javascript/ssui.core.js @@ -55,6 +55,7 @@ // Custom properties iframeUrl: '', reloadOnOpen: true, + dialogExtraClass: '', // Defaults width: '80%', @@ -78,6 +79,8 @@ self._resizeIframe(); self.uiDialog.removeClass('loading'); }).hide(); + + if(this.options.dialogExtraClass) this.uiDialog.addClass(this.options.dialogExtraClass); this.element.append(iframe); // Let the iframe handle its scrolling From fac2664e01e30e89a0d62a19146d5355cc28978f Mon Sep 17 00:00:00 2001 From: Normann Lou Date: Tue, 3 Apr 2012 12:48:50 +1200 Subject: [PATCH 13/56] MINOR: add 'edit-profile-popup' as extra popup class --- admin/templates/Includes/LeftAndMain_Menu.ss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/templates/Includes/LeftAndMain_Menu.ss b/admin/templates/Includes/LeftAndMain_Menu.ss index 45b5d6cb9..0cd4bee8f 100644 --- a/admin/templates/Includes/LeftAndMain_Menu.ss +++ b/admin/templates/Includes/LeftAndMain_Menu.ss @@ -12,7 +12,7 @@ <% control CurrentMember %> <% _t('Hello','Hi') %> - + <% if FirstName && Surname %>$FirstName $Surname<% else_if FirstName %>$FirstName<% else %>$Email<% end_if %> From cebe2fc0935db76d376b576815d7f00bea6418e5 Mon Sep 17 00:00:00 2001 From: Jeremy Bridson Date: Tue, 3 Apr 2012 14:34:42 +1200 Subject: [PATCH 14/56] BUGFIX:removed header from edit profile popup and restyled broken tabs - still needs a proper fix after beta II. --- admin/css/screen.css | 11 +++++++++-- admin/scss/_style.scss | 28 +++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/admin/css/screen.css b/admin/css/screen.css index 5a195d488..043fc03a2 100644 --- a/admin/css/screen.css +++ b/admin/css/screen.css @@ -398,9 +398,12 @@ body.cms { overflow: hidden; } /** -------------------------------------------- Member Profile -------------------------------------------- */ form.member-profile-form { padding: 0 16px 0 0; } +form.member-profile-form .ui-tabs-nav { margin-right: 40px !important; float: right; } +form.member-profile-form .ui-tabs-nav .ui-state-active, form.member-profile-form .ui-tabs-nav .ui-widget-content .ui-state-active, form.member-profile-form .ui-tabs-nav .ui-widget-header .ui-state-active { padding-bottom: 1px; margin-bottom: -1px; } form.member-profile-form .ui-tabs-nav .ui-state-default, form.member-profile-form .ui-tabs-nav .ui-widget-content .ui-state-default, form.member-profile-form .ui-tabs-nav .ui-widget-header .ui-state-default { border-top: none; } -form.member-profile-form #Root_Permissions { clear: both; padding: 16px; } -form.member-profile-form #Root_Main { clear: both; } +form.member-profile-form .ui-tabs-nav .ui-state-default a, form.member-profile-form .ui-tabs-nav .ui-widget-content .ui-state-default a, form.member-profile-form .ui-tabs-nav .ui-widget-header .ui-state-default a { padding: 12px 20px 11px; } +form.member-profile-form #Root_Permissions { clear: both; border-top: 1px solid #a6a6a6; } +form.member-profile-form #Root_Main { clear: both; border-top: 1px solid #a6a6a6; padding-top: 16px; } form.member-profile-form #Root_Main .cms-help-toggle { text-indent: -9999em; display: inline-block; width: 20px; background: url(../images/question.png) no-repeat 0px 0px; } form.member-profile-form #FavouritePageID { margin-top: 8px; } form.member-profile-form #CsvFile .middleColumn { background: none !important; } @@ -487,6 +490,10 @@ form.member-profile-form .ui-tabs-nav .ui-corner-all, form.member-profile-form . body.cms-dialog { overflow: auto; background: url("../images/textures/bg_cms_main_content.png") repeat left top #f0f3f4; } +.ui-dialog.edit-profile-popup .ui-dialog-titlebar { height: 0px; padding: 0 4px 0 16px; } +.ui-dialog.edit-profile-popup .ui-dialog-titlebar .ui-dialog-title { position: absolute; } +.ui-dialog.edit-profile-popup .ss-ui-dialog { padding-right: 0px; } + /** -------------------------------------------- "Insert X" forms -------------------------------------------- */ .htmleditorfield-linkform .step2 { margin-bottom: 16px; } diff --git a/admin/scss/_style.scss b/admin/scss/_style.scss index e911b9c7c..ab98388af 100644 --- a/admin/scss/_style.scss +++ b/admin/scss/_style.scss @@ -839,22 +839,35 @@ body.cms { form.member-profile-form { padding: 0 $grid-x*2 0 0; .ui-tabs-nav { + margin-right:40px !important; //adds a 40px gap to the right of the tabs to match designs on main CMS + float:right; + .ui-state-active, + .ui-widget-content .ui-state-active, + .ui-widget-header .ui-state-active { + padding-bottom: 1px; + margin-bottom:-1px; + } .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: { top:none; } + a { + padding:12px 20px 11px; + } } } #Root_Permissions { clear:both; - padding: $grid-x*2; + border-top: 1px solid darken($color-tab, 20%); } #Root_Main { clear:both; + border-top: 1px solid darken($color-tab, 20%); + padding-top:$grid-y*2; .cms-help-toggle { text-indent: -9999em; display: inline-block; @@ -1296,6 +1309,19 @@ body.cms-dialog { background: url("../images/textures/bg_cms_main_content.png") repeat left top #F0F3F4; } +.ui-dialog.edit-profile-popup { + .ui-dialog-titlebar { + height:0px; //removes the header outside of the iframe on edit profile popup. + padding:0 4px 0 16px; + + .ui-dialog-title { + position:absolute; + } + } + .ss-ui-dialog { + padding-right:0px; + } +} From 00b904b01ccd914eac8925daa22e479596bf65b2 Mon Sep 17 00:00:00 2001 From: Normann Lou Date: Tue, 3 Apr 2012 16:48:49 +1200 Subject: [PATCH 15/56] ENHANCEMENT make gridfield status applied with header filter and header sort before export --- forms/gridfield/GridFieldExportButton.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/forms/gridfield/GridFieldExportButton.php b/forms/gridfield/GridFieldExportButton.php index 919094196..e99302718 100644 --- a/forms/gridfield/GridFieldExportButton.php +++ b/forms/gridfield/GridFieldExportButton.php @@ -110,6 +110,11 @@ class GridFieldExportButton implements GridField_HTMLProvider, GridField_ActionP } $items = $gridField->getList(); + foreach($gridField->getConfig()->getComponents() as $component){ + if($component instanceof GridFieldFilterHeader || $component instanceof GridFieldSortableHeader) { + $items = $component->getManipulatedData($gridField, $items); + } + } foreach($items as $item) { $columnData = array(); foreach($csvColumns as $columnSource => $columnHeader) { From ba02e500e7145516b63d5b915cbaf35844c33846 Mon Sep 17 00:00:00 2001 From: Normann Lou Date: Tue, 3 Apr 2012 16:56:43 +1200 Subject: [PATCH 16/56] FEATURE added GridFieldPrintButton compoonent --- forms/gridfield/GridFieldPrintButton.php | 169 +++++++++++++++++++++++ javascript/GridField.js | 42 ++++++ scss/GridField_print.scss | 3 + templates/Includes/GridField_print.ss | 17 +++ 4 files changed, 231 insertions(+) create mode 100644 forms/gridfield/GridFieldPrintButton.php create mode 100644 scss/GridField_print.scss create mode 100644 templates/Includes/GridField_print.ss diff --git a/forms/gridfield/GridFieldPrintButton.php b/forms/gridfield/GridFieldPrintButton.php new file mode 100644 index 000000000..281571dea --- /dev/null +++ b/forms/gridfield/GridFieldPrintButton.php @@ -0,0 +1,169 @@ +targetFragment = $targetFragment; + $this->printColumns = $printColumns; + } + + /** + * Place the print button in a

    tag below the field + */ + public function getHTMLFragments($gridField) { + $button = new GridField_FormAction( + $gridField, + 'print', + _t('TableListField.Print', 'Print'), + 'print', + null + ); + $button->setAttribute('data-icon', 'grid_print'); + $button->addExtraClass('gridfield-button-print'); + //$button->addExtraClass('no-ajax'); + return array( + $this->targetFragment => '

    ' . $button->Field() . '

    ', + ); + } + + /** + * print is an action button + */ + public function getActions($gridField) { + return array('print'); + } + + function handleAction(GridField $gridField, $actionName, $arguments, $data) { + if($actionName == 'print') { + return $this->handlePrint($gridField); + } + } + + /** + * it is also a URL + */ + function getURLHandlers($gridField) { + return array( + 'print' => 'handlePrint', + ); + } + + /** + * Handle the print, for both the action button and the URL + */ + public function handlePrint($gridField, $request = null) { + set_time_limit(60); + Requirements::clear(); + Requirements::css(SAPPHIRE_DIR . '/css/GridField_print.css'); + if($data = $this->generatePrintData($gridField)){ + return $data->renderWith("GridField_print"); + } + } + + /** + * Export core. + */ + function generatePrintData($gridField) { + $printColumns = ($this->printColumns) ? $this->printColumns : $gridField->getDisplayFields(); + if($this->printHasHeader){ + $header = new ArrayList(); + foreach($printColumns as $field => $label){ + $header->push( + new ArrayData(array( + "CellString" => $label, + )) + ); + } + } + + $items = $gridField->getList(); + $itemRows = new ArrayList(); + foreach($items as $item) { + $itemRow = new ArrayList(); + foreach($printColumns as $field => $label) { + $value = $item->relField($field); + $itemRow->push( + new ArrayData(array( + "CellString" => $value, + )) + ); + } + $itemRows->push(new ArrayData( + array( + "ItemRow" => $itemRow + ) + )); + } + $ret = new ArrayData( + array( + "Header" => $header, + "ItemRows" => $itemRows, + ) + ); + + + $item->destroy(); + + return $ret; + } + + /** + * @return array + */ + function getPrintColumns() { + return $this->printColumns; + } + + /** + * @param array + */ + function setPrintColumns($cols) { + $this->printColumns = $cols; + return $this; + } + + /** + * @return boolean + */ + function getPrintHasHeader() { + return $this->printHasHeader; + } + + /** + * @param boolean + */ + function setPrintHasHeader($bool) { + $this->printHasHeader = $bool; + return $this; + } +} diff --git a/javascript/GridField.js b/javascript/GridField.js index f5ce69eb0..1ced97eec 100644 --- a/javascript/GridField.js +++ b/javascript/GridField.js @@ -111,7 +111,49 @@ } } }); + + $('.ss-gridfield .action.gridfield-button-print').entwine({ + UUID: null, + onmatch: function() { + this._super(); + this.setUUID(new Date().getTime()); + }, + onclick: function(e){ + var self = this, iframeID = 'gridfield-print-iframe' + this.getUUID(); + var printIframe = $('#' + iframeID); + + if(!printIframe.length){ + printIframe = $('