Browse Source

[검색][New] 하위 태그 있는 항목 갱신 처리

hyodong.min 7 years ago
parent
commit
ce08480ba5

+ 50 - 4
app/src/main/java/kr/co/zumo/app/lifeplus/bean/api/FilterTagBean.java

@@ -15,7 +15,7 @@ import com.google.gson.annotations.SerializedName;
  * @history 민효동   [2019. 1. 21.]   [최초 작성]
  * @since 2019. 1. 21.
  */
-public class FilterTagBean extends TagBean {
+public class FilterTagBean extends TagBean implements ISelectable {
   /*
   {
       "tagNo": "B000",
@@ -38,17 +38,63 @@ public class FilterTagBean extends TagBean {
     this.subCount = subCount;
   }
 
+  public FilterTagBean(String tagName) {
+    super(tagName);
+  }
+
   private /*transient*/ boolean isSelected = false;
+  private /*transient*/ boolean beforeCommit = false;
+  private /*transient*/ boolean pendingSelected = false;
 
+  /**
+   * 선택 확인
+   * - commit 전에 pendingSelected 를 반환한다.
+   *
+   * @return
+   */
   public boolean isSelected() {
+    if (beforeCommit) {
+      return pendingSelected;
+    }
+
     return isSelected;
   }
 
+  /**
+   * 선택 설정
+   * - commit 이전에는 cancel 할 수 있다.
+   *
+   * @param selected
+   */
   public void setSelected(boolean selected) {
-    isSelected = selected;
+    pendingSelected = selected;
+    beforeCommit = true;
   }
 
-  public FilterTagBean(String tagName) {
-    super(tagName);
+  /**
+   * 변경 사항을 적용하지 않고 취소
+   */
+  public void cancel() {
+    beforeCommit = false;
+    pendingSelected = isSelected;
+  }
+
+  /**
+   * 변경 사항 적용
+   */
+  public void commit() {
+    if (beforeCommit) {
+      isSelected = pendingSelected;
+      beforeCommit = false;
+    }
+  }
+
+  /**
+   * commit 할 변경 사항이 있는지 확인
+   *
+   * @return
+   */
+  public boolean canCommit() {
+    return beforeCommit;
   }
 }

+ 50 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/bean/api/ISelectable.java

@@ -0,0 +1,50 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.bean.api;
+
+/**
+ * ISelectable
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2019. 1. 24.]   [최초 작성]
+ * @since 2019. 1. 24.
+ */
+public interface ISelectable {
+
+  /**
+   * 선택 확인
+   * - commit 전에 pendingSelected 를 반환한다.
+   *
+   * @return
+   */
+  boolean isSelected();
+
+  /**
+   * 선택 설정
+   * - commit 이전에는 cancel 할 수 있다.
+   *
+   * @param selected
+   */
+  void setSelected(boolean selected);
+
+  /**
+   * 변경 사항을 적용하지 않고 취소
+   */
+  void cancel();
+
+  /**
+   * 변경 사항 적용
+   */
+  void commit();
+
+  /**
+   * commit 할 변경 사항이 있는지 확인
+   *
+   * @return
+   */
+  boolean canCommit();
+}

+ 115 - 9
app/src/main/java/kr/co/zumo/app/lifeplus/bean/api/SearchFilterBean.java

@@ -19,7 +19,7 @@ import kr.co.zumo.app.lifeplus.bean.JsonBeanBase;
  * @history 민효동   [2019. 1. 11.]   [최초 작성]
  * @since 2019. 1. 11.
  */
-public class SearchFilterBean extends JsonBeanBase {
+public class SearchFilterBean extends JsonBeanBase implements ISelectable {
   /*
    {
     "fltrNo:"필터번호"
@@ -63,30 +63,79 @@ public class SearchFilterBean extends JsonBeanBase {
 
 
   private /*transient*/ boolean isSelected = false;
+  private /*transient*/ boolean beforeCommit = false;
+  private /*transient*/ boolean pendingSelected = false;
 
+  /**
+   * 선택 확인
+   * - commit 전에 pendingSelected 를 반환한다.
+   *
+   * @return
+   */
   public boolean isSelected() {
+//    if (hasChildValue(this)) {
+//      return isSelectedChild(this);
+//    }
+//    else {
+    if (beforeCommit) {
+      return pendingSelected;
+    }
+
     return isSelected;
+//    }
   }
 
+  /**
+   * 선택 설정
+   * - commit 이전에는 cancel 할 수 있다.
+   *
+   * @param selected
+   */
   public void setSelected(boolean selected) {
-    isSelected = selected;
+    pendingSelected = selected;
+    beforeCommit = true;
+    /*
+     부모의 값을 자식에게 전달하지는 않는다.
+     */
   }
 
-  @Deprecated
-  private transient String tagNo;
+  /**
+   * 변경 사항을 적용하지 않고 취소
+   */
+  public void cancel() {
+    beforeCommit = false;
+    pendingSelected = isSelected;
 
-  @Deprecated
-  public String getTagNo() {
-    return tagNo;
+    cancelChild(this);
   }
 
+  /**
+   * 변경 사항 적용
+   */
+  public void commit() {
+    if (beforeCommit) {
+      isSelected = pendingSelected;
+      beforeCommit = false;
+    }
 
-  public SearchFilterBean(String filterName, String filterType, String filterNo, String level, String tagNo) {
+    commitChild(this);
+  }
+
+  /**
+   * commit 할 변경 사항이 있는지 확인
+   *
+   * @return
+   */
+  public boolean canCommit() {
+    return beforeCommit;
+  }
+
+
+  public SearchFilterBean(String filterName, String filterType, String filterNo, String level) {
     this.filterName = filterName;
     this.filterType = filterType;
     this.filterNo = filterNo;
     this.filterLevel = level;
-    this.tagNo = tagNo;
   }
 
   public SearchFilterBean() {
@@ -170,4 +219,61 @@ public class SearchFilterBean extends JsonBeanBase {
   public static boolean hasChild(SearchFilterBean bean) {
     return null != bean.getChild() && LifeplusData.isTrue(bean.getChild());
   }
+
+  /**
+   * 하위 정보의 변경 사항 취소
+   *
+   * @param bean
+   */
+  public static void cancelChild(SearchFilterBean bean) {
+    if (SearchFilterBean.hasChildValue(bean)) {
+      for (FilterTagBean tagBean : bean.getTagBeans()) {
+        tagBean.cancel();
+      }
+    }
+  }
+
+  /**
+   * 하위 정보의 변경 사항 반영
+   *
+   * @param bean
+   */
+  public static void commitChild(SearchFilterBean bean) {
+    if (SearchFilterBean.hasChildValue(bean)) {
+      for (FilterTagBean tagBean : bean.getTagBeans()) {
+        tagBean.commit();
+      }
+    }
+  }
+
+  /**
+   * 하위 정보에 설정 변경
+   *
+   * @param bean
+   * @param isSelected
+   */
+  public static void setSelectChild(SearchFilterBean bean, boolean isSelected) {
+    if (SearchFilterBean.hasChildValue(bean)) {
+      for (FilterTagBean tagBean : bean.getTagBeans()) {
+        tagBean.setSelected(isSelected);
+      }
+    }
+  }
+
+  /**
+   * 하위 정보의 선택 확인
+   * - 1개라도 선택됐다면 true
+   *
+   * @param bean
+   */
+  public static boolean isSelectedChild(SearchFilterBean bean) {
+    if (SearchFilterBean.hasChildValue(bean)) {
+      for (FilterTagBean tagBean : bean.getTagBeans()) {
+        if (tagBean.isSelected()) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
 }

+ 63 - 37
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/search/SearchResultModel.java

@@ -149,7 +149,6 @@ public class SearchResultModel extends Model {
     CategoryCheckBean categoryCheckBean = categoryCheckBeans.get(selectedCategoryIndex);
     SearchRequestBean requestBean = new SearchRequestBean(getSearchTag());
     requestBean.setCategoryNumber(categoryCheckBean.getCategoryNumber());
-    Log.w("APP# SearchModel | search", "|" + " search ---> " + requestBean.toJson());
     if (StringUtil.isEmpty(requestBean.getKeyword())) {
       Log.i("APP# SearchResultModel | search", "|" + " 검색어 없음.");
       waiterCaller.hideWaiter();
@@ -159,6 +158,8 @@ public class SearchResultModel extends Model {
     // 필터 적용
     applyFilter(requestBean);
 
+    Log.w("APP# SearchResultModel | search", "|" + " search ---> " + requestBean.toJson());
+
     disposableSearch = new APISearchModule().call(requestBean, new APIModuleSimpleListener<SearchResultBean>(waiterCaller) {
       @Override
       public void onApiSuccess(SearchResultBean resultBean) {
@@ -214,7 +215,6 @@ public class SearchResultModel extends Model {
 
     stopSearch();
     SearchRequestBean requestBean = new SearchRequestBean(getSearchTag());
-    Log.w("APP# SearchModel | search", "|" + " search ---> " + requestBean.toJson());
     if (StringUtil.isEmpty(requestBean.getKeyword())) {
       Log.i("APP# SearchResultModel | search", "|" + " 검색어 없음.");
       waiterCaller.hideWaiter();
@@ -224,6 +224,8 @@ public class SearchResultModel extends Model {
     // 필터 적용
     applyFilter(requestBean);
 
+    Log.w("APP# SearchResultModel | search", "|" + " search ---> " + requestBean.toJson());
+
     disposableSearch = new APISearchModule().call(requestBean, new APIModuleSimpleListener<SearchResultBean>(waiterCaller) {
       @Override
       public void onApiSuccess(SearchResultBean resultBean) {
@@ -245,7 +247,7 @@ public class SearchResultModel extends Model {
   public void search() {
     stopSearch();
     SearchRequestBean requestBean = new SearchRequestBean(getSearchTag());
-    Log.w("APP# SearchModel | search", "|" + " search ---> " + requestBean.toJson());
+    Log.w("APP# SearchResultModel | search", "|" + " search ---> " + requestBean.toJson());
     if (StringUtil.isEmpty(requestBean.getKeyword())) {
       Log.i("APP# SearchResultModel | search", "|" + " 검색어 없음.");
       waiterCaller.hideWaiter();
@@ -497,6 +499,7 @@ public class SearchResultModel extends Model {
         // 최신순, 좋아요순, 북마크순
         sectionBean.getFilterBeans().add(getSearchFilterBean(R.string.order_by_latest, "1"));
         sectionBean.getFilterBeans().get(0).setSelected(true);  // 최신순 기본 선택
+        sectionBean.getFilterBeans().get(0).commit();
         sectionBean.getFilterBeans().add(getSearchFilterBean(R.string.order_by_like, "2"));
         sectionBean.getFilterBeans().add(getSearchFilterBean(R.string.order_by_bookmark, "3"));
         hashMap.put("order", sectionBean);
@@ -542,7 +545,6 @@ public class SearchResultModel extends Model {
   }
 
   private SearchResultBean filterSearchResultBean;
-  private List<SearchFilterBean> appliedSearchFilterBeans;
   private List<SearchFilterSectionBean> searchFilterSectionBeans;
 
   public final List<SearchFilterSectionBean> getFilterList() {
@@ -572,9 +574,9 @@ public class SearchResultModel extends Model {
       return;
     }
 
-    Log.w("APP# SearchModel | loadFilteringContents", "|" + " search ---> " + requestBean.toJson());
+    Log.w("APP# SearchResultModel | loadFilteringContents", "|" + " search ---> " + requestBean.toJson());
     if (StringUtil.isEmpty(requestBean.getKeyword())) {
-      Log.i("APP# SearchResultModel | search", "|" + " 검색어 없음.");
+      Log.i("APP# SearchResultModel | loadFilteringContents", "|" + " 검색어 없음.");
       return;
     }
 
@@ -604,23 +606,6 @@ public class SearchResultModel extends Model {
 
   public void loadFilterDetail(SearchFilterBean searchFilterBean, IFilterDetailListener listener) {
 
-    // 이미 선택된 데이터가 있는지 확인
-    List<String> selectedTagNoList = new ArrayList<>();
-
-    if (null != searchFilterBean.getTagBeans()) {
-      for (FilterTagBean tagBean : searchFilterBean.getTagBeans()) {
-        if (tagBean.isSelected()) {
-          selectedTagNoList.add(tagBean.getTagNo());
-        }
-      }
-    }
-
-    // 처음 로딩 시 '전체' 항목은 기본 선택 해준다.
-    // 이미 '전체' 가 포함된 경우는 제외
-    if (selectedTagNoList.size() == 0) {
-      selectedTagNoList.add(FilterTagBean.INDEX_TOTAL);
-    }
-
     String type = searchFilterBean.getFilterType();
     String no = searchFilterBean.getFilterNo();
     StringBuilder itemNoes = new StringBuilder();
@@ -647,22 +632,49 @@ public class SearchResultModel extends Model {
       }
     }
 
-
     disposableFilter = new APISearchFilterDetailModule().call(new FilterDetailRequestBean(type, no, itemNoes.toString()), new APIModuleSimpleListener<SearchFilterDetailResultBean>(waiterCaller) {
       @Override
       public void onApiSuccess(SearchFilterDetailResultBean resultBean) {
         // 결과를 searchFilterBean 에 맵핑 해준다.
         if (null != resultBean && null != resultBean.getData()) {
+          List<FilterTagBean> tagBeans = resultBean.getData();
           // 이전 선택한 항목 재 선택
-          for (FilterTagBean tagBean : resultBean.getData()) {
-            for (String tagNo : selectedTagNoList) {
-              if (tagNo.equals(tagBean.getTagNo())) {
+          if (null != searchFilterBean.getTagBeans()) {
+            for (FilterTagBean before : searchFilterBean.getTagBeans()) {
+              String tagNo = before.getTagNo();
+              for (FilterTagBean tagBean : tagBeans) {
+                if (tagNo.equals(tagBean.getTagNo())) {
+                  tagBean.setSelected(before.isSelected());
+                  if (before.canCommit() == false) {
+                    // 커밋한 상태로 만듬
+                    tagBean.commit();
+                  }
+                }
+              }
+            }
+          }
+
+          // 선택한 것이 있는지 확인
+          boolean needDefault = true;
+          for (FilterTagBean tagBean : tagBeans) {
+            if (tagBean.isSelected()) {
+              needDefault = false;
+              break;
+            }
+          }
+
+          // 처음 하나도 선택 안된 상태라면 '전체'를 기본값으로 선택한다.
+          if (needDefault) {
+            for (FilterTagBean tagBean : tagBeans) {
+              if (FilterTagBean.INDEX_TOTAL.equals(tagBean.getTagNo())) {
                 tagBean.setSelected(true);
+                // 사용자 선택 전이므로 commit 은 하지 않는다.
                 break;
               }
             }
           }
-          searchFilterBean.setTagBeans(resultBean.getData());
+
+          searchFilterBean.setTagBeans(tagBeans);
         }
 
         listener.onCompleted(searchFilterBean);
@@ -737,6 +749,14 @@ public class SearchResultModel extends Model {
   public void cancelFilter() {
     isFilterApplied = false;
     filterSearchResultBean = null;
+
+    int len = searchFilterSectionBeans.size();
+    for (int i = 0; i < len; ++i) {
+      SearchFilterSectionBean bean = searchFilterSectionBeans.get(i);
+      for (SearchFilterBean filterBean : bean.getFilterBeans()) {
+        filterBean.cancel();
+      }
+    }
   }
 
   /**
@@ -744,6 +764,14 @@ public class SearchResultModel extends Model {
    */
   public void commitFilter() {
 
+    int len = searchFilterSectionBeans.size();
+    for (int i = 0; i < len; ++i) {
+      SearchFilterSectionBean bean = searchFilterSectionBeans.get(i);
+      for (SearchFilterBean filterBean : bean.getFilterBeans()) {
+        filterBean.commit();
+      }
+    }
+
     if (null == filterSearchResultBean) {
       isFilterApplied = false;
     }
@@ -762,10 +790,6 @@ public class SearchResultModel extends Model {
    * @return
    */
   public int getFilteredCount() {
-    if (isFilterApplied == false) {
-      return 0;
-    }
-
     if (getTagResultBeans().size() == 0) {
       // 일치하는 결과가 없음.
       return 0;
@@ -777,6 +801,7 @@ public class SearchResultModel extends Model {
 
   /**
    * filter data reset
+   * - need commit too
    */
   public void resetFilter() {
     isFilterApplied = false;
@@ -786,16 +811,17 @@ public class SearchResultModel extends Model {
       SearchFilterSectionBean bean = searchFilterSectionBeans.get(i);
       for (SearchFilterBean filterBean : bean.getFilterBeans()) {
         filterBean.setSelected(false);
-        if (SearchFilterBean.hasChildValue(filterBean)) {
-          for (FilterTagBean tagBean : filterBean.getTagBeans()) {
-            tagBean.setSelected(false);
-          }
-        }
+//        filterBean.commit();
+
+        // 자식들 초기화
+        SearchFilterBean.setSelectChild(filterBean, false);
+//        SearchFilterBean.commitChild(filterBean);
       }
 
       // 정렬 순서 초기값
       if (SearchFilterBean.FILTER_TYPE_ORDER.equals(bean.getSectionType())) {
         bean.getFilterBeans().get(0).setSelected(true);
+//        bean.getFilterBeans().get(0).commit();
       }
     }
   }