Browse Source

:sparkles: render my term list by gridjs

visuddhinanda@gmail.com 4 năm trước cách đây
mục cha
commit
0ebae665dc

+ 4 - 3
app/Http/Controllers/DhammaTermController.php

@@ -15,7 +15,7 @@ class DhammaTermController extends Controller
     public function index(Request $request)
     {
         $result=false;
-		$indexCol = ['guid','word','word_en','meaning','other_meaning','note','language','channal','updated_at'];
+		$indexCol = ['id','guid','word','word_en','meaning','other_meaning','note','language','channal','updated_at'];
 
 		switch ($request->get('view')) {
 			case 'user':
@@ -25,10 +25,11 @@ class DhammaTermController extends Controller
 				$table = DhammaTerm::select($indexCol)
 									->where('owner', $userUid);
 				if(!empty($search)){
-					$table->where('word', 'like', $search."%");
+					$table->where('word', 'like', $search."%")
+                          ->whereOr('word_en', 'like', $search."%");
 				}
 				if(!empty($request->get('order')) && !empty($request->get('dir'))){
-					$table->orderBy($request->get('order'),dir);
+					$table->orderBy($request->get('order'),$request->get('dir'));
 				}else{
 					$table->orderBy('updated_at','desc');
 				}

+ 80 - 0
public/app/term/my_dict_list-beta.php

@@ -0,0 +1,80 @@
+<?php
+require_once '../studio/index_head.php';
+?>
+<body id="file_list_body"  onLoad="my_term_onload()">
+	<script src="../channal/channal.js"></script>
+
+    <script src="../term/my_term.js"></script>
+    <script src="../term/term_edit_dlg.js"></script>
+	<link type="text/css" rel="stylesheet" href="../term/term_edit_dlg.css"/>
+	<script >
+	var gCurrPage="term";
+	</script>
+
+	<style>
+	#term {
+		background-color: var(--btn-border-color);
+
+	}
+	#term:hover{
+		background-color: var(--btn-border-color);
+		color: var(--btn-color);
+		cursor:auto;
+    }
+    #word_list{
+        width:unset;
+    }
+	#setting_user_dict_nav{
+		width:95%;
+		display:inline-flex;
+		justify-content: space-between;
+}
+	}
+	</style>
+
+<?php
+require_once '../studio/index_tool_bar.php';
+?>
+
+	<div class="index_inner" style="    margin-left: 18em;margin-top: 5em;">
+		<div id="word_list"  class="file_list_block">
+
+		<div class="tool_bar">
+	<div>
+	<?php echo $_local->gui->userdict; ?>
+	</div>
+
+	<div>
+		<span class="icon_btn_div">
+			<span class="icon_btn_tip"><?php echo $_local->gui->add; ?></span>
+			<button id="file_add" type="button" class="icon_btn" title=" ">
+				<a href="../course/my_channal_new.php">
+				<svg class="icon">
+					<use xlink:href="../studio/svg/icon.svg#ic_add_circle"></use>
+				</svg>
+				</a>
+			</button>
+		</span>
+
+		<span class="icon_btn_div">
+			<span class="icon_btn_tip"><?php echo $_local->gui->recycle_bin; ?></span>
+			<button id="to_recycle" type="button" class="icon_btn" title="delete">
+				<svg class="icon">
+					<use xlink:href="../studio/svg/icon.svg#ic_delete"></use>
+				</svg>
+			</button>
+		</span>
+	</div>
+
+</div>
+<script src="../../node_modules/gridjs/dist/gridjs.umd.js"></script>
+<link
+      href="../../node_modules/gridjs/dist/theme/mermaid.min.css"
+      rel="stylesheet"
+    />
+
+<div id="userfilelist"></div>
+<script  type="module" src="my_dict_list.js"></script>
+<?php
+require_once '../studio/index_foot.php';
+?>

+ 115 - 0
public/app/term/my_dict_list.js

@@ -0,0 +1,115 @@
+import { Grid, h } from "../../node_modules/gridjs/dist/gridjs.module.js";
+export var _rowSelected =   new Array();
+const grid = new gridjs.Grid({
+	sort: {
+		multiColumn: false,
+		server: {
+		  url: (prev, columns) => {
+		   if (!columns.length) return prev;
+		   
+		   const col = columns[0];
+		   const dir = col.direction === 1 ? 'asc' : 'desc';
+		   let colName = ['id', 'word','word_en','meaning','other_meaning','updated_at'][col.index];
+		   
+		   return `${prev}&order=${colName}&dir=${dir}`;
+		 }
+		}
+	  },
+	columns: [
+		{ 
+			name: 'Sel',
+			hidden: false,
+			sort: false,
+			formatter: (cell, row) => {
+			return h('input', {
+				type:'checkbox',
+				className: 'py-2 mb-4 px-4 border',
+				id:"cb-"+row.cells[1].data,
+				onClick: () =>{
+					let id = row.cells[1].data;
+					if(document.querySelector("#cb-"+id).checked){
+						_rowSelected.push(id);
+						console.log("checked",_rowSelected);
+					}else{
+						_rowSelected.splice(_rowSelected.findIndex(item => item ===id),1);
+						console.log("remove",_rowSelected);
+					}
+				} 
+			}, '');
+			}
+      	},
+		{
+			name: 'guid',
+			hidden: true
+		},
+		'word',
+		{
+			name:'word_en',
+			sort: false,
+            hidden: true
+		},
+		{
+			name:'meaning',
+			sort: false,
+		},
+		{
+			name:'other_meaning',
+			sort: false,
+		},
+        'updated_at',
+		{ 
+			name: 'Actions',
+			sort: false,
+			hidden:false,
+			formatter: (cell, row) => {
+			return h('button', {
+				className: 'py-2 mb-4 px-4 border rounded-md text-white bg-blue-600',
+				onClick: () =>{
+                    let id = row.cells[1].data;
+					term_edit_dlg_open(id);
+				} 
+			}, 'Edit');
+			}
+      	}
+	],
+	server: {
+		url: '/api/v2/terms?view=user',
+		then: data => data.data.rows.map(card => [null,card.guid,card.word, card.word_en, card.meaning, card.other_meaning, card.updated_at,null]),
+		total: data => data.data.count
+	  },
+	pagination: {
+		enabled: true,
+		limit:30,
+		server: {
+			url: (prev, page, limit) => `${prev}&limit=${limit}&offset=${page * limit}`
+		  }
+	},
+	search: {
+		server: {
+		  url: (prev, keyword) => `${prev}&search=${keyword}`
+		}
+	  },
+	resizable: true,
+  }).render(document.getElementById("userfilelist"));
+
+//grid.on('rowClick', (...args) => console.log('row: ' + JSON.stringify(args), args));
+//grid.on('cellClick', (...args) => console.log(cell,args));
+
+document.querySelector("#to_recycle").onclick = function(){
+	if(_rowSelected.length>0){
+		if(confirm(`删除${_rowSelected.length}个单词,此操作不能恢复。`)){
+			$.getJSON("../api/user_dicts.php",
+			{
+				op:'delete',
+				id:JSON.stringify(_rowSelected)
+			},
+			function(data){
+				if(data.ok){
+					grid.forceRender();
+					alert(`delete ok `);
+				}
+			});			
+		}
+
+	}
+}