/// @return bool whether the current step is last
this.$last = function() { return this.$index() === steps.length -1; };
this.$maxVisit = function() { return maxVisited; };
+ this.$validStep = function() {
+ return steps[selectedIndex].isStepValid();
+ };
this.iconFor = function(index) {
if (index < this.$index()) return '√';
if (index === this.$index()) return '»';
};
})
- // example: <div crm-ui-wizard-step crm-title="ts('My Title')">...content...</div>
+ // example: <div crm-ui-wizard-step crm-title="ts('My Title')" ng-form="mySubForm">...content...</div>
// If there are any conditional steps, then be sure to set a weight explicitly on *all* steps to maintain ordering.
// example: <div crm-ui-wizard-step="100" crm-title="..." ng-if="...">...content...</div>
.directive('crmUiWizardStep', function() {
var nextWeight = 1;
return {
- require: '^crmUiWizard',
+ require: ['^crmUiWizard', 'form'],
restrict: 'EA',
scope: {
crmTitle: '@', // expression, evaluates to a printable string
},
template: '<div class="crm-wizard-step" ng-show="selected" ng-transclude/></div>',
transclude: true,
- link: function (scope, element, attrs, crmUiWizardCtrl) {
+ link: function (scope, element, attrs, ctrls) {
+ var crmUiWizardCtrl = ctrls[0], form = ctrls[1];
if (scope.crmUiWizardStep) {
scope.crmUiWizardStep = parseInt(scope.crmUiWizardStep);
} else {
scope.crmUiWizardStep = nextWeight++;
}
+ scope.isStepValid = function() {
+ return form.$valid;
+ };
crmUiWizardCtrl.add(scope);
element.on('$destroy', function(){
crmUiWizardCtrl.remove(scope);
<div crm-ui-wizard>
- <div crm-ui-wizard-step crm-title="ts('Setup')">
+ <div crm-ui-wizard-step crm-title="ts('Setup')" ng-form="setupForm">
<div crm-mailing-block-summary crm-mailing="mailing"/>
</div>
- <div crm-ui-wizard-step crm-title="ts('Content')">
+ <div crm-ui-wizard-step crm-title="ts('Content')" ng-form="contentForm">
<div crm-mailing-block-mailing crm-mailing="mailing"/>
<div crm-ui-accordion crm-title="ts('HTML')">
<div crm-mailing-body-html crm-mailing="mailing"/>
</div>
</div>
- <div crm-ui-wizard-step crm-title="ts('Options')">
+ <div crm-ui-wizard-step crm-title="ts('Options')" ng-form="optionsForm">
<div crm-ui-accordion crm-title="ts('Schedule')">
<div crm-mailing-block-schedule crm-mailing="mailing"/>
</div>
</div>
</div>
- <div crm-ui-wizard-step crm-title="ts('Review')">
+ <div crm-ui-wizard-step crm-title="ts('Review')" ng-form="reviewForm">
<div crm-ui-accordion crm-title="ts('Review')">
<div crm-mailing-block-review crm-mailing="mailing"/>
</div>
<div class="crm-block crm-form-block crmMailing">
<div crm-ui-wizard>
- <div crm-ui-wizard-step crm-title="ts('Define Mailing')">
+ <div crm-ui-wizard-step crm-title="ts('Define Mailing')" ng-form="defineForm">
<div crm-ui-accordion crm-title="ts('Summary')">
<div crm-mailing-block-summary crm-mailing="mailing"/>
</div>
<div crm-mailing-block-preview crm-mailing="mailing" on-preview="previewMailing(mailing, preview.mode)" on-send="sendTest(mailing, attachments, preview.recipient)" />
</div>
</div>
- <div crm-ui-wizard-step crm-title="ts('Review and Schedule')">
+ <div crm-ui-wizard-step crm-title="ts('Review and Schedule')" ng-form="reviewForm">
<div crm-ui-accordion crm-title="ts('Review')">
<div crm-mailing-block-review crm-mailing="mailing"/>
</div>
<form name="crmMailingAB" novalidate ng-hide="isSubmitted()">
<div class="crm-block crm-form-block crmMailing">
<div crm-ui-wizard>
- <div crm-ui-wizard-step="10" crm-title="ts('Setup')">
+ <div crm-ui-wizard-step="10" crm-title="ts('Setup')" ng-form="setupForm">
<div
crm-mailing-ab-block-setup="{
help: 1,
}"
crm-abtest="abtest"></div>
</div>
- <div crm-ui-wizard-step="11" crm-title="ts('Target')">
+ <div crm-ui-wizard-step="11" crm-title="ts('Target')" ng-form="targetForm">
<div
crm-mailing-ab-block-setup="{
recipients: 1,
}"
crm-abtest="abtest"></div>
</div>
- <div crm-ui-wizard-step="20" crm-title="ts('Compose')" ng-if="criteriaName != 'Two different emails'">
+ <div crm-ui-wizard-step="20" crm-title="ts('Compose')" ng-if="criteriaName != 'Two different emails'" ng-form="composeForm">
<div crm-ui-tab-set>
<div crm-ui-tab id="tab-mailing" crm-title="ts('Mailing')">
<div
<div crm-mailing-block-preview crm-mailing="abtest.mailings.b" on-preview="previewMailing('b', preview.mode)" on-send="sendTest('b', preview.recipient)" />
</div>
</div>
- <div crm-ui-wizard-step="21" crm-title="ts('Compose (A)')" ng-if="criteriaName == 'Two different emails'">
+ <div crm-ui-wizard-step="21" crm-title="ts('Compose (A)')" ng-if="criteriaName == 'Two different emails'" ng-form="composeAForm">
<div crm-ui-tab-set>
<div crm-ui-tab id="tab-mailingA" crm-title="ts('Mailing')">
<div
<div crm-mailing-block-preview crm-mailing="abtest.mailings.a" on-preview="previewMailing('a', preview.mode)" on-send="sendTest('a', preview.recipient)" />
</div>
</div>
- <div crm-ui-wizard-step="22" crm-title="ts('Compose (B)')" ng-if="criteriaName == 'Two different emails'">
+ <div crm-ui-wizard-step="22" crm-title="ts('Compose (B)')" ng-if="criteriaName == 'Two different emails'" ng-form="composeBForm">
<div crm-ui-tab-set>
<div crm-ui-tab id="tab-mailingB" crm-title="ts('Mailing')">
<div
<div crm-mailing-block-preview crm-mailing="abtest.mailings.b" on-preview="previewMailing('b', preview.mode)" on-send="sendTest('b', preview.recipient)" />
</div>
</div>
- <div crm-ui-wizard-step="30" crm-title="ts('Schedule')">
+ <div crm-ui-wizard-step="30" crm-title="ts('Schedule')" ng-form="schedForm">
<div
crm-mailing-ab-block-setup="{
scheduled_date: 1,
<div class="crm-wizard-body" ng-transclude/>
<div class="crm-wizard-buttons">
<button ng-click="crmUiWizardCtrl.previous()" ng-show="!crmUiWizardCtrl.$first()">Previous</button>
- <button ng-click="crmUiWizardCtrl.next()" ng-show="!crmUiWizardCtrl.$last()">Next</button>
+ <button ng-click="crmUiWizardCtrl.next()" ng-show="!crmUiWizardCtrl.$last()" ng-disabled="!crmUiWizardCtrl.$validStep()">Next</button>
</div>
-</div>
\ No newline at end of file
+</div>