diff --git a/assets/css/src/admin.styl b/assets/css/src/admin.styl index 95dd9f60de..46cc289c3f 100644 --- a/assets/css/src/admin.styl +++ b/assets/css/src/admin.styl @@ -9,4 +9,5 @@ @require 'form_editor' @require 'listing' -@require 'box' \ No newline at end of file +@require 'box' +@require 'breadcrumb' \ No newline at end of file diff --git a/assets/css/src/box.styl b/assets/css/src/box.styl index 87dadebe1a..aef6dbfbbf 100644 --- a/assets/css/src/box.styl +++ b/assets/css/src/box.styl @@ -1,3 +1,6 @@ +.mailpoet_boxes.mailpoet_boxes_loading + opacity: 0.2 + .mailpoet_boxes li float: left position: relative diff --git a/assets/css/src/breadcrumb.styl b/assets/css/src/breadcrumb.styl new file mode 100644 index 0000000000..61b698a0b3 --- /dev/null +++ b/assets/css/src/breadcrumb.styl @@ -0,0 +1,14 @@ +.mailpoet_breadcrumb + font-size: 0.9em + text-transform: uppercase + color: #444 + +.mailpoet_breadcrumb .mailpoet_current + font-weight: bold + +.mailpoet_breadcrumb a + text-decoration: none + color: #444 + +.mailpoet_breadcrumb a:hover + color: darken(#444, 50%) \ No newline at end of file diff --git a/assets/js/src/newsletters/breadcrumb.jsx b/assets/js/src/newsletters/breadcrumb.jsx new file mode 100644 index 0000000000..5725a080bb --- /dev/null +++ b/assets/js/src/newsletters/breadcrumb.jsx @@ -0,0 +1,76 @@ +define( + [ + 'react', + 'react-router', + 'classnames' + ], + function( + React, + Router, + classNames + ) { + var Link = Router.Link; + + var Breadcrumb = React.createClass({ + mixins: [ + Router.Navigation + ], + getInitialState: function() { + return { + step: null, + steps: [ + { + name: 'type', + label: 'Select type', + link: '/new' + }, + { + name: 'template', + label: 'Template' + }, + { + name: 'editor', + label: 'Designer' + }, + { + name: 'send', + label: 'Send' + } + ] + }; + }, + render: function() { + var steps = this.state.steps.map(function(step, index) { + var stepClasses = classNames( + { 'mailpoet_current': (this.props.step === step.name) } + ); + + var label = step.label; + + if(step['link'] !== undefined && this.props.step !== step.name) { + label = ( + { step.label } + ); + } + + return ( + + + { label } + + { (index < (this.state.steps.length - 1) ) ? ' > ' : '' } + + ); + }.bind(this)); + + return ( +

+ { steps } +

+ ); + } + }); + + return Breadcrumb; + } +); \ No newline at end of file diff --git a/assets/js/src/newsletters/templates.jsx b/assets/js/src/newsletters/templates.jsx index b0e8ebb322..3a60b5b43b 100644 --- a/assets/js/src/newsletters/templates.jsx +++ b/assets/js/src/newsletters/templates.jsx @@ -1,13 +1,17 @@ define( [ - 'react', - 'mailpoet', - 'react-router' + 'react', + 'mailpoet', + 'react-router', + 'classnames', + 'newsletters/breadcrumb.jsx' ], function( React, MailPoet, - Router + Router, + classNames, + Breadcrumb ) { var NewsletterTemplates = React.createClass({ mixins: [ @@ -26,7 +30,7 @@ define( this.setState({ loading: true }); MailPoet.Ajax.post({ - endpoint: 'newslettertemplates', + endpoint: 'newsletterTemplates', action: 'getAll', }).done(function(response) { if(this.isMounted()) { @@ -37,22 +41,29 @@ define( } }.bind(this)); }, - handleSelectTemplate: function(id) { - console.log('select '+id); + handleSelectTemplate: function(template) { + console.log('select '+template.id); }, - handlePreviewTemplate: function(id) { - console.log('preview '+id); + handlePreviewTemplate: function(template) { + console.log('preview '+template.id); }, - handleDeleteTemplate: function(id) { + handleDeleteTemplate: function(template) { this.setState({ loading: true }); - - MailPoet.Ajax.post({ - endpoint: 'newslettertemplates', - action: 'delete', - data: id - }).done(function(response) { - this.getTemplates(); - }.bind(this)); + if( + window.confirm( + 'You are about to delete the template named "'+ template.name +'"' + ) + ) { + MailPoet.Ajax.post({ + endpoint: 'newsletterTemplates', + action: 'delete', + data: template.id + }).done(function(response) { + this.getTemplates(); + }.bind(this)); + } else { + this.setState({ loading: false }); + } }, render: function() { var templates = this.state.templates.map(function(template, index) { @@ -69,14 +80,14 @@ define(
Select   Preview @@ -84,7 +95,7 @@ define(
Delete @@ -93,21 +104,19 @@ define( ); }.bind(this)); + var boxClasses = classNames( + 'mailpoet_boxes', + 'clearfix', + { 'mailpoet_boxes_loading': this.state.loading } + ); + return (

Select a template

-
- Select type -  >  - Template -  >  - Designer >  - Send -
+ - -
    +
      { templates }
diff --git a/assets/js/src/newsletters/types.jsx b/assets/js/src/newsletters/types.jsx index b53a2654ad..69fe125fab 100644 --- a/assets/js/src/newsletters/types.jsx +++ b/assets/js/src/newsletters/types.jsx @@ -1,13 +1,15 @@ define( [ - 'react', - 'mailpoet', - 'react-router' + 'react', + 'mailpoet', + 'react-router', + 'newsletters/breadcrumb.jsx' ], function( React, MailPoet, - Router + Router, + Breadcrumb ) { var NewsletterTypes = React.createClass({ mixins: [ @@ -23,14 +25,7 @@ define(

Pick a type of campaign

-
- Select type -  >  - Template -  >  - Designer >  - Send -
+