vue-search-block.js 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. var db_table = {};
  2. function get_value_list_by_key(obj_list, key_search, target_value, key_save) {
  3. output_list = [];
  4. obj_list.forEach(element => {
  5. if (target_value.length) {
  6. target_value.forEach(e => {
  7. if(e.toString() == element[key_search].toString()) {
  8. output_list.push(element[key_save]);
  9. }
  10. });
  11. } else {
  12. output_list.push(element[key_save]);
  13. }
  14. });
  15. output_list = [...new Set(output_list)];
  16. return output_list;
  17. }
  18. function merge_object_by_key(obj, key, value) {
  19. output_object = {};
  20. while (obj.length > 0) {
  21. pop_out = obj.pop();
  22. if (output_object[pop_out[key]] == undefined) {
  23. output_object[pop_out[key]] = [pop_out[value]];
  24. } else {
  25. output_object[pop_out[key]].push(pop_out[value]);
  26. }
  27. }
  28. return output_object
  29. }
  30. $.ajax({
  31. url: "./script/php/get_db_table.php",
  32. type: "GET",
  33. async: false,
  34. contentType: "application/json",
  35. dataType: "json"
  36. }).done(function(data) {
  37. db_table = data;
  38. }).error(function(error) {
  39. console.log(error);
  40. });
  41. db_table["notes"] = merge_object_by_key(db_table["notes"], "project_id", "notes");
  42. var notes_button_list = [...new Set([].concat(...Object.values(db_table["notes"])))];
  43. var search_data = {
  44. "category": get_value_list_by_key(db_table["category"], null, [], "category_id"),
  45. "project": get_value_list_by_key(db_table["project"], null, [], "project_id"),
  46. "type": get_value_list_by_key(db_table["type"], null, [], "type_id"),
  47. "notes": notes_button_list
  48. };
  49. const vm = Vue.createApp({});
  50. vm.component('search-block', {
  51. data() {
  52. return {
  53. category_list: db_table["category"],
  54. project_list: db_table["project"],
  55. type_list: db_table["type"],
  56. notes_button_list: notes_button_list
  57. }
  58. },
  59. template: `<section class="panel">
  60. <div class="panel-body">
  61. <ul class="button-group nav nav-pills nav-pills-primary">
  62. <li style="padding: 10px 15px;">
  63. <label>工程類別:</label>
  64. </li>
  65. <select id="category_button">
  66. <option value="any">any</option>
  67. <category-button v-for="item in category_list" v-bind:object="item"></category-button>
  68. </select>
  69. <div class="multiselect">
  70. <div class="selectBox">
  71. <select id="c-select">
  72. <option>選擇專案</option>
  73. </select>
  74. <div class="overSelect"></div>
  75. </div>
  76. <div class="checkboxes form-inline" style="display: none;">
  77. <label for="category-any"><input type="checkbox" id="category-any" value="any" checked/> 全選</label>
  78. <category-button v-for="item in category_list" :object="item"></category-button>
  79. </div>
  80. </div>
  81. </ul>
  82. <ul class="button-group nav nav-pills nav-pills-primary">
  83. <li style="padding: 10px 15px;">
  84. <label >專案類別:</label>
  85. </li>
  86. <div class="multiselect">
  87. <div class="selectBox">
  88. <select id="p-select">
  89. <option>選擇專案</option>
  90. </select>
  91. <div class="overSelect"></div>
  92. </div>
  93. <div class="checkboxes form-inline" style="display: none;">
  94. <label for="project-any"><input type="checkbox" id="project-any" value="any" checked/> 全選</label>
  95. <project-button v-for="item in project_list" :object="item"></project-button>
  96. </div>
  97. </div>
  98. </ul>
  99. <div id="type">
  100. <ul class="button-group nav nav-pills nav-pills-primary">
  101. <li style="padding: 10px 15px;">
  102. <label>文件類別:</label>
  103. </li>
  104. <select id="type-button">
  105. <option value="any">any</option>
  106. <type-button v-for="item in type_list" v-bind:object="item"></type-button>
  107. </select>
  108. </ul>
  109. </div>
  110. <div id="notes" hidden>
  111. <ul class="button-group nav nav-pills nav-pills-primary">
  112. <li style="padding: 10px 15px;">
  113. <label>設計圖類別:</label>
  114. </li>
  115. <select id="notes-button">
  116. <option value="any">any</option>
  117. <option value="none">無符合條件選項</option>
  118. <notes-button v-for="item in notes_button_list" v-bind:object="item"></notes-button>
  119. </select>
  120. </ul>
  121. </div>
  122. <div class="filter-search-bar">
  123. <hr class="solid short">
  124. <button class="search-by-filter" style="float:right">search</button>
  125. </div>
  126. </div>
  127. </section>`
  128. });
  129. vm.component("multi-select", {
  130. template:
  131. `<div class="multiselect">
  132. <div class="selectBox">
  133. <select id="c-select">
  134. <option>選擇專案</option>
  135. </select>
  136. <div class="overSelect"></div>
  137. </div>
  138. <div class="checkboxes form-inline" style="display: none;">
  139. <label for="category-any"><input type="checkbox" id="category-any" value="any" checked/> 全選</label>
  140. <category-button v-for="item in category_list" :object="item"></category-button>
  141. </div>
  142. </div>`,
  143. props: {
  144. object: {
  145. category_name: String,
  146. category_id: String,
  147. list_id: String
  148. },
  149. },
  150. computed: {
  151. id_concat(){
  152. return "category" + this.object.category_id + "-" + this.object.list_id;
  153. }
  154. }
  155. });
  156. vm.component("checkbox-option", {
  157. template: `<label class="category-button" v-bind:for="id_concat"><input type="checkbox" class="category-checkbox" :value=object.category_id :id="id_concat" checked/>{{" " + this.object.category_name}}</label>`,
  158. props: {
  159. object: {
  160. category_name: String,
  161. category_id: String,
  162. list_id: String
  163. },
  164. },
  165. computed: {
  166. id_concat(){
  167. return "category" + this.object.category_id + "-" + this.object.list_id;
  168. }
  169. }
  170. });
  171. vm.component('category-button', {
  172. template: `<label class="category-button" v-bind:for="id_concat"><input type="checkbox" class="category-checkbox" :value=object.category_id :id="id_concat" checked/>{{" " + this.object.category_name}}</label>`,
  173. props: {
  174. object: {
  175. category_name: String,
  176. category_id: String,
  177. list_id: String
  178. },
  179. },
  180. computed: {
  181. id_concat(){
  182. return "category" + this.object.category_id + "-" + this.object.list_id;
  183. }
  184. }
  185. });
  186. vm.component('project-button', {
  187. template: `<label class="project-button" v-bind:for="id_concat"><input type="checkbox" class="project-checkbox" :value=object.project_id :id="id_concat" checked/>{{" [" + this.object.project_id + "] " + this.object.project_name}}</label>`,
  188. props: {
  189. object: {
  190. project_id: String,
  191. project_name: String,
  192. category_id: String
  193. },
  194. },
  195. computed: {
  196. id_concat(){
  197. return "project" + this.object.project_id;
  198. }
  199. }
  200. });
  201. vm.component('type-button', {
  202. template: `<option :value=object.type_id>{{object.type_name}}</option>`,
  203. props: {
  204. object: {
  205. type_id: String,
  206. type_name: String,
  207. filetype_id: String
  208. },
  209. }
  210. });
  211. vm.component('notes-button', {
  212. template: `<option v-bind:value=object>{{object}}</option>`,
  213. props: {
  214. object: String
  215. }
  216. });