search.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. $(function() {
  2. $(".selectBox").on("click", function (e) {
  3. if($(this).siblings(".checkboxes").find("label").css("display") == "block") {
  4. if($(this).siblings(".checkboxes").css("display") == "none") {
  5. $(".checkboxes").css("display", "none");
  6. $(this).siblings(".checkboxes").css("display", "block");
  7. } else {
  8. $(".checkboxes").css("display", "none");
  9. }
  10. }
  11. });
  12. $("body").on("click", function (event) {
  13. if (!$(event.target).hasClass("overSelect")) {
  14. if (($(event.target).closest(".checkboxes").length == 0)) {
  15. $(".checkboxes").css("display", "none");
  16. }
  17. }
  18. });
  19. $(".multiselect #category-any").on("change", function() {
  20. $("#notes").slideUp(200);
  21. $(".category-option").prop("checked", false);
  22. if(this.checked) {
  23. search_data["category"] = get_value_list_by_key(db_table["category"], null, -1, "category_id");
  24. search_data["project"] = get_value_list_by_key(db_table["project"], null, -1, "project_id");
  25. search_data["type"] = get_value_list_by_key(db_table["type"], null, -1, "type_id");
  26. } else {
  27. search_data["category"] = [];
  28. search_data["project"] = [];
  29. search_data["type"] = [];
  30. }
  31. notes_show = get_notes_list_by_project(notes_button_list);
  32. set_select_text("category", false);
  33. show_select_option("project", search_data["project"], "p", true);
  34. show_select_option("type", search_data["type"], "t", true);
  35. show_select_option("notes", notes_show, "n", true);
  36. });
  37. $(".multiselect .category-option").on("change", function() {
  38. $("#notes").slideUp(200);
  39. category_id_list = [];
  40. list_id_list = [];
  41. //set search_data
  42. check_list = get_multi_checkbox_check_list("category-option");
  43. check_list.forEach(element => {
  44. category_id_list.push(element.split("-")[0].replace("c", ""));
  45. list_id_list.push(element.split("-")[1].replace("l", ""));
  46. });
  47. search_data["category"] = category_id_list;
  48. search_data["project"] = get_value_list_by_key(db_table["project"], "category_id", category_id_list, "project_id");
  49. target_type_id_list = get_value_list_by_key(db_table["category_type"], "list_id", list_id_list, "category_list");
  50. search_data["type"] = merge_string_to_list(target_type_id_list);
  51. notes_show = get_notes_list_by_project(notes_button_list);
  52. //set view
  53. if(search_data["category"].length == db_table["category"].length) {
  54. $("#category .checkboxes input").prop("checked", false);
  55. $("#category-any").prop("checked", true);
  56. } else {
  57. $("#category-any").prop("checked", false);
  58. }
  59. set_select_text("category", false);
  60. show_select_option("project", search_data["project"], "p", true);
  61. show_select_option("type", search_data["type"], "t", true);
  62. show_select_option("notes", notes_show, "n", true);
  63. });
  64. $(".multiselect #project-any").on("change", function() {
  65. $("#notes").slideUp(200);
  66. $(".project-option").prop("checked", false);
  67. search_data["project"] = [];
  68. if(this.checked) {
  69. $(".project-button:visible").each(function(){
  70. search_data["project"].push($(this).find("input").attr("id").replace("p", ""));
  71. });
  72. }
  73. notes_show = get_notes_list_by_project(notes_button_list);
  74. set_select_text("project", false);
  75. reset_checkbox("type", "t", true);
  76. show_select_option("notes", notes_show, "n", true);
  77. });
  78. $(".multiselect .project-option").on("change", function() {
  79. $("#notes").slideUp(200);
  80. search_data["project"] = get_multi_checkbox_check_list("project-option", "p");
  81. notes_show = get_notes_list_by_project(notes_button_list);
  82. if($(".project-option:checked").length == $(".project-button:visible").length) {
  83. $("#project .checkboxes input").prop("checked", false);
  84. $("#project-any").prop("checked", true);
  85. } else {
  86. $("#project-any").prop("checked", false);
  87. }
  88. set_select_text("project", false);
  89. reset_checkbox("type", "t", true);
  90. show_select_option("notes", notes_show, "n", true);
  91. });
  92. $(".multiselect #type-any").on("change", function() {
  93. $("#notes").slideUp(200);
  94. $(".type-option").prop("checked", false);
  95. search_data["type"] = [];
  96. if(this.checked) {
  97. $(".type-button:visible").each(function(){
  98. search_data["type"].push($(this).find("input").attr("id").replace("t", ""));
  99. });
  100. }
  101. set_select_text("type", false);
  102. reset_checkbox("notes", "n", true);
  103. });
  104. $(".multiselect .type-option").on("change", function() {
  105. search_data["type"] = get_multi_checkbox_check_list("type-option", "t");
  106. if($(".type-option:checked").length == $(".type-button:visible").length) {
  107. $("#type .checkboxes input").prop("checked", false);
  108. $("#type-any").prop("checked", true);
  109. } else {
  110. $("#type-any").prop("checked", false);
  111. }
  112. set_select_text("type", false);
  113. if($("#t3").prop("checked")) {
  114. $("#notes").slideDown(200);
  115. reset_checkbox("notes", "n", true);
  116. } else {
  117. $("#notes").slideUp(200);
  118. }
  119. });
  120. $(".multiselect #notes-any").on("change", function() {
  121. $(".notes-option").prop("checked", false);
  122. search_data["notes"] = [];
  123. if(this.checked) {
  124. $(".notes-button:visible").each(function(){
  125. search_data["notes"].push(notes_button_list[parseInt($(this).find("input").attr("id").replace("n", ""))]);
  126. });
  127. }
  128. set_select_text("notes", false);
  129. });
  130. $(".multiselect .notes-option").on("change", function() {
  131. search_data["notes"] = get_multi_checkbox_check_list("notes-option", "n");
  132. if($(".notes-option:checked").length == $(".notes-button:visible").length) {
  133. $("#notes .checkboxes input").prop("checked", false);
  134. $("#notes-any").prop("checked", true);
  135. } else {
  136. $("#notes-any").prop("checked", false);
  137. }
  138. set_select_text("notes", false);
  139. });
  140. });
  141. function merge_string_to_list(string_list) {
  142. output = [];
  143. string_list.forEach(element => {
  144. output = output.concat(element.split(","));
  145. });
  146. return output;
  147. }
  148. function string_concat_list(name, target_list) {
  149. output_list = [];
  150. target_list.forEach(element => {
  151. output_list.push(name + element);
  152. });
  153. return output_list;
  154. }
  155. function get_multi_checkbox_check_list(checkbox_class, name_replace) {
  156. output = [];
  157. var $select_option = $("."+checkbox_class+":checked");
  158. $select_option.each(function(){
  159. if(checkbox_class == "notes-option") {
  160. output.push($(this).attr('value'));
  161. } else {
  162. output.push($(this).attr('id').replace(name_replace, ""));
  163. }
  164. });
  165. return output;
  166. }
  167. function set_select_text(address, lock) {
  168. //unlock select bar
  169. $("#"+address+" select").prop("disabled", false);
  170. //get option name that show on select bar
  171. show_list = [];
  172. if($("#"+address+"-any").prop("checked")) {
  173. $("."+address+"-button").each(function() {
  174. if($(this).css("display") == "block") {
  175. show_list = show_list.concat($(this).find("input").attr("value"));
  176. }
  177. });
  178. } else {
  179. $("."+address+"-option:checked").each(function() {
  180. show_list = show_list.concat($(this).attr("value"));
  181. });
  182. }
  183. //set select bar text
  184. if(show_list.length == 0){
  185. if(lock) {
  186. $("#"+address+" select option").text("無符合條件選項");
  187. $("#"+address+" select").prop("disabled", true);
  188. } else {
  189. $("#"+address+" select option").text("未選擇任何專案");
  190. }
  191. } else {
  192. if(show_list.length > 2) {
  193. $("#"+address+" select option").text("已選擇 "+show_list.length+" 項");
  194. } else {
  195. $("#"+address+" select option").text(show_list);
  196. }
  197. }
  198. }
  199. function show_select_option(address, show_list, id_name, lock) {
  200. //init option
  201. $("#" + address + " .checkboxes input").prop("checked", false);
  202. $("#" + address + " .checkboxes label").css("display", "none");
  203. //show option
  204. show_list.forEach(element => {
  205. $("#"+id_name+element).parent().css("display", "block");
  206. });
  207. if(show_list.length) {
  208. $("#" + address + " #" + address + "-any").prop("checked", true);
  209. $("#" + address + " #" + address + "-any").parent().css("display", "block");
  210. }
  211. set_select_text(address, lock);
  212. }
  213. function reset_checkbox(checkbox_class, id_name, lock) {
  214. search_data[checkbox_class] = [];
  215. $("#"+checkbox_class+" ." + checkbox_class + "-button").each(function() {
  216. if($(this).css("display") == "block") {
  217. if(checkbox_class == "notes") {
  218. search_data[checkbox_class] = search_data[checkbox_class].concat($(this).find("input").attr("value"));
  219. } else {
  220. search_data[checkbox_class] = search_data[checkbox_class].concat($(this).find("input").attr("id").replace(id_name, ""));
  221. }
  222. }
  223. });
  224. $("#"+checkbox_class+" .checkboxes input").prop("checked", false);
  225. $("#"+checkbox_class+" #" + checkbox_class + "-any").prop("checked", true);
  226. set_select_text(checkbox_class, lock)
  227. }
  228. function get_notes_list_by_project(notes_order_list) {
  229. search_data["notes"] = []
  230. search_data["project"].forEach(element => {
  231. search_data["notes"] = search_data["notes"].concat(db_table["notes"][element]);
  232. });
  233. search_data["notes"] = [...new Set(search_data["notes"])];
  234. output_notes_order = []
  235. search_data["notes"].forEach(element => {
  236. for(i=0; i<notes_order_list.length; i++) {
  237. if(notes_order_list[i] == element) {
  238. output_notes_order.push(i);
  239. }
  240. }
  241. });
  242. return output_notes_order;
  243. }