Coverage Report - org.kuali.student.common.ui.client.widgets.rules.SubrulePreviewWidget
 
Classes in this File Line Coverage Branch Coverage Complexity
SubrulePreviewWidget
0%
0/119
0%
0/72
5
 
 1  
 package org.kuali.student.common.ui.client.widgets.rules;
 2  
 
 3  
 import java.util.List;
 4  
 import java.util.Map;
 5  
 
 6  
 import org.kuali.student.common.ui.client.configurable.mvc.SectionTitle;
 7  
 import org.kuali.student.common.ui.client.widgets.KSButton;
 8  
 import org.kuali.student.common.ui.client.widgets.KSButtonAbstract.ButtonStyle;
 9  
 import org.kuali.student.common.ui.client.widgets.field.layout.element.SpanPanel;
 10  
 import org.kuali.student.core.statement.dto.ReqCompFieldInfo;
 11  
 import org.kuali.student.core.statement.dto.ReqComponentInfo;
 12  
 import org.kuali.student.core.statement.dto.StatementOperatorTypeKey;
 13  
 import org.kuali.student.core.statement.dto.StatementTreeViewInfo;
 14  
 
 15  
 import com.google.gwt.event.dom.client.ClickHandler;
 16  
 import com.google.gwt.user.client.ui.FlowPanel;
 17  
 import com.google.gwt.user.client.ui.HTML;
 18  
 import com.google.gwt.user.client.ui.Widget;
 19  
 
 20  
 public class SubrulePreviewWidget extends FlowPanel {
 21  
 
 22  0
     private KSButton editButton = new KSButton("Edit", ButtonStyle.DEFAULT_ANCHOR);
 23  0
     private SpanPanel separator = new SpanPanel(" | ");
 24  0
     private KSButton deleteButton = new KSButton("Delete", ButtonStyle.DEFAULT_ANCHOR);
 25  0
     private boolean isReadOnly = true;
 26  
     private Map<String, Widget> clusetWidgets;
 27  0
     private final String CLU_SET_WIDGET_TAG = "[CLU_SET_WIDGET_TAG]";
 28  
 
 29  
     public SubrulePreviewWidget(StatementTreeViewInfo stmtTreeInfo, boolean isReadOnly, Map<String, Widget> clusetWidgets) {
 30  0
         super();
 31  0
         this.isReadOnly = isReadOnly;
 32  0
         this.clusetWidgets = clusetWidgets;
 33  
 
 34  0
         addStyleName("KS-Rule-Preview-Subrule-Box");
 35  0
         showSubrule(stmtTreeInfo);
 36  0
     }
 37  
 
 38  
     public void showSubrule(StatementTreeViewInfo stmtTreeInfo) {
 39  0
         this.clear();
 40  
 
 41  0
         if (stmtTreeInfo == null) {
 42  0
             return;
 43  
         }
 44  
 
 45  0
         buildRequirementHeader(stmtTreeInfo);
 46  0
         buildRequirement(stmtTreeInfo);
 47  0
     }
 48  
 
 49  
     private void buildRequirementHeader(StatementTreeViewInfo stmtTreeInfo) {
 50  
 
 51  0
         SectionTitle header = SectionTitle.generateH6Title("");
 52  0
         if (stmtTreeInfo.getOperator() == StatementOperatorTypeKey.AND) {
 53  0
             header.setHTML("Must meet <b>all of the following:</b>");
 54  
         } else {
 55  0
             header.setHTML("Must meet <b>1 of the following:</b>");
 56  
         }
 57  0
         header.setStyleName("KS-Rule-Preview-Subrule-header");
 58  0
         header.getElement().setAttribute("style", "font-weight: normal");
 59  
 
 60  
         //do not show edit,delete etc. if user is only viewing the rule in non-edit mode
 61  0
         if (!isReadOnly) {
 62  0
             buildEditActionsWidget(header);
 63  
         }
 64  0
         this.add(header);
 65  0
     }
 66  
 
 67  
     private void buildEditActionsWidget(SectionTitle header) {
 68  0
         SpanPanel actions = new SpanPanel();
 69  0
         actions.add(editButton);
 70  0
         actions.add(separator);
 71  0
         actions.add(deleteButton);
 72  0
         actions.addStyleName("KS-Rule-Preview-Subrule-header-action");
 73  0
         header.add(actions);
 74  0
     }
 75  
 
 76  
     private void buildRequirement(StatementTreeViewInfo stmtTreeInfo) {
 77  0
         String html = buildOneRequirement(stmtTreeInfo, null, true, true).toString();
 78  
 
 79  0
         boolean foundOpennigBracket = false;
 80  0
         while (html.length() > 0) {
 81  
 
 82  0
             int ix = html.indexOf(CLU_SET_WIDGET_TAG);
 83  0
             if (ix == -1) {
 84  0
                 this.add(new HTML(html));
 85  0
                 break;
 86  
             }
 87  
 
 88  0
             foundOpennigBracket = !foundOpennigBracket;
 89  0
             if (ix == 0) {
 90  0
                 html = html.substring(CLU_SET_WIDGET_TAG.length());
 91  0
                 continue;
 92  
             }
 93  
 
 94  0
             if (ix > 0) {
 95  0
                 String beforeTagString = html.substring(0, ix);
 96  0
                 if (foundOpennigBracket) {
 97  0
                     this.add(new HTML(beforeTagString));
 98  
                 } else {
 99  0
                     this.add(clusetWidgets.get(beforeTagString));
 100  
                 }
 101  0
                 html = html.substring(ix + CLU_SET_WIDGET_TAG.length());
 102  0
                 continue;
 103  
             }
 104  0
         }
 105  0
     }
 106  
 
 107  
     private StringBuffer buildOneRequirement(StatementTreeViewInfo stmtTreeInfo, StatementOperatorTypeKey upperLevelOperator, boolean firstLevel, boolean firstRequirement) {
 108  
 
 109  0
         StringBuffer htmlText = new StringBuffer();
 110  0
         List<StatementTreeViewInfo> stmtTreeList = stmtTreeInfo.getStatements();
 111  
 
 112  0
         if ((stmtTreeList != null) && (stmtTreeList.size() > 0)) {
 113  0
             StringBuffer htmlOneLevelText = new StringBuffer();
 114  0
             firstRequirement = true;
 115  0
             for (StatementTreeViewInfo subTree : stmtTreeList) {
 116  0
                 boolean trueFirstLevel = (firstLevel && (stmtTreeList.size() <= 1));
 117  0
                 htmlOneLevelText.append(buildOneRequirement(subTree, stmtTreeInfo.getOperator(), trueFirstLevel, firstRequirement));
 118  0
                 firstRequirement = htmlOneLevelText.toString().trim().isEmpty();
 119  0
             }
 120  
 
 121  
             //only if we have other statements within this statement we indent
 122  0
             if (firstLevel || stmtTreeInfo.getStatements().size() > 1) {
 123  
 
 124  0
                 if (!firstLevel) {
 125  0
                     String operatorText = (stmtTreeInfo.getOperator() == StatementOperatorTypeKey.AND ?
 126  
                                             "Must meet all of the following:" : "Must meet 1 of the following:");
 127  0
                     htmlText.append(addRequirementToList(null, upperLevelOperator, operatorText, firstRequirement));
 128  
                 }
 129  
 
 130  0
                 htmlText.append("<ul class=\"KS-Program-Rule-Preview-Subrule-ul\">");
 131  0
                 htmlText.append(htmlOneLevelText);
 132  0
                 htmlText.append("</ul>");
 133  
             } else {
 134  0
                 htmlText.append(htmlOneLevelText);
 135  
             }
 136  
 
 137  0
         } else if ((stmtTreeInfo.getReqComponents() != null) && !stmtTreeInfo.getReqComponents().isEmpty()) {
 138  0
             List<ReqComponentInfo> reqComponents = stmtTreeInfo.getReqComponents();
 139  0
             StringBuilder htmlListText = new StringBuilder();
 140  
 
 141  
             //build a bullet list of requirements
 142  0
             boolean firstListRequirement = firstRequirement;
 143  0
             if (!firstLevel && reqComponents.size() > 1) {
 144  0
                 firstListRequirement = true;   // we indent if we have more than one requirement on second or lower levels which means first requirement
 145  
             }
 146  0
             for (ReqComponentInfo reqComp : reqComponents) {
 147  0
                 StatementOperatorTypeKey operator = (reqComponents.size() > 1 ? stmtTreeInfo.getOperator() : upperLevelOperator);
 148  0
                 String nl = null;
 149  0
                 if (reqComp instanceof ReqComponentInfoUi) {
 150  0
                     ReqComponentInfoUi reqUi = (ReqComponentInfoUi)reqComp;
 151  0
                         nl = reqUi.getPreviewNaturalLanguageTranslation();
 152  
                     }
 153  0
                 if ( nl == null) {
 154  0
                         nl = reqComp.getNaturalLanguageTranslation();
 155  
                 }
 156  0
                 htmlListText.append(addRequirementToList(reqComp, operator, nl, firstListRequirement));
 157  0
                 firstListRequirement = false;
 158  0
             }
 159  
 
 160  
             //indent if we have more than one requirement on second or lower levels
 161  0
             if (firstLevel || reqComponents.size() == 1) {
 162  0
                 htmlText.append(htmlListText);
 163  
             } else {
 164  0
                 String operatorText = (stmtTreeInfo.getOperator() == StatementOperatorTypeKey.AND ?
 165  
                                         "Must meet all of the following:" : "Must meet 1 of the following:");
 166  0
                 htmlText.append(addRequirementToList(null, upperLevelOperator, operatorText, firstRequirement));
 167  
               //  firstRequirement = false;
 168  0
                 htmlText.append("<ul class=\"KS-Program-Rule-Preview-Subrule-ul\">");
 169  0
                 htmlText.append(htmlListText);
 170  0
                 htmlText.append("</ul>");
 171  
             }
 172  0
         } else {
 173  0
             return new StringBuffer("No rules have been added");
 174  
         }
 175  
 
 176  0
         return htmlText;
 177  
     }
 178  
 
 179  
     private StringBuffer addRequirementToList(ReqComponentInfo reqComp, StatementOperatorTypeKey operator, String requirement, boolean firstRequirement) {
 180  0
         StringBuffer html = new StringBuffer();
 181  0
         html.append("<li style=\"padding-top: 5px;\">");
 182  0
         if (!firstRequirement) {
 183  0
             html.append("<span class=\"KS-Program-Rule-Preview-Subrule-ORAND\">");
 184  0
             html.append(operator == StatementOperatorTypeKey.AND ? "AND " : "OR ");
 185  0
             html.append("</span>");
 186  
         }
 187  0
         html.append(requirement);
 188  
 
 189  
         //we need to display clu set show/hide list widget if this req. component has a cluset
 190  0
         if ((clusetWidgets != null) && (reqComp != null)) {
 191  0
             List<ReqCompFieldInfo> fieldInfos = reqComp.getReqCompFields();
 192  0
             for (ReqCompFieldInfo fieldInfo : fieldInfos) {
 193  0
                 if (RulesUtil.isCluSetWidget(fieldInfo.getType())) {
 194  0
                     if (clusetWidgets.get(fieldInfo.getValue()) != null) {
 195  0
                         html.append(CLU_SET_WIDGET_TAG + fieldInfo.getValue() + CLU_SET_WIDGET_TAG);
 196  0
                         break;
 197  
                     }
 198  
                 }
 199  
             }
 200  
         }
 201  
 
 202  0
         html.append("</li>");
 203  0
         return html;
 204  
     }
 205  
 
 206  
     public void addEditButtonClickHandler(ClickHandler handler) {
 207  0
         editButton.addClickHandler(handler);
 208  0
     }
 209  
 
 210  
     public void addDeleteButtonClickHandler(ClickHandler handler) {
 211  0
         deleteButton.addClickHandler(handler);
 212  0
     }
 213  
 }