1use br_db::Db;
2use br_fields::Field;
3use json::{array, object, JsonValue};
4use std::collections::HashMap;
5
6#[allow(clippy::too_many_arguments)]
7#[cfg(any(
8 feature = "sqlite",
9 feature = "mssql",
10 feature = "mysql",
11 feature = "pgsql"
12))]
13pub struct Tables {
14 main_table: String,
16 db: Db,
18 total: f64,
20 fields: Vec<JsonValue>,
22 join_params: Vec<Vec<String>>,
24 fields_keys: Vec<String>,
26 join_fields: Vec<String>,
28 hide_fields: Vec<String>,
30 show_fields: Vec<String>,
32 total_fields: Vec<String>,
34 data: JsonValue,
36 page: usize,
38 pages: i64,
40 limit: usize,
42 search: String,
44 search_fields: Vec<String>,
46 search_name: String,
48 edit_fields: Vec<String>,
50 order: JsonValue,
53 where_and: JsonValue,
56 where_or: JsonValue,
59 filter_fields: Vec<String>,
61 table_fields: Vec<String>,
63 table_multiple_fields: Vec<String>,
65 tree_fields: Vec<String>,
67 json_fields: Vec<String>,
69 location_fields: Vec<String>,
71 primary_key: String,
73 value: Vec<String>,
75 version: usize,
76 pid_id: String,
78}
79impl Tables {
80 pub fn params_table(mut params: JsonValue) -> JsonValue {
81 params["page"] = br_fields::int::Int::new(false, "page", "页数", 10, 1)
82 .example(1.into())
83 .field();
84 params["limit"] = br_fields::int::Int::new(false, "limit", "行数", 10, 10)
85 .example(10.into())
86 .field();
87 params["order"] = br_fields::text::Array::new(false, "order", "排序", array![]).field();
88 params["search"] = br_fields::str::Str::new(false, "search", "搜索", 200, "")
89 .example("".into())
90 .field();
91 params["where_or"] = br_fields::text::Array::new(false, "where_or", "查询条件", array![])
92 .example(array![])
93 .field();
94 params["where_and"] = br_fields::text::Array::new(false, "where_and", "查询条件", array![])
95 .example(array![])
96 .field();
97 params["params"] =
98 br_fields::text::Object::new(false, "params", "关联数据参数", object! {})
99 .describe("如果是表单就是表单里的其他字段")
100 .example(object! {})
101 .field();
102 params
103 }
104 pub fn params_table_tree(mut params: JsonValue) -> JsonValue {
105 params["pid"] = br_fields::str::Str::new(false, "pid", "上级ID", 50, "")
106 .example("".into())
107 .field();
108 Tables::params_table_select(params)
109 }
110 pub fn params_table_select(mut params: JsonValue) -> JsonValue {
111 params["value"] = br_fields::text::Array::new(false, "value", "已选中值", array![]).field();
112 params["primary_key"] =
113 br_fields::str::Str::new(false, "primary_key", "显示内容的字段", 50, "id").field();
114 Tables::params_table(params)
115 }
116 pub fn params_table_select_tree(mut params: JsonValue) -> JsonValue {
117 params["pid"] = br_fields::str::Str::new(false, "pid", "上级ID", 20, "")
118 .example("".into())
119 .field();
120 params["value"] = br_fields::text::Array::new(false, "value", "已选中值", array![]).field();
121 Tables::params_table(params)
122 }
123 pub fn new(db: Db) -> Self {
124 Self {
125 main_table: "".to_string(),
126 db,
127 total: 0.0,
128 fields: vec![],
129 join_params: vec![],
130 fields_keys: vec![],
131 data: array![],
132 page: 1,
133 pages: 0,
134 limit: 10,
135 search: "".to_string(),
136 search_fields: vec![],
137 search_name: "".to_string(),
138 edit_fields: vec![],
139 order: array![],
140 where_and: array![],
141 where_or: array![],
142 filter_fields: vec![],
143 table_fields: vec![],
144 table_multiple_fields: vec![],
145 tree_fields: vec![],
146 json_fields: vec![],
147 location_fields: vec![],
148 primary_key: "".to_string(),
149 value: vec![],
150 version: 0,
151 join_fields: vec![],
152 hide_fields: vec![],
153 show_fields: vec![],
154 total_fields: vec![],
155 pid_id: "".to_string(),
156 }
157 }
158 pub fn set_version(&mut self, version: usize) -> &mut Self {
159 self.version = version;
160 self
161 }
162 pub fn main_table_fields(
163 &mut self,
164 table: &str,
165 fields: JsonValue,
166 hide_fields: Vec<&str>,
167 show_fields: Vec<&str>,
168 ) -> &mut Self {
169 self.main_table = table.to_string();
170 self.hide_fields = hide_fields.iter().map(|s| s.to_string()).collect();
171 self.show_fields = show_fields.iter().map(|s| s.to_string()).collect();
172 self.fields = fields
173 .entries()
174 .map(|(_, x)| x.clone())
175 .collect::<Vec<JsonValue>>();
176 self
177 }
178 pub fn join_fields(&mut self, table: &str, mut fields: JsonValue, index: isize) -> &mut Self {
179 for (field, item) in fields.entries_mut() {
180 if self.main_table != table {
181 item["field"] = format!("{table}_{field}").into();
182 item["field_table"] = table.into();
183 item["field_table_field"] = field.into();
184 }
185
186 match index {
187 x if x > -1 => {
188 self.fields.insert(x as usize, item.clone());
190 }
191 _ => {
192 self.fields.push(item.clone());
194 }
195 }
196 self.join_fields.push(format!("{table}.{field}"));
197 }
198 self
199 }
200 pub fn fields(&mut self, fields: JsonValue) -> &mut Self {
201 self.fields = fields
202 .entries()
203 .map(|(_, x)| x.clone())
204 .collect::<Vec<JsonValue>>();
205 self
206 }
207 pub fn hide_fields(&mut self, hide_fields: Vec<&str>) -> &mut Self {
208 self.hide_fields = hide_fields.iter().map(|s| s.to_string()).collect();
209 self
210 }
211 pub fn show_fields(&mut self, show_fields: Vec<&str>) -> &mut Self {
212 self.show_fields = show_fields.iter().map(|s| s.to_string()).collect();
213 self
214 }
215 pub fn total_fields(&mut self, fields: Vec<&str>) -> &mut Self {
216 self.total_fields = fields.iter().map(|s| s.to_string()).collect();
217 self
218 }
219 fn set_fields(&mut self, field: &str, mode: &str) {
220 match mode {
221 "table" => self.table_fields.push(field.to_string()),
222 "table_multiple" => {
223 self.table_multiple_fields.push(field.to_string());
224 self.json_fields.push(field.to_string());
225 }
226 "tree" => self.tree_fields.push(field.to_string()),
227 "object" | "array" | "polygon" => self.json_fields.push(field.to_string()),
228 "location" => self.location_fields.push(field.to_string()),
229 _ => {}
230 }
231 }
232 pub fn join_table(
233 &mut self,
234 main_table: &str,
235 main_field: &str,
236 join_table: &str,
237 join_field: &str,
238 ) -> &mut Self {
239 self.join_params.push(vec![
240 main_table.to_string(),
241 main_field.to_string(),
242 join_table.to_string(),
243 join_field.to_string(),
244 ]);
245 self
246 }
247 pub fn main_select_fields(&mut self, table: &str, mut show_fields: Vec<&str>) -> &mut Self {
248 self.main_table = table.to_string();
249 show_fields.insert(0, "id");
250 self.fields_keys = show_fields.into_iter().map(|x| x.to_string()).collect();
251 self.search_fields = self.fields_keys.clone();
252 self
253 }
254
255 pub fn edit_fields(&mut self, fields: Vec<&str>) -> &mut Self {
256 self.edit_fields = fields.iter().map(|s| s.to_string()).collect();
257 self
258 }
259 pub fn search_fields(&mut self, fields: Vec<&str>) -> &mut Self {
260 let mut search_name = vec![];
261 let all_fields = self
262 .fields
263 .iter()
264 .map(|x| (x["field"].to_string(), x.clone()))
265 .collect::<HashMap<String, JsonValue>>();
266 for key in fields.clone() {
267 if let Some(field_info) = all_fields.get(key) {
268 self.search_fields.push(key.to_string());
269 search_name.push(field_info["title"].to_string());
270 }
271 }
272 self.search_name = search_name.join("/");
273 self
274 }
275 pub fn filter_fields(&mut self, fields: Vec<&str>) -> &mut Self {
277 let all_fields = self
278 .fields
279 .iter()
280 .map(|x| (x["field"].to_string(), x.clone()))
281 .collect::<HashMap<String, JsonValue>>();
282 for key in fields.clone() {
283 if all_fields.contains_key(key) {
284 self.filter_fields.push(key.to_string());
285 }
286 }
287 self
288 }
289 pub fn params(&mut self, request: JsonValue) -> &mut Self {
291 if request.has_key("page") {
292 self.page = request["page"].as_usize().unwrap_or(1);
293 }
294 if request.has_key("limit") {
295 self.limit = request["limit"].as_usize().unwrap_or(10);
296 }
297 if request.has_key("where_and") {
298 self.where_and = request["where_and"].clone();
299 }
300 if request.has_key("where_or") {
301 self.where_or = request["where_or"].clone();
302 }
303
304 if request.has_key("pid") {
305 self.pid_id = request["pid"].as_str().unwrap_or("").to_string();
306 }
307
308 if request.has_key("order") {
309 for item in request["order"].members() {
310 let _ = self.order.push(item.clone());
311 }
312 }
313 if request.has_key("search") {
314 self.search = request["search"].to_string();
315 }
316 if request.has_key("primary_key") {
317 self.primary_key = request["primary_key"].to_string();
318 }
319 if request.has_key("value") {
320 self.value = request["value"]
321 .members()
322 .map(|x| x.as_str().unwrap_or("").to_string())
323 .filter(|x| !x.is_empty())
324 .collect();
325 }
326 self
327 }
328
329 fn db_search(&mut self) {
330 if !self.search.is_empty() {
331 let mut all_fields = object! {};
332 let _ = self
333 .fields
334 .iter()
335 .map(|x| all_fields.insert(x["field"].as_str().unwrap_or_default(), x.clone()))
336 .collect::<Vec<_>>();
337
338 let mut t = vec![];
339 for value in self.search_fields.clone() {
340 let field = all_fields[value.as_str()].clone();
341 if field.has_key("field_table") {
342 t.push(format!(
343 "{}.{}",
344 field["field_table"].clone(),
345 field["field_table_field"].clone()
346 ));
347 } else {
348 t.push(value);
349 }
350 }
351 self.db
352 .where_and(&t.join("|"), "like", format!("%{}%", self.search).into());
353 }
354 }
355 fn db_where(&mut self) {
356 let mut all_fields = object! {};
357 let _ = self
358 .fields
359 .iter()
360 .map(|x| all_fields.insert(x["field"].as_str().unwrap_or_default(), x.clone()))
361 .collect::<Vec<_>>();
362
363 for value in self.where_or.members() {
364 let field = all_fields[value[0].to_string()].clone();
365 if field.has_key("field_table") {
366 self.db.where_or(
367 format!(
368 "{}.{}",
369 field["field_table"].clone(),
370 field["field_table_field"].clone()
371 )
372 .as_str(),
373 value[1].as_str().unwrap_or("="),
374 value[2].clone(),
375 );
376 } else {
377 self.db.where_or(
378 value[0].as_str().unwrap_or_default(),
379 value[1].as_str().unwrap_or("="),
380 value[2].clone(),
381 );
382 }
383 }
384 for value in self.where_and.members() {
385 let field = all_fields[value[0].to_string()].clone();
386 if field.has_key("field_table") {
387 self.db.where_and(
388 format!(
389 "{}.{}",
390 field["field_table"].clone(),
391 field["field_table_field"].clone()
392 )
393 .as_str(),
394 value[1].as_str().unwrap_or("="),
395 value[2].clone(),
396 );
397 } else {
398 self.db.where_and(
399 value[0].as_str().unwrap_or_default(),
400 value[1].as_str().unwrap_or("="),
401 value[2].clone(),
402 );
403 }
404 }
405 }
406 fn db_order(&mut self) {
407 let mut all_fields = object! {};
408 let _ = self
409 .fields
410 .iter()
411 .map(|x| all_fields.insert(x["field"].as_str().unwrap_or_default(), x.clone()))
412 .collect::<Vec<_>>();
413
414 for item in self.order.members() {
415 let field = all_fields[item[0].to_string()].clone();
416 if field.has_key("field_table") {
417 self.db.order(
418 format!(
419 "{}.{}",
420 field["field_table"].clone(),
421 field["field_table_field"].clone()
422 )
423 .as_str(),
424 item[1].as_bool().unwrap_or(false),
425 );
426 } else {
427 self.db.order(
428 format!("{}.{}", self.main_table, item[0]).as_str(),
429 item[1].as_bool().unwrap_or(false),
430 );
431 }
432 }
433 }
434 fn db_fields(&mut self) {
435 let mut all_fields = object! {};
436 let _ = self
437 .fields
438 .iter()
439 .map(|x| all_fields.insert(x["field"].as_str().unwrap_or_default(), x.clone()))
440 .collect::<Vec<_>>();
441
442 if !self.hide_fields.is_empty() {
443 for field in self.hide_fields.clone() {
444 if all_fields.has_key(&field) {
445 all_fields.remove(&field);
446 continue;
447 }
448 }
449 }
450
451 if !self.show_fields.is_empty() {
452 self.show_fields.insert(0, "id".to_string());
453 let mut f = object! {};
454 for field in self.show_fields.clone() {
455 if all_fields.has_key(&field) {
456 let _ = f.insert(&field.clone(), all_fields[field].clone());
457 }
458 }
459 all_fields = f;
460 }
461
462 for (field, item) in all_fields.entries() {
463 let mode = item["mode"].to_string();
464 self.set_fields(field, mode.as_str());
465 }
466
467 self.fields = all_fields
468 .entries()
469 .map(|(_, x)| x.clone())
470 .collect::<Vec<JsonValue>>();
471
472 if !self.fields_keys.is_empty() {
473 self.db.field(self.fields_keys.join(",").as_str());
474 }
475 if !self.json_fields.is_empty() {
476 self.db.json(self.json_fields.join(",").as_str());
477 }
478 if !self.location_fields.is_empty() {
479 self.db.location(self.location_fields.join(",").as_str());
480 }
481 }
482 fn db_join(&mut self) {
483 if !self.join_fields.is_empty() {
484 self.db
485 .join_fields(self.join_fields.iter().map(|x| x.as_str()).collect());
486 }
487 for item in self.join_params.iter() {
488 self.db.join(&item[0], &item[1], &item[2], &item[3]);
489 }
490 }
491 fn db_total(&mut self) {
492 self.total = self.db.clone().count().as_f64().unwrap_or(0.0);
493 self.pages = (self.total / (self.limit as f64)).ceil() as i64;
494 }
495 fn db_table(&mut self) {
496 let mut all_fields = object! {};
497 let _ = self
498 .fields
499 .iter()
500 .map(|x| {
501 let _ = all_fields.insert(x["field"].as_str().unwrap_or_default(), x.clone());
502 })
503 .collect::<Vec<_>>();
504
505 let mut table_data = object! {};
506 for item in self.data.members_mut() {
507 for field in self.table_fields.iter() {
508 let key = item[field].as_str().unwrap_or("");
509 if key.is_empty() {
510 continue;
511 }
512 let field_info = all_fields[field].clone();
513
514 if !table_data.has_key(field) {
515 table_data[field] = object! {};
516 }
517 if !table_data[field].has_key(key) {
518 let mut info = field_info.clone();
519 let _ = info["fields"].push("id");
520 let fields_k = info["fields"]
521 .members()
522 .map(|x| x.as_str().unwrap_or_default())
523 .collect::<Vec<&str>>();
524 let mut find = self
525 .db
526 .table(info["table"].as_str().unwrap_or_default())
527 .where_and("id", "=", key.into())
528 .field(&fields_k.join(","))
529 .find();
530 let id = find["id"].to_string();
531 find.remove("id");
532 let label = find
533 .entries()
534 .map(|(_, v)| v.to_string())
535 .collect::<Vec<String>>();
536 table_data[field][key] = object! {
537 value: id.clone(),
538 label:label.join(" | ").clone(),
539 };
540 }
541 item[field] = table_data[field][key].clone();
542 }
543 for field in self.tree_fields.iter() {
544 let key = item[field].as_str().unwrap_or("");
545 if key.is_empty() {
546 continue;
547 }
548 let field_info = all_fields[field].clone();
549 if !table_data.has_key(field) {
550 table_data[field] = object! {};
551 }
552 if !table_data[field].has_key(key) {
553 let mut info = field_info.clone();
554 let pid_field = info["pid_field"].clone().to_string();
555 let _ = info["fields"].push("id");
556 let _ = info["fields"].push(pid_field.clone());
557 let fields_k = info["fields"]
558 .members()
559 .map(|x| x.as_str().unwrap_or_default())
560 .collect::<Vec<&str>>();
561 let mut find = self
562 .db
563 .table(info["table"].as_str().unwrap_or_default())
564 .where_and("id", "=", key.into())
565 .field(&fields_k.join(","))
566 .find();
567 let mut pid = find[pid_field.clone()].to_string();
568 let mut name_list = vec![];
569 let id = find["id"].to_string();
570 find.remove("id");
571 find.remove(&pid_field);
572 let label = find
573 .entries()
574 .map(|(_, v)| v.to_string())
575 .collect::<Vec<String>>();
576 name_list.push(label.join(" | ").clone());
577 loop {
578 if pid.is_empty() {
579 break;
580 }
581 let mut t = self
582 .db
583 .table(info["table"].as_str().unwrap_or_default())
584 .where_and("id", "=", pid.clone().into())
585 .field(&fields_k.join(","))
586 .find();
587 pid = t[pid_field.clone()].to_string();
588 t.remove("id");
589 t.remove(&pid_field);
590 let label = t
591 .entries()
592 .map(|(_, v)| v.to_string())
593 .collect::<Vec<String>>();
594 name_list.push(label.join(" | ").clone());
595 }
596 name_list.reverse();
597 table_data[field][key] = object! {
598 value: id.clone(),
599 label:name_list.join("/").clone(),
600 };
601 }
602 item[field] = table_data[field][key].clone();
603 }
604 for field in self.table_multiple_fields.iter() {
605 let ids = item[field].clone();
606 if !ids.is_array() || ids.is_empty() {
607 item[field] = array![];
608 continue;
609 }
610 let field_info = all_fields[field].clone();
611 if !table_data.has_key(field) {
612 table_data[field] = object! {};
613 }
614 let mut result = array![];
615 for id_val in ids.members() {
616 let key = id_val.as_str().unwrap_or("");
617 if key.is_empty() {
618 continue;
619 }
620 if !table_data[field].has_key(key) {
621 let mut info = field_info.clone();
622 let _ = info["fields"].push("id");
623 let fields_k = info["fields"]
624 .members()
625 .map(|x| x.as_str().unwrap_or_default())
626 .collect::<Vec<&str>>();
627 let mut find = self
628 .db
629 .table(info["table"].as_str().unwrap_or_default())
630 .where_and("id", "=", key.into())
631 .field(&fields_k.join(","))
632 .find();
633 let id = find["id"].to_string();
634 find.remove("id");
635 let label = find
636 .entries()
637 .map(|(_, v)| v.to_string())
638 .collect::<Vec<String>>();
639 table_data[field][key] = object! {
640 value: id.clone(),
641 label: label.join(" | ").clone(),
642 };
643 }
644 let _ = result.push(table_data[field][key].clone());
645 }
646 item[field] = result;
647 }
648 }
649 }
650 fn db_table_tree(&mut self, pid_field: &str) {
651 let mut all_fields = object! {};
652 let _ = self
653 .fields
654 .iter()
655 .map(|x| {
656 let _ = all_fields.insert(x["field"].as_str().unwrap_or_default(), x.clone());
657 })
658 .collect::<Vec<_>>();
659
660 let mut table_data = object! {};
661 for item in self.data.members_mut() {
662 let find = self
663 .db
664 .table(&self.main_table)
665 .where_and(pid_field, "=", item["id"].clone())
666 .count();
667 if find.is_empty() {
668 item["isLeaf"] = true.into();
669 }
670
671 for field in self.table_fields.iter() {
672 let key = item[field].as_str().unwrap_or("");
673 if key.is_empty() {
674 continue;
675 }
676 let field_info = all_fields[field].clone();
677
678 if !table_data.has_key(field) {
679 table_data[field] = object! {};
680 }
681 if !table_data[field].has_key(key) {
682 let mut info = field_info.clone();
683 let _ = info["fields"].push("id");
684 let fields_k = info["fields"]
685 .members()
686 .map(|x| x.as_str().unwrap_or_default())
687 .collect::<Vec<&str>>();
688 let mut find = self
689 .db
690 .table(info["table"].as_str().unwrap_or_default())
691 .where_and("id", "=", key.into())
692 .field(&fields_k.join(","))
693 .find();
694 let id = find["id"].to_string();
695 find.remove("id");
696 let label = find
697 .entries()
698 .map(|(_, v)| v.to_string())
699 .collect::<Vec<String>>();
700 table_data[field][key] = object! {
701 value: id.clone(),
702 label:label.join(" | ").clone(),
703 };
704 }
705 item[field] = table_data[field][key].clone();
706 }
707 for field in self.tree_fields.iter() {
708 let key = item[field].as_str().unwrap_or("");
709 if key.is_empty() {
710 continue;
711 }
712 let field_info = all_fields[field].clone();
713 if !table_data.has_key(field) {
714 table_data[field] = object! {};
715 }
716 if !table_data[field].has_key(key) {
717 let mut info = field_info.clone();
718 let pid_field = info["pid_field"].clone().to_string();
719 let _ = info["fields"].push("id");
720 let _ = info["fields"].push(pid_field.clone());
721 let fields_k = info["fields"]
722 .members()
723 .map(|x| x.as_str().unwrap_or_default())
724 .collect::<Vec<&str>>();
725 let mut find = self
726 .db
727 .table(info["table"].as_str().unwrap_or_default())
728 .where_and("id", "=", key.into())
729 .field(&fields_k.join(","))
730 .find();
731 let mut pid = find[pid_field.clone()].to_string();
732 let mut name_list = vec![];
733 let id = find["id"].to_string();
734 find.remove("id");
735 find.remove(&pid_field);
736 let label = find
737 .entries()
738 .map(|(_, v)| v.to_string())
739 .collect::<Vec<String>>();
740 name_list.push(label.join(" | ").clone());
741 loop {
742 if pid.is_empty() {
743 break;
744 }
745 let mut t = self
746 .db
747 .table(info["table"].as_str().unwrap_or_default())
748 .where_and("id", "=", pid.clone().into())
749 .field(&fields_k.join(","))
750 .find();
751 pid = t[pid_field.clone()].to_string();
752 t.remove("id");
753 t.remove(&pid_field);
754 let label = t
755 .entries()
756 .map(|(_, v)| v.to_string())
757 .collect::<Vec<String>>();
758 name_list.push(label.join(" | ").clone());
759 }
760 name_list.reverse();
761 table_data[field][key] = object! {
762 value: id.clone(),
763 label:name_list.join("/").clone(),
764 };
765 }
766 item[field] = table_data[field][key].clone();
767 }
768 for field in self.table_multiple_fields.iter() {
769 let ids = item[field].clone();
770 if !ids.is_array() || ids.is_empty() {
771 item[field] = array![];
772 continue;
773 }
774 let field_info = all_fields[field].clone();
775 if !table_data.has_key(field) {
776 table_data[field] = object! {};
777 }
778 let mut result = array![];
779 for id_val in ids.members() {
780 let key = id_val.as_str().unwrap_or("");
781 if key.is_empty() {
782 continue;
783 }
784 if !table_data[field].has_key(key) {
785 let mut info = field_info.clone();
786 let _ = info["fields"].push("id");
787 let fields_k = info["fields"]
788 .members()
789 .map(|x| x.as_str().unwrap_or_default())
790 .collect::<Vec<&str>>();
791 let mut find = self
792 .db
793 .table(info["table"].as_str().unwrap_or_default())
794 .where_and("id", "=", key.into())
795 .field(&fields_k.join(","))
796 .find();
797 let id = find["id"].to_string();
798 find.remove("id");
799 let label = find
800 .entries()
801 .map(|(_, v)| v.to_string())
802 .collect::<Vec<String>>();
803 table_data[field][key] = object! {
804 value: id.clone(),
805 label: label.join(" | ").clone(),
806 };
807 }
808 let _ = result.push(table_data[field][key].clone());
809 }
810 item[field] = result;
811 }
812 }
813 }
814 fn columns(&mut self) -> JsonValue {
815 let mut all_fields = object! {};
816 let _ = self
817 .fields
818 .iter()
819 .map(|x| {
820 let _ = all_fields.insert(x["field"].as_str().unwrap_or_default(), x.clone());
821 })
822 .collect::<Vec<_>>();
823
824 let sort_field = self
825 .order
826 .members()
827 .map(|x| (x[0].to_string(), x[1].as_bool().unwrap_or(false)))
828 .collect::<HashMap<String, bool>>();
829 for (_, item) in all_fields.entries_mut() {
830 item["name"] = item["field"].clone();
831 item["align"] = "center".into();
832 item["label"] = item["title"].clone();
833 item["version"] = self.version.into();
834
835 if item["field"].as_str().unwrap_or("") != "id" {
836 if self.version == 0 {
837 item["sortable"] = true.into();
838 } else {
839 item["sortable"] = object! {
840 "sorter"=>false,
841 "sortDirections"=>array!["ascend","descend"],
842 "defaultSortOrder"=>"",
843 "sortOrder"=>""
844 };
845 if sort_field.contains_key(item["field"].to_string().as_str()) {
846 item["sortable"]["sortOrder"] =
847 if *sort_field.get(&item["field"].to_string()).unwrap_or(&false) {
848 "descend"
849 } else {
850 "ascend"
851 }
852 .into();
853 }
854 }
855 }
856 item["dataIndex"] = item["field"].clone();
857 item["slotName"] = item["field"].clone();
858 item["titleSlotName"] = item["field"].clone();
859 match item["mode"].as_str().unwrap_or_default() {
860 "string" | "text" => {
861 item["ellipsis"] = true.into();
862 item["tooltip"] = true.into();
863 }
864 "key" => {
865 item["width"] = 280.into();
866 item["ellipsis"] = true.into();
867 }
868 _ => {}
869 }
870 }
871 all_fields
872 }
873 pub fn get_table(&mut self) -> JsonValue {
874 self.db.table(&self.main_table);
875 self.db_fields();
876 self.db_search();
877 self.db_where();
878 self.db_join();
879 self.db_total();
880 self.db_order();
881 self.db.page(self.page as i32, self.limit as i32);
882
883 self.data = self.db.select();
884 self.db_table();
885
886 object! {
887 "pages"=>self.pages,
888 "total"=>self.total,
889 "data"=>self.data.clone(),
890 "columns"=>self.columns(),
891 "filter_fields"=>self.filter_fields.clone(),
892 "search_name"=>self.search_name.clone(),
893 "total_fields"=>self.total_fields.clone(),
894 "btn_all"=>array![],
895 "btn_api"=>array![],
896 "btn_ids"=>array![]
897 }
898 }
899 pub fn get_table_menu(&mut self, label_field: &str) -> JsonValue {
900 self.db.table(&self.main_table);
901 self.db_fields();
902 self.db_search();
903 self.db_where();
904 self.db_join();
905 self.db_total();
906 self.db_order();
907 self.db.page(self.page as i32, self.limit as i32);
908
909 self.data = self.db.select();
910 self.db_table();
911
912 object! {
913 "pages"=>self.pages,
914 "total"=>self.total,
915 "data"=>self.data.clone(),
916 "columns"=>self.columns(),
917 "filter_fields"=>self.filter_fields.clone(),
918 "search_name"=>self.search_name.clone(),
919 "total_fields"=>self.total_fields.clone(),
920 "btn_all"=>array![],
921 "btn_api"=>array![],
922 "btn_ids"=>array![],
923 "label_field"=>label_field
924 }
925 }
926
927 pub fn get_tree(&mut self, pid_field: &str) -> JsonValue {
928 self.db.table(&self.main_table);
929 self.set_version(1);
930 self.db
931 .where_and(pid_field, "=", self.pid_id.clone().into());
932 self.db_fields();
933 self.db_search();
934 self.db_where();
935 self.db_join();
936 self.db_total();
937 self.db_order();
938 if self.pid_id.is_empty() {
939 self.db.page(self.page as i32, self.limit as i32);
940 } else {
941 self.db.page(1, 1000);
942 }
943
944 self.data = self.db.select();
945 self.db_table_tree(pid_field);
946
947 object! {
948 "pages"=>self.pages,
949 "total"=>self.total,
950 "data"=>self.data.clone(),
951 "columns"=>self.columns(),
952 "filter_fields"=>self.filter_fields.clone(),
953 "search_name"=>self.search_name.clone(),
954 "total_fields"=>self.total_fields.clone(),
955 "btn_all"=>array![],
956 "btn_api"=>array![],
957 "btn_ids"=>array![]
958 }
959 }
960 pub fn get_table_edit(&mut self) -> JsonValue {
961 self.db.table(&self.main_table);
962 self.db_fields();
963 self.db_search();
964 self.db_where();
965 self.db_total();
966 self.db_order();
967 self.db.page(self.page as i32, self.limit as i32);
968 self.db_join();
969 self.data = self.db.select();
970
971 object! {
972 "pages"=>self.pages,
973 "total"=>self.total,
974 "data"=>self.data.clone(),
975 "columns"=>self.columns(),
976 "edit_fields"=>self.edit_fields.clone(),
977 }
978 }
979 pub fn get_table_select(&mut self) -> JsonValue {
980 self.db.table(&self.main_table);
981 if !self.primary_key.eq("id") {
982 self.fields_keys.remove(0);
983 }
984 if !self.value.is_empty() && self.search.is_empty() {
985 let _ = self
986 .where_or
987 .push(array![self.primary_key.clone(), "in", self.value.clone()]);
988 let _ = self
989 .where_or
990 .push(array![self.primary_key.clone(), "isnot", "NULL"]);
991 let _ = self.order.push(array![
992 format!(
993 "{} in ('{}')",
994 self.primary_key.clone(),
995 self.value.join("','")
996 ),
997 true
998 ]);
999 }
1000 self.db_fields();
1001 self.db_search();
1002 self.db_where();
1003 self.db_join();
1004 self.db_total();
1005 self.db_order();
1006 self.db.page(self.page as i32, self.limit as i32);
1007
1008 let mut list = self.db.select();
1009
1010 for item in list.members_mut() {
1011 let value = item[self.primary_key.clone()].clone();
1012 if self.primary_key.eq("id") {
1013 item.remove(&self.primary_key.clone());
1014 }
1015 let label = item
1016 .entries()
1017 .map(|(_, v)| v.to_string())
1018 .collect::<Vec<String>>();
1019 let _ = self.data.push(object! {
1020 value: value,
1021 label: label.join(" | ").clone(),
1022 });
1023 }
1024
1025 object! {
1026 "pages"=>self.pages,
1027 "total"=>self.total,
1028 "data"=>self.data.clone(),
1029 }
1030 }
1031 pub fn get_table_select_tree(&mut self, pid_field: &str, label_field: &str) -> JsonValue {
1032 self.fields_keys.push(pid_field.to_string());
1033 self.db.table(&self.main_table);
1034 self.db
1035 .where_and(pid_field, "=", self.pid_id.clone().into());
1036
1037 self.db_fields();
1038 self.db_search();
1039 self.db_where();
1040 self.db_join();
1041 self.db_order();
1042 self.db.page(1, 1000);
1043
1044 self.data = self.db.select();
1045
1046 for item in self.data.members_mut() {
1047 let children = self
1048 .db
1049 .table(&self.main_table)
1050 .where_and(pid_field, "=", item["id"].clone())
1051 .count();
1052 if children.is_empty() {
1053 item["lazy"] = false.into();
1054 item["isLeaf"] = true.into();
1055 } else {
1056 item["lazy"] = true.into();
1057 }
1058 }
1059
1060 if self.pid_id.is_empty() {
1061 for id in self.value.clone() {
1062 let mut list = vec![];
1063 let mut find = self
1064 .db
1065 .table(&self.main_table)
1066 .where_and("id", "=", id.into())
1067 .field(self.fields_keys.join(",").as_str())
1068 .find();
1069 loop {
1070 let pid = find[pid_field].to_string();
1071 if pid.is_empty() {
1072 break;
1073 }
1074 find = self
1075 .db
1076 .table(&self.main_table)
1077 .where_and("id", "=", pid.into())
1078 .field(self.fields_keys.join(",").as_str())
1079 .find();
1080 list.insert(0, find.clone());
1081 }
1082 let data = &mut self.data.clone();
1083 self.tree_data(data, list.into(), 0, pid_field);
1084 self.data = data.clone();
1085 }
1086 }
1087 object! {
1088 "data"=> self.data.clone(),
1089 "label_field"=>label_field.to_string(),
1090 "pid_field"=>pid_field.to_string(),
1091 }
1092 }
1093 fn tree_data(&mut self, data: &mut JsonValue, list: JsonValue, index: usize, pid_field: &str) {
1094 let id = list[index]["id"].clone();
1095 for item in data.members_mut() {
1096 let children = self
1097 .db
1098 .table(&self.main_table)
1099 .where_and(pid_field, "=", item["id"].clone())
1100 .field(self.fields_keys.join(",").as_str())
1101 .select();
1102 if children.is_empty() {
1103 item["isLeaf"] = true.into();
1104 }
1105 if id == item["id"] && !children.is_empty() {
1106 item["children"] = children;
1107 self.tree_data(&mut item["children"], list.clone(), index + 1, pid_field);
1108 }
1109 }
1110 }
1111}