parent
8ad68e938e
commit
d795809fb3
|
@ -1,7 +1,7 @@
|
||||||
# Gdoo协同办公
|
# Gdoo协同办公
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="http://www.gdoo.net"><img src="https://img.shields.io/badge/version-beta2.2.2-%23ff0000" alt="Build Status" /></a>
|
<a href="http://www.gdoo.net"><img src="https://img.shields.io/badge/version-beta2.2.x-%23ff0000" alt="Build Status" /></a>
|
||||||
<a href="http://www.gdoo.net"><img src="https://img.shields.io/badge/laravel-8.0-%23ef3b2d" alt="laravel framework" /></a>
|
<a href="http://www.gdoo.net"><img src="https://img.shields.io/badge/laravel-8.0-%23ef3b2d" alt="laravel framework" /></a>
|
||||||
<a href="http://www.gdoo.net"><img src="https://img.shields.io/badge/gdooFramework-1.0-%234c5ec2" alt="Gdoo快速开发框架" /></a>
|
<a href="http://www.gdoo.net"><img src="https://img.shields.io/badge/gdooFramework-1.0-%234c5ec2" alt="Gdoo快速开发框架" /></a>
|
||||||
<a href="http://www.gdoo.net"><img src="https://img.shields.io/badge/MYSQL-8.0-%2300758f" alt="License" /></a>
|
<a href="http://www.gdoo.net"><img src="https://img.shields.io/badge/MYSQL-8.0-%2300758f" alt="License" /></a>
|
||||||
|
|
|
@ -43,6 +43,16 @@ class ArticleController extends DefaultController
|
||||||
'display' => $this->access['edit'],
|
'display' => $this->access['edit'],
|
||||||
]];
|
]];
|
||||||
|
|
||||||
|
$header['buttons'] = [
|
||||||
|
['name' => '删除', 'icon' => 'fa-remove', 'action' => 'delete', 'display' => $this->access['delete']],
|
||||||
|
['name' => '导出', 'icon' => 'fa-share', 'action' => 'export', 'display' => 1],
|
||||||
|
];
|
||||||
|
|
||||||
|
$header['cols'] = $cols;
|
||||||
|
$header['tabs'] = Article::$tabs;
|
||||||
|
$header['bys'] = Article::$bys;
|
||||||
|
$header['js'] = Grid::js($header);
|
||||||
|
|
||||||
$search = $header['search_form'];
|
$search = $header['search_form'];
|
||||||
$query = $search['query'];
|
$query = $search['query'];
|
||||||
|
|
||||||
|
@ -64,13 +74,14 @@ class ArticleController extends DefaultController
|
||||||
$model->permission('receive_id', null, false, true, false, 'created_id');
|
$model->permission('receive_id', null, false, true, false, 'created_id');
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查询是否已经阅读
|
// 是否已经阅读
|
||||||
$reader = function ($q) {
|
$reader = function ($q) {
|
||||||
$q->selectRaw('1')
|
$q->selectRaw('1')
|
||||||
->from('article_reader')
|
->from('article_reader')
|
||||||
->whereRaw('article_reader.article_id = article.id')
|
->whereRaw('article_reader.article_id = article.id')
|
||||||
->where('article_reader.created_id', auth()->id());
|
->where('article_reader.created_id', auth()->id());
|
||||||
};
|
};
|
||||||
|
|
||||||
if ($query['tab'] == 'done') {
|
if ($query['tab'] == 'done') {
|
||||||
$model->whereExists($reader);
|
$model->whereExists($reader);
|
||||||
}
|
}
|
||||||
|
@ -81,27 +92,11 @@ class ArticleController extends DefaultController
|
||||||
$model->select($header['select']);
|
$model->select($header['select']);
|
||||||
$rows = $model->paginate($query['limit'])->appends($query);
|
$rows = $model->paginate($query['limit'])->appends($query);
|
||||||
|
|
||||||
$header['cols'] = $cols;
|
return Grid::dataFilters($rows, $header, function($item) {
|
||||||
$header['tabs'] = Article::$tabs;
|
|
||||||
$header['bys'] = Article::$bys;
|
|
||||||
$header['js'] = Grid::js($header);
|
|
||||||
|
|
||||||
$items = Grid::dataFilters($rows, $header, function($item) {
|
|
||||||
return $item;
|
return $item;
|
||||||
});
|
});
|
||||||
return $items;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$header['buttons'] = [
|
|
||||||
['name' => '删除', 'icon' => 'fa-remove', 'action' => 'delete', 'display' => $this->access['delete']],
|
|
||||||
['name' => '导出', 'icon' => 'fa-share', 'action' => 'export', 'display' => 1],
|
|
||||||
];
|
|
||||||
|
|
||||||
$header['cols'] = $cols;
|
|
||||||
$header['tabs'] = Article::$tabs;
|
|
||||||
$header['bys'] = Article::$bys;
|
|
||||||
$header['js'] = Grid::js($header);
|
|
||||||
|
|
||||||
return $this->display([
|
return $this->display([
|
||||||
'header' => $header,
|
'header' => $header,
|
||||||
]);
|
]);
|
||||||
|
|
|
@ -30,7 +30,7 @@ class WidgetController extends DefaultController
|
||||||
};
|
};
|
||||||
$model->whereNotExists($reader);
|
$model->whereNotExists($reader);
|
||||||
|
|
||||||
$rows = $model->get(['id', 'title', 'created_at']);
|
$rows = $model->get(['id', 'name', 'created_at']);
|
||||||
|
|
||||||
$json['total'] = sizeof($rows);
|
$json['total'] = sizeof($rows);
|
||||||
$json['data'] = $rows;
|
$json['data'] = $rows;
|
||||||
|
|
|
@ -1,59 +1,66 @@
|
||||||
{{$header["js"]}}
|
<div id="{{$header['master_table']}}-controller">
|
||||||
|
<div class="panel no-border">
|
||||||
<div class="panel no-border" id="{{$header['master_table']}}-controller">
|
@include('headers')
|
||||||
@include('headers')
|
<div class='list-jqgrid'>
|
||||||
<div class='list-jqgrid'>
|
<div id="{{$header['master_table']}}-grid" style="width:100%;" class="ag-theme-balham"></div>
|
||||||
<div id="{{$header['master_table']}}-grid" style="width:100%;" class="ag-theme-balham"></div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{{$header["js"]}}
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
(function ($) {
|
|
||||||
var table = '{{$header["master_table"]}}';
|
|
||||||
var config = gdoo.grids[table];
|
|
||||||
var action = config.action;
|
|
||||||
var search = config.search;
|
|
||||||
|
|
||||||
action.dialogType = 'layer';
|
(function ($) {
|
||||||
|
var header = {{json_encode($header, JSON_UNESCAPED_UNICODE)}};
|
||||||
|
|
||||||
// 自定义搜索方法
|
var table = '{{$header["master_table"]}}';
|
||||||
search.searchInit = function (e) {
|
var config = gdoo.grids[table];
|
||||||
var self = this;
|
var action = config.action;
|
||||||
|
var search = config.search;
|
||||||
|
|
||||||
|
action.dialogType = 'layer';
|
||||||
|
|
||||||
|
// 自定义搜索方法
|
||||||
|
search.searchInit = function (e) {
|
||||||
|
var self = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
var options = new agGridOptions();
|
||||||
|
var gridDiv = document.querySelector("#{{$header['master_table']}}-grid");
|
||||||
|
gridDiv.style.height = getPanelHeight(48);
|
||||||
|
|
||||||
|
options.remoteDataUrl = '{{url()}}';
|
||||||
|
options.remoteParams = search.advanced.query;
|
||||||
|
options.columnDefs = config.cols;
|
||||||
|
options.onRowDoubleClicked = function (params) {
|
||||||
|
if (params.node.rowPinned) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
if (params.data == undefined) {
|
||||||
var options = new agGridOptions();
|
return;
|
||||||
var gridDiv = document.querySelector("#{{$header['master_table']}}-grid");
|
}
|
||||||
gridDiv.style.height = getPanelHeight(48);
|
if (params.data.master_id > 0) {
|
||||||
|
action.show(params.data);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
options.remoteDataUrl = '{{url()}}';
|
new agGrid.Grid(gridDiv, options);
|
||||||
options.remoteParams = search.advanced.query;
|
|
||||||
options.columnDefs = config.cols;
|
|
||||||
options.onRowDoubleClicked = function (params) {
|
|
||||||
if (params.node.rowPinned) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (params.data == undefined) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (params.data.master_id > 0) {
|
|
||||||
action.show(params.data);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
new agGrid.Grid(gridDiv, options);
|
// 读取数据
|
||||||
|
options.remoteData({page: 1});
|
||||||
|
|
||||||
// 读取数据
|
// 绑定自定义事件
|
||||||
options.remoteData({page: 1});
|
var $gridDiv = $(gridDiv);
|
||||||
|
$gridDiv.on('click', '[data-toggle="event"]', function () {
|
||||||
// 绑定自定义事件
|
var data = $(this).data();
|
||||||
var $gridDiv = $(gridDiv);
|
if (data.master_id > 0) {
|
||||||
$gridDiv.on('click', '[data-toggle="event"]', function () {
|
action[data.action](data);
|
||||||
var data = $(this).data();
|
}
|
||||||
if (data.master_id > 0) {
|
});
|
||||||
action[data.action](data);
|
config.grid = options;
|
||||||
}
|
|
||||||
});
|
|
||||||
config.grid = options;
|
|
||||||
})(jQuery);
|
|
||||||
|
|
||||||
|
})(jQuery);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@include('footers')
|
@include('footers')
|
|
@ -0,0 +1,105 @@
|
||||||
|
<style>
|
||||||
|
.vue-list-page .search-inline-form .form-group {
|
||||||
|
margin-left: 4px;
|
||||||
|
}
|
||||||
|
.vue-list-page .btn-group {
|
||||||
|
margin-left: 4px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<div class="vue-list-page" id="{{$header['master_table']}}-controller">
|
||||||
|
<div class="panel no-border">
|
||||||
|
@include('headers3')
|
||||||
|
<div class='list-jqgrid'>
|
||||||
|
<div id="{{$header['master_table']}}-grid" style="width:100%;" class="ag-theme-balham"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{$header["js"]}}
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
(function ($) {
|
||||||
|
var header = {{json_encode($header, JSON_UNESCAPED_UNICODE)}};
|
||||||
|
|
||||||
|
var table = '{{$header["master_table"]}}';
|
||||||
|
var config = gdoo.grids[table];
|
||||||
|
var action = config.action;
|
||||||
|
var search = config.search;
|
||||||
|
|
||||||
|
const vueData = {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
header: {},
|
||||||
|
tab_active: '',
|
||||||
|
}
|
||||||
|
},mounted() {
|
||||||
|
abc(this);
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
url(url, query) {
|
||||||
|
var me = this;
|
||||||
|
let params = Vue.toRaw(me.header.search_form.params);
|
||||||
|
for (const key in query) {
|
||||||
|
params[key] = query[key];
|
||||||
|
}
|
||||||
|
return app.url(url, params);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Vue.createApp(vueData).mount("#{{$header['master_table']}}-controller");
|
||||||
|
|
||||||
|
function abc(vue) {
|
||||||
|
|
||||||
|
action.dialogType = 'layer';
|
||||||
|
|
||||||
|
// 自定义搜索方法
|
||||||
|
search.searchInit = function (e) {
|
||||||
|
var self = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
var options = new agGridOptions();
|
||||||
|
var gridDiv = document.querySelector("#{{$header['master_table']}}-grid");
|
||||||
|
gridDiv.style.height = getPanelHeight(48);
|
||||||
|
|
||||||
|
options.remoteDataUrl = '{{url()}}';
|
||||||
|
options.remoteParams = search.advanced.query;
|
||||||
|
options.columnDefs = config.cols;
|
||||||
|
options.onRowDoubleClicked = function (params) {
|
||||||
|
if (params.node.rowPinned) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (params.data == undefined) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (params.data.master_id > 0) {
|
||||||
|
action.show(params.data);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
new agGrid.Grid(gridDiv, options);
|
||||||
|
|
||||||
|
// 读取数据
|
||||||
|
options.remoteData({page: 1});
|
||||||
|
|
||||||
|
options.remoteSuccessed = function(res) {
|
||||||
|
vue.header = res.header;
|
||||||
|
vue.tab_active = vue.header.search_form.params['tab'] ? vue.header.search_form.params['tab'] : vue.header.tabs.items[0].value;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 绑定自定义事件
|
||||||
|
var $gridDiv = $(gridDiv);
|
||||||
|
$gridDiv.on('click', '[data-toggle="event"]', function () {
|
||||||
|
var data = $(this).data();
|
||||||
|
if (data.master_id > 0) {
|
||||||
|
action[data.action](data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
config.grid = options;
|
||||||
|
}
|
||||||
|
|
||||||
|
})(jQuery);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
@include('footers')
|
|
@ -53,7 +53,7 @@ class Form
|
||||||
$_table = $data_link.'_'.$data_type;
|
$_table = $data_link.'_'.$data_type;
|
||||||
|
|
||||||
if ($field['type']) {
|
if ($field['type']) {
|
||||||
$join[$_table] = [$data_type.' as '.$_table, $_table.'.id', '=', $table.'.'.$data_link];
|
$join[$_table] = [$data_type.' as '.$_table, $_table.'.id', '=', $table.'.'.$data_link, $table, 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
$links[$data_link][$data_link] = 'id';
|
$links[$data_link][$data_link] = 'id';
|
||||||
|
@ -76,7 +76,7 @@ class Form
|
||||||
$_table = $field['field'].'_'.$_t1;
|
$_table = $field['field'].'_'.$_t1;
|
||||||
}
|
}
|
||||||
|
|
||||||
$join[$_table] = [$_t1.' as '.$_table, $_table.'.id', '=', $data_link.'_'.$data_type.'.'.$_v2];
|
$join[$_table] = [$_t1.' as '.$_table, $_table.'.id', '=', $data_link.'_'.$data_type.'.'.$_v2, $data_link.'_'.$data_type, 1];
|
||||||
|
|
||||||
$index = $_table.'.'.$_t2;
|
$index = $_table.'.'.$_t2;
|
||||||
if ($field['field'] == $data_link) {
|
if ($field['field'] == $data_link) {
|
||||||
|
@ -141,6 +141,7 @@ class Form
|
||||||
foreach($fields as $field) {
|
foreach($fields as $field) {
|
||||||
static::fieldRelated($table, $field, $join, $select, $links);
|
static::fieldRelated($table, $field, $join, $select, $links);
|
||||||
}
|
}
|
||||||
|
$join = Grid::sortJoin($join);
|
||||||
|
|
||||||
$q = DB::table($table)
|
$q = DB::table($table)
|
||||||
->where($table.'.id', (int)$options['id']);
|
->where($table.'.id', (int)$options['id']);
|
||||||
|
@ -1986,13 +1987,13 @@ class Form
|
||||||
return hash_equals($sessionToken, $token);
|
return hash_equals($sessionToken, $token);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function dataFilter($table, $fields, $permissions, $master, $values)
|
public static function dataFilter($table, $fields, $permissions, $master, $values, &$dataFiles)
|
||||||
{
|
{
|
||||||
$permission = $permissions[$table];
|
$permission = $permissions[$table];
|
||||||
|
|
||||||
foreach ($values as $key => $value) {
|
foreach ($fields as $field) {
|
||||||
|
|
||||||
$field = $fields[$key];
|
$key = $field['field'];
|
||||||
$setting = $field['setting'];
|
$setting = $field['setting'];
|
||||||
$value = $values[$key];
|
$value = $values[$key];
|
||||||
$row = $permission[$key];
|
$row = $permission[$key];
|
||||||
|
@ -2042,7 +2043,11 @@ class Form
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'checkbox':
|
case 'checkbox':
|
||||||
$value = intval($value);
|
if (is_array($value)) {
|
||||||
|
$value = join(",", (array)$value);
|
||||||
|
} else {
|
||||||
|
$value = intval($value);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
$values[$key] = $value;
|
$values[$key] = $value;
|
||||||
|
@ -2103,7 +2108,7 @@ class Form
|
||||||
|
|
||||||
// 格式化子表数据格式
|
// 格式化子表数据格式
|
||||||
foreach ($rows as $i => $row) {
|
foreach ($rows as $i => $row) {
|
||||||
$rows[$i] = static::dataFilter($table, $fields, $permissions, $master, $row);
|
$rows[$i] = static::dataFilter($table, $fields, $permissions, $master, $row, $dataFiles);
|
||||||
}
|
}
|
||||||
|
|
||||||
$datas[] = [
|
$datas[] = [
|
||||||
|
@ -2115,7 +2120,7 @@ class Form
|
||||||
];
|
];
|
||||||
} else {
|
} else {
|
||||||
// 处理主表的字段格式
|
// 处理主表的字段格式
|
||||||
$gets[$t] = static::dataFilter($table, $fields, $permissions, $master, $gets[$t]);
|
$gets[$t] = static::dataFilter($table, $fields, $permissions, $master, $gets[$t], $dataFiles);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,7 @@ class Grid
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($item['province_id']) {
|
if ($item['province_id']) {
|
||||||
$region_ids[$item['province_id']] = $item['province_id'];
|
$region_ids[$item['province_id']] = $item['province_id'];
|
||||||
$region_ids[$item['city_id']] = $item['city_id'];
|
$region_ids[$item['city_id']] = $item['city_id'];
|
||||||
|
@ -96,6 +97,15 @@ class Grid
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$_header = $header;
|
||||||
|
unset($_header['columns']);
|
||||||
|
unset($_header['dialogs']);
|
||||||
|
unset($_header['join']);
|
||||||
|
unset($_header['js']);
|
||||||
|
unset($_header['raw_select']);
|
||||||
|
unset($_header['search']);
|
||||||
|
unset($_header['select']);
|
||||||
|
|
||||||
$header['runs'] = $runs;
|
$header['runs'] = $runs;
|
||||||
$header['dialogs'] = $dialogs;
|
$header['dialogs'] = $dialogs;
|
||||||
$header['regions'] = $regions;
|
$header['regions'] = $regions;
|
||||||
|
@ -111,7 +121,7 @@ class Grid
|
||||||
} else {
|
} else {
|
||||||
$ret = collect(['data' => $rows]);
|
$ret = collect(['data' => $rows]);
|
||||||
}
|
}
|
||||||
$ret['header'] = $header;
|
$ret['header'] = $_header;
|
||||||
return $ret;
|
return $ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -290,6 +300,25 @@ class Grid
|
||||||
return $rows;
|
return $rows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 重新排序join
|
||||||
|
public static function sortJoin($joins)
|
||||||
|
{
|
||||||
|
foreach ($joins as $k => $join) {
|
||||||
|
static::recursiveJoin($joins, $k);
|
||||||
|
}
|
||||||
|
array_multisort(array_column($joins, 5), SORT_ASC, $joins);
|
||||||
|
return $joins;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function recursiveJoin(&$joins, $parent_id = 0) {
|
||||||
|
foreach($joins as $k => &$join) {
|
||||||
|
if ($join[4] == $parent_id) {
|
||||||
|
$join[5] = $joins[$parent_id][5] + 1;
|
||||||
|
static::recursiveJoin($joins, $k);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static function fieldRelated($table, $row, &$join, &$select, &$index, &$column, &$search, $setting)
|
public static function fieldRelated($table, $row, &$join, &$select, &$index, &$column, &$search, $setting)
|
||||||
{
|
{
|
||||||
if ($row['data_type']) {
|
if ($row['data_type']) {
|
||||||
|
@ -299,7 +328,7 @@ class Grid
|
||||||
$_table = $data_link.'_'.$data_type;
|
$_table = $data_link.'_'.$data_type;
|
||||||
|
|
||||||
if ($row['type']) {
|
if ($row['type']) {
|
||||||
$join[$_table] = [$data_type.' as '.$_table, $_table.'.id', '=', $table.'.'.$data_link];
|
$join[$_table] = [$data_type.' as '.$_table, $_table.'.id', '=', $table.'.'.$data_link, $table, 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
$field_count = mb_substr_count($data_field, ':');
|
$field_count = mb_substr_count($data_field, ':');
|
||||||
|
@ -314,8 +343,8 @@ class Grid
|
||||||
} else {
|
} else {
|
||||||
$_table = $row['field'].'_'.$_t1;
|
$_table = $row['field'].'_'.$_t1;
|
||||||
}
|
}
|
||||||
|
|
||||||
$join[$_table] = [$_t1.' as '.$_table, $_table.'.id', '=', $data_link.'_'.$data_type.'.'.$_v2];
|
$join[$_table] = [$_t1.' as '.$_table, $_table.'.id', '=', $data_link.'_'.$data_type.'.'.$_v2, $data_link.'_'.$data_type, 1];
|
||||||
|
|
||||||
$index = $_table.'.'.$_t2;
|
$index = $_table.'.'.$_t2;
|
||||||
|
|
||||||
|
@ -461,7 +490,7 @@ class Grid
|
||||||
if ($_model['parent_id'] > 0) {
|
if ($_model['parent_id'] > 0) {
|
||||||
$select[$_model['table'].'.id'] = [];
|
$select[$_model['table'].'.id'] = [];
|
||||||
}
|
}
|
||||||
$join[] = [$_model['table'], $_model['table'].'.'.$_model['relation'], '=', $master['table'].'.id'];
|
$join[] = [$_model['table'], $_model['table'].'.'.$_model['relation'], '=', $master['table'].'.id', $master['table'], 0];
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -549,7 +578,7 @@ class Grid
|
||||||
}
|
}
|
||||||
|
|
||||||
static::fieldRelated($_table, $row, $join, $select, $index, $column, $_search, $setting);
|
static::fieldRelated($_table, $row, $join, $select, $index, $column, $_search, $setting);
|
||||||
if ($row['is_link']) {
|
if (isset($left_fields[$field])) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -842,11 +871,8 @@ class Grid
|
||||||
|
|
||||||
$res['select'] = $src_select;
|
$res['select'] = $src_select;
|
||||||
$res['raw_select'] = $raw_select;
|
$res['raw_select'] = $raw_select;
|
||||||
|
$res['join'] = static::sortJoin($join);
|
||||||
|
|
||||||
//print_r($join);
|
|
||||||
//print_r($select);
|
|
||||||
|
|
||||||
$res['join'] = $join;
|
|
||||||
$res['search'] = $search;
|
$res['search'] = $search;
|
||||||
$res['search_form'] = $search_form;
|
$res['search_form'] = $search_form;
|
||||||
|
|
||||||
|
|
|
@ -1243,7 +1243,6 @@ class FieldService
|
||||||
|
|
||||||
if ($field['is_print']) {
|
if ($field['is_print']) {
|
||||||
foreach ($select as $t) {
|
foreach ($select as $t) {
|
||||||
$attribute = $field['attribute'];
|
|
||||||
$n = $v = '';
|
$n = $v = '';
|
||||||
list($n, $v) = explode('|', $t);
|
list($n, $v) = explode('|', $t);
|
||||||
$v = is_null($v) ? trim($n) : trim($v);
|
$v = is_null($v) ? trim($n) : trim($v);
|
||||||
|
@ -1260,7 +1259,6 @@ class FieldService
|
||||||
$name = $attribute['name'];
|
$name = $attribute['name'];
|
||||||
|
|
||||||
foreach ($select as $i => $t) {
|
foreach ($select as $i => $t) {
|
||||||
|
|
||||||
$n = $v = '';
|
$n = $v = '';
|
||||||
list($n, $v) = explode('|', $t);
|
list($n, $v) = explode('|', $t);
|
||||||
$v = is_null($v) ? trim($n) : trim($v);
|
$v = is_null($v) ? trim($n) : trim($v);
|
||||||
|
@ -1278,55 +1276,71 @@ class FieldService
|
||||||
public static function content_checkbox($field, $content = '', $row = [], $permission = [])
|
public static function content_checkbox($field, $content = '', $row = [], $permission = [])
|
||||||
{
|
{
|
||||||
$field = static::content_field($field);
|
$field = static::content_field($field);
|
||||||
|
// 配置
|
||||||
$setting = $field['setting'];
|
$setting = $field['setting'];
|
||||||
$default = $setting['default'];
|
$default = $setting['default'];
|
||||||
$content = is_null($content) ? $default : $content;
|
$content = is_null($content) ? $default : $content;
|
||||||
$str = [];
|
$checkeds = [];
|
||||||
|
$items = [];
|
||||||
|
$values = explode(",", $content);
|
||||||
|
|
||||||
$attribute = $field['attribute'];
|
if ($setting['type']) {
|
||||||
$id = $attribute['id'];
|
$items = DB::table($setting['type'])->where('status', 1)->orderBy('sort', 'asc')->get();
|
||||||
$name = $attribute['name'];
|
|
||||||
|
|
||||||
$_select = explode("\n", $setting['content']);
|
|
||||||
if ($field['is_print']) {
|
|
||||||
foreach ($_select as $t) {
|
|
||||||
$n = $v = '';
|
|
||||||
list($n, $v) = explode('|', $t);
|
|
||||||
$v = is_null($v) ? trim($n) : trim($v);
|
|
||||||
if ($row[$v] == 1) {
|
|
||||||
$str[] = $n;
|
|
||||||
}
|
|
||||||
if ($v == $content) {
|
|
||||||
$str[] = $n;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return join(',', $str);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($field['type']) {
|
|
||||||
$checked = $content == 1 ? 'checked="checked"' : '';
|
|
||||||
if ($field['is_show']) {
|
|
||||||
$str[] = '<label class="i-checks i-checks-sm m-b-none" style="font-weight:normal;"><input type="checkbox" disabled="disabled" '.$checked.'><i></i>'.$field['name'].'</label>';
|
|
||||||
} else {
|
|
||||||
$str[] = '<label class="i-checks i-checks-sm m-t-xs m-b-none" style="font-weight:normal;"><input type="checkbox" id="'. $id .'" name="'. $name . '" value="1" '.$checked.'><i></i>'.$field['name'].'</label>';
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
foreach ($_select as $t) {
|
if (not_empty($setting['content'])) {
|
||||||
$n = $v = '';
|
$selects = explode("\n", $setting['content']);
|
||||||
list($n, $v) = explode('|', $t);
|
foreach ($selects as $select) {
|
||||||
$v = is_null($v) ? trim($n) : trim($v);
|
$n = $v = '';
|
||||||
$checked = $row[$v] == 1 ? 'checked="checked"' : '';
|
list($n, $v) = explode('|', $select);
|
||||||
if ($field['is_show']) {
|
$v = is_null($v) ? trim($n) : trim($v);
|
||||||
$str[] = '<label class="i-checks i-checks-sm m-b-none" style="font-weight:normal;"><input type="checkbox" disabled="disabled" '.$checked.'><i></i>'.$n.'</label>';
|
$items[] = ['id' => $v, 'name' => $n];
|
||||||
} else {
|
|
||||||
$w = $permission[$v]['w'] == 1 ? '' : 'disabled="disabled"';
|
|
||||||
$disabled = $permission[$v]['w'] == 1 ? '' : 'i-checks-disabled';
|
|
||||||
$str[] = '<label class="i-checks '.$disabled.' i-checks-sm m-t-xs m-b-none" style="font-weight:normal;"><input type="checkbox" '.$w.' id="'. $field['table'] . '_'.$v.'" name="'. $field['table'] . '['.$v.']" value="1" '.$checked.'><i></i>'.$n.'</label>';
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
$items[] = ['id' => 1, 'name' => $field['name']];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return join(' ', $str);
|
// 打印模式直接返回选中的值名称
|
||||||
|
if ($field['is_print']) {
|
||||||
|
foreach ($items as $item) {
|
||||||
|
if ($field['type']) {
|
||||||
|
if (in_array($item['id'], $values)) {
|
||||||
|
$checkeds[] = $item['name'];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ($row[$item['id']] == 1) {
|
||||||
|
$checkeds[] = $item['name'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return join(',', $checkeds);
|
||||||
|
}
|
||||||
|
|
||||||
|
$str = [];
|
||||||
|
foreach ($items as $item) {
|
||||||
|
|
||||||
|
// 存在字段
|
||||||
|
if ($field['type']) {
|
||||||
|
$value = $v;
|
||||||
|
$checked = in_array($v, $values) ? 'checked="checked"' : '';
|
||||||
|
$name = $field['table'].'['.$field['field'].']['.$v.']';
|
||||||
|
$key = $field['field'];
|
||||||
|
} else {
|
||||||
|
$value = 1;
|
||||||
|
$checked = $row[$item['id']] == $value ? 'checked="checked"' : '';
|
||||||
|
$name = $field['table'].'['.$item['id'].']';
|
||||||
|
$key = $item['id'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($field['is_show']) {
|
||||||
|
$str[] = '<label class="i-checks i-checks-sm m-r-xs m-b-none"><input type="checkbox" id="'. $field['table'].'_'.$item['id'].'" disabled="disabled" '.$checked.'><i></i>'.$item['name'].'</label>';
|
||||||
|
} else {
|
||||||
|
$w = $permission[$key]['w'] == 1 ? '' : 'disabled="disabled"';
|
||||||
|
$disabled = $permission[$key]['w'] == 1 ? '' : 'i-checks-disabled';
|
||||||
|
$str[] = '<label class="i-checks '.$disabled.' i-checks-sm m-t-xs m-r-xs m-b-none"><input type="checkbox" '.$w.' id="'. $field['table'].'_'.$item['id'].'" name="'.$name.'" value="'.$value.'" '.$checked.'><i></i>'.$item['name'].'</label>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return join(' ', $str);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function content_image($field, $content = '')
|
public static function content_image($field, $content = '')
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1550,6 +1550,9 @@ select.input-sm, select.form-group-sm .form-control {
|
||||||
.form-controller .i-checks-disabled i {
|
.form-controller .i-checks-disabled i {
|
||||||
background-color: #eeeeee;
|
background-color: #eeeeee;
|
||||||
}
|
}
|
||||||
|
.form-controller .i-checks {
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
@media all and (max-width: 767px) {
|
@media all and (max-width: 767px) {
|
||||||
.form-controller .control-label {
|
.form-controller .control-label {
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -504,6 +504,11 @@ function getPanelHeight(v) {
|
||||||
gridOptions.api.showLoadingOverlay();
|
gridOptions.api.showLoadingOverlay();
|
||||||
$.post(gridOptions.remoteDataUrl, remoteParams, function (res) {
|
$.post(gridOptions.remoteDataUrl, remoteParams, function (res) {
|
||||||
|
|
||||||
|
if (typeof success === 'function') {
|
||||||
|
success(res);
|
||||||
|
}
|
||||||
|
gridOptions.remoteSuccessed.call(gridOptions, res);
|
||||||
|
|
||||||
if (res.per_page) {
|
if (res.per_page) {
|
||||||
if (me.pagerDom === null) {
|
if (me.pagerDom === null) {
|
||||||
var div = me.api.gridCore.eGridDiv;
|
var div = me.api.gridCore.eGridDiv;
|
||||||
|
@ -531,11 +536,6 @@ function getPanelHeight(v) {
|
||||||
gridOptions.api.setRowData(res.data);
|
gridOptions.api.setRowData(res.data);
|
||||||
gridOptions.generatePinnedBottomData();
|
gridOptions.generatePinnedBottomData();
|
||||||
|
|
||||||
if (typeof success === 'function') {
|
|
||||||
success(res);
|
|
||||||
}
|
|
||||||
gridOptions.remoteSuccessed.call(gridOptions, res.data);
|
|
||||||
|
|
||||||
}, 'json');
|
}, 'json');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -548,17 +548,17 @@ function getPanelHeight(v) {
|
||||||
gridOptions.api.showLoadingOverlay();
|
gridOptions.api.showLoadingOverlay();
|
||||||
$.post(gridOptions.remoteDataUrl, remoteParams, function (res) {
|
$.post(gridOptions.remoteDataUrl, remoteParams, function (res) {
|
||||||
|
|
||||||
gridOptions.api.hideOverlay();
|
|
||||||
gridOptions.api.setRowData(res.data);
|
|
||||||
gridOptions.generatePinnedBottomData();
|
|
||||||
if (typeof success === 'function') {
|
if (typeof success === 'function') {
|
||||||
success(res);
|
success(res);
|
||||||
}
|
}
|
||||||
gridOptions.remoteSuccessed.call(gridOptions, res.data);
|
gridOptions.remoteSuccessed.call(gridOptions, res);
|
||||||
|
|
||||||
|
gridOptions.api.hideOverlay();
|
||||||
|
gridOptions.api.setRowData(res.data);
|
||||||
|
gridOptions.generatePinnedBottomData();
|
||||||
|
|
||||||
}, 'json');
|
}, 'json');
|
||||||
}
|
}
|
||||||
|
|
||||||
return gridOptions;
|
return gridOptions;
|
||||||
}
|
}
|
||||||
window.agGridOptions = agGridOptions;
|
window.agGridOptions = agGridOptions;
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1,8 +1,8 @@
|
||||||
{
|
{
|
||||||
"/assets/dist/bundle.min.js": "/assets/dist/bundle.min.js?id=6ed6b193096450339853",
|
"/assets/dist/bundle.min.js": "/assets/dist/bundle.min.js?id=6ed6b193096450339853",
|
||||||
"/assets/dist/app.min.js": "/assets/dist/app.min.js?id=7f970b0394bf5cba9353",
|
"/assets/dist/app.min.js": "/assets/dist/app.min.js?id=6b963e5843726542f368",
|
||||||
"/assets/dist/app.min.css": "/assets/dist/app.min.css?id=b145e2781689d581fc3f",
|
"/assets/dist/app.min.css": "/assets/dist/app.min.css?id=290d60b320ac8f048b29",
|
||||||
"/assets/vendor/ag-grid/ag-grid.min.css": "/assets/vendor/ag-grid/ag-grid.min.css?id=0e414057cb24126f35ae",
|
"/assets/vendor/ag-grid/ag-grid.min.css": "/assets/vendor/ag-grid/ag-grid.min.css?id=0e414057cb24126f35ae",
|
||||||
"/assets/dist/index.min.js": "/assets/dist/index.min.js?id=ed7b4656fa575c6e2308",
|
"/assets/dist/index.min.js": "/assets/dist/index.min.js?id=0b5199e460c9072a6bee",
|
||||||
"/assets/dist/index.min.css": "/assets/dist/index.min.css?id=5ef88862b299dea834f5"
|
"/assets/dist/index.min.css": "/assets/dist/index.min.css?id=2a1c8520e6db7b17f69a"
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,5 +31,6 @@
|
||||||
var data = $(this).data();
|
var data = $(this).data();
|
||||||
action[data.action]();
|
action[data.action]();
|
||||||
});
|
});
|
||||||
|
|
||||||
})(jQuery);
|
})(jQuery);
|
||||||
</script>
|
</script>
|
|
@ -0,0 +1,158 @@
|
||||||
|
@verbatim
|
||||||
|
<template v-if="header.tabs && header.tabs.items.length > 0">
|
||||||
|
<div class="panel-heading tabs-box">
|
||||||
|
<ul class="nav nav-tabs">
|
||||||
|
<template v-for="tab in header.tabs.items">
|
||||||
|
<li :class="header.tab_active == tab.value ? 'active' : ''">
|
||||||
|
<a class="text-sm" :href="url(tab.url,{tab:tab.value})">{{tab.name}}</a>
|
||||||
|
</li>
|
||||||
|
</template>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<div class="wrapper-xs">
|
||||||
|
<div class="pull-right">
|
||||||
|
<template v-for="button in header.right_buttons">
|
||||||
|
<template v-if="button.display">
|
||||||
|
<a v-if="button.type == 'a'" :href="url(button.action)" :class="'btn btn-sm btn-' + button.color"><i :class="'fa ' + button.icon"></i> {{button.name}}</a>
|
||||||
|
<a v-else :data-toggle="header.master_table" :data-action="button.action" href="javascript:;" :class="'btn btn-sm btn-' + button.color"><i :class="'fa ' + button.icon"></i> {{button.name}}</a>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template v-if="header.trash_btn">
|
||||||
|
<a href="{{url('',{by:'trash'})}}" :class="'btn btn-sm btn-default ' + (header.search_form.query.by == 'trash' ? 'active' : '')"><i class="fa fa-trash"></i>回收站 ({{header.trash_count}})</a>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<a v-if="access.create && header.create_btn" href="javascript:;" :data-toggle="header.master_table" data-action="create" class="btn btn-sm btn-success hinted" :title="'新建' + header.name"><i class="icon icon-plus"></i> 新建</a>
|
||||||
|
|
||||||
|
<div class="btn-group">
|
||||||
|
<a class="btn btn-info btn-sm" data-toggle="dropdown" aria-expanded="false"><i class="fa fa-bars"></i> 操作 <span class="caret"></span></a>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
<template v-for="button in header.buttons">
|
||||||
|
<li v-if="button.action == 'divider'" class="divider"></li>
|
||||||
|
<li v-elseif="button.display && (header.exist_sub_table == 1 && button.action != 'delete')"><a :data-toggle="header.master_table" :data-action="button.action" href="javascript:;"><i class="'fa ' + button.icon"></i> {{button.name}}</a></li>
|
||||||
|
</template>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<span class="visible-xs">
|
||||||
|
<div class="btn-group">
|
||||||
|
<a href="javascript:;" :data-toggle="header.master_table" data-action="filter" class="btn btn-sm btn-default"><i class="fa fa-search"></i> 搜索</a>
|
||||||
|
</div>
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<!-- 简单搜索表单 -->
|
||||||
|
<template v-if="header.simple_search_form">
|
||||||
|
<form id="{{$header['master_table']}}-search-form" class="search-inline-form form-inline hidden-xs" name="mysearch" action="{{url()}}" method="get">
|
||||||
|
<div class="form-group search-group">
|
||||||
|
<select name="field_0" id="search-field-0" class="form-control input-sm">
|
||||||
|
<option data-type="empty" value="">筛选条件</option>
|
||||||
|
@foreach($header['search_form']['columns'] as $column)
|
||||||
|
<option data-type="{{$column['form_type']}}" data-title="{{$column['name']}}" value="{{$column['field']}}">{{$column['name']}}</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group" style="display:none;">
|
||||||
|
<select name="condition_0" id="search-condition-0" class="form-control input-sm"></select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group" id="search-value-0"></div>
|
||||||
|
|
||||||
|
<div class="btn-group">
|
||||||
|
<button id="search-submit" type="submit" class="btn btn-sm btn-default">
|
||||||
|
<i class="fa fa-search"></i> 搜索</button>
|
||||||
|
<button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown">
|
||||||
|
<span class="caret"></span>
|
||||||
|
<span class="sr-only">Toggle Dropdown</span>
|
||||||
|
</button>
|
||||||
|
<ul class="dropdown-menu text-xs" role="menu">
|
||||||
|
<li>
|
||||||
|
<a data-toggle="{{$header['master_table']}}" data-action="filter" href="javascript:;">
|
||||||
|
<i class="fa fa-search"></i> 高级搜索</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<a class="btn btn-sm btn-default" :data-toggle="header.master_table" data-action="filter" href="javascript:;"><i class="fa fa-search"></i> 筛选</a>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
@if($header['bys'])
|
||||||
|
<?php $by_name = '筛选'; ?>
|
||||||
|
@foreach($header['bys']['items'] as $item)
|
||||||
|
@if($header['search_form']['query'][$header['bys']['name']] == $item['value'])
|
||||||
|
<?php $by_name = $item['name']; ?>
|
||||||
|
@endif
|
||||||
|
@endforeach
|
||||||
|
|
||||||
|
<div class="btn-group" role="group">
|
||||||
|
<button type="button" class="btn btn-sm btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||||
|
<span class="fa fa-filter"></span> {{$by_name}}
|
||||||
|
<span class="caret"></span>
|
||||||
|
</button>
|
||||||
|
<ul class="dropdown-menu" role="menu">
|
||||||
|
<?php
|
||||||
|
$params = $header['search_form']['params'];
|
||||||
|
?>
|
||||||
|
@foreach($header['bys']['items'] as $item)
|
||||||
|
@if($item['value'] == 'divider')
|
||||||
|
<li class="divider"></li>
|
||||||
|
@else
|
||||||
|
<?php $params[$header['bys']['name']] = $item['value']; ?>
|
||||||
|
<li class="@if($header['search_form']['query'][$header['bys']['name']] == $item['value']) active @endif"><a href="{{url('', $params)}}">{{$item['name']}}</a></li>
|
||||||
|
@endif
|
||||||
|
@endforeach
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
@if($header['left_buttons'])
|
||||||
|
@foreach($header['left_buttons'] as $button)
|
||||||
|
@if($button['display'])
|
||||||
|
<a @if($button['type'] == 'a') @if($button['target']) target="{{$button['target']}}" @endif href="{{$button['url'] ? url($button['url']) : url($button['action'])}}" @else data-toggle="{{$header['master_table']}}" data-action="{{$button['action']}}" href="javascript:;" @endif class="btn btn-sm btn-{{$button['color']}}"><i class="fa {{$button['icon']}}"></i> {{$button['name']}}</a>
|
||||||
|
@endif
|
||||||
|
@endforeach
|
||||||
|
@endif
|
||||||
|
|
||||||
|
<div style="display:none;">
|
||||||
|
<form id="{{$header['master_table']}}-search-form-advanced" class="search-form" action="{{url()}}" method="get">
|
||||||
|
<div class="wrapper-xs1 search-form-advanced">
|
||||||
|
<div class="row">
|
||||||
|
@foreach($header['search_form']['columns'] as $i => $column)
|
||||||
|
@if($column['form_type'] == 'text2') { continue; }
|
||||||
|
<div class="wrapper-xs">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label col-xs-3">{{$column['name']}}</label>
|
||||||
|
<?php
|
||||||
|
if (is_array($column['form_type'])) {
|
||||||
|
$_type = $column['form_type'][0];
|
||||||
|
} else {
|
||||||
|
$_type = $column['form_type'];
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<input type="hidden" name="field_{{$i}}" id="advanced-search-field-{{$i}}" data-title="{{$column['name']}}" data-type="{{$_type}}" value="{{$column['field']}}">
|
||||||
|
</div>
|
||||||
|
<div class="col-xs-2">
|
||||||
|
<div class="form-group" style="display:none;">
|
||||||
|
<select name="condition_{{$i}}" id="advanced-search-condition-{{$i}}" class="form-control input-sm"></select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-xs-7">
|
||||||
|
<div class="form-group" id="advanced-search-value-{{$i}}"></div>
|
||||||
|
</div>
|
||||||
|
<div class="clearfix"></div>
|
||||||
|
</div>
|
||||||
|
@endforeach
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@endverbatim
|
Loading…
Reference in New Issue