160 lines
5.0 KiB
Vue
160 lines
5.0 KiB
Vue
<template>
|
|
<div class="tabs">
|
|
<ul>
|
|
<li :class="`${v.code === tab ? 'is-active has-text-weight-bold fs-18' : 'fs-18'}`" v-for="v in tabs">
|
|
<a @click="changeTab(v)">{{ v.name }}</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
<template v-if="tab === 'datatype'">
|
|
<Caption class="mb-3" v-bind="{ title: 'Kiểu dữ liệu (type)', type: 'has-text-warning' }"></Caption>
|
|
<div class="py-1 border-bottom is-clickable" v-for="x in current.fields">
|
|
{{ x.name }}
|
|
<span class="ml-6 has-text-grey">{{ x.type }}</span>
|
|
<a class="ml-6 has-text-primary" v-if="x.model" @click="openModel(x)">{{ x.model }}</a>
|
|
</div>
|
|
</template>
|
|
<template v-else>
|
|
<div class="columns mx-0 mb-0 pb-0">
|
|
<div class="column is-7">
|
|
<Caption class="mb-2" v-bind="{ title: 'Values', type: 'has-text-warning' }"></Caption>
|
|
<input class="input" rows="1" v-model="values" />
|
|
</div>
|
|
<div class="column is-4s">
|
|
<Caption class="mb-2" v-bind="{ title: 'Filter', type: 'has-text-warning' }"></Caption>
|
|
<input class="input" rows="1" v-model="filter" />
|
|
</div>
|
|
<div class="column is-1">
|
|
<Caption class="mb-2" v-bind="{ title: 'Load', type: 'has-text-warning' }"></Caption>
|
|
<div>
|
|
<button class="button is-primary has-text-white" @click="loadData()">Load</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<Caption class="mb-2" v-bind="{ title: 'Query', type: 'has-text-warning' }"></Caption>
|
|
<div class="mb-4">
|
|
{{ query }}
|
|
<a class="has-text-primary ml-5" @click="copy()">copy</a>
|
|
<p>
|
|
{{ apiUrl }}
|
|
<a class="has-text-primary ml-5" @click="$copyToClipboard(apiUrl)">copy</a>
|
|
<a class="has-text-primary ml-5" target="_blank" :href="apiUrl">open</a>
|
|
</p>
|
|
</div>
|
|
<div>
|
|
<Caption class="mb-2" v-bind="{ title: 'Data', type: 'has-text-warning' }"></Caption>
|
|
<DataTable v-bind="{ pagename: pagename }" v-if="pagedata" />
|
|
</div>
|
|
</template>
|
|
<Modal @close="showmodal = undefined" v-bind="showmodal" v-if="showmodal"></Modal>
|
|
</template>
|
|
<script setup>
|
|
import { useStore } from "@/stores/index";
|
|
var props = defineProps({
|
|
data: Array,
|
|
info: Object,
|
|
});
|
|
const { $getdata, $getapi, $createField, $clone, $getpage, $empty, $copyToClipboard, $find } = useNuxtApp();
|
|
const store = useStore();
|
|
var pagename = "pagedata99";
|
|
var pagedata = ref();
|
|
pagedata.value = $getpage();
|
|
store.commit(pagename, pagedata);
|
|
let list = ["LogEntry", "Permission", "ContentType", "Session", "Group"];
|
|
var current = ref({ fields: [] });
|
|
var tabs = [
|
|
{ code: "datatype", name: "Kiểu dữ liệu" },
|
|
{ code: "table", name: "Dữ liệu" },
|
|
];
|
|
var tab = ref("datatype");
|
|
var datatable = ref();
|
|
var query = ref();
|
|
var values, filter;
|
|
var apiUrl = ref();
|
|
var showmodal = ref();
|
|
var data = props.data;
|
|
current.value = props.info;
|
|
function changeMenu(v) {
|
|
values = undefined;
|
|
filter = undefined;
|
|
current.value = v;
|
|
if (tab.value === "table") loadData();
|
|
}
|
|
async function changeTab(v) {
|
|
tab.value = v.code;
|
|
if (v.code === "table") loadData();
|
|
}
|
|
async function loadData() {
|
|
let vfilter = filter ? filter.trim() : undefined;
|
|
if (vfilter) {
|
|
try {
|
|
vfilter = JSON.parse(vfilter);
|
|
} catch (error) {
|
|
alert("Cấu trúc filter có lỗi");
|
|
vfilter = undefined;
|
|
}
|
|
}
|
|
let params = { values: values ? values.trim() : undefined, filter: filter };
|
|
let modelName = current.value.model;
|
|
let found = {
|
|
name: modelName.toLowerCase().replace("_", ""),
|
|
url: `data/${modelName}/`,
|
|
url_detail: `data-detail/${modelName}/`,
|
|
params: params,
|
|
};
|
|
query.value = $clone(found);
|
|
let rs = await $getapi([found]);
|
|
if (rs === "error") return alert("Đã xảy ra lỗi, hãy xem lại câu lệnh.");
|
|
datatable.value = rs[0].data.rows;
|
|
showData();
|
|
|
|
// api query
|
|
const baseUrl = "https://api.y99.vn/" + `${query.value.url}`;
|
|
apiUrl.value = baseUrl;
|
|
let vparams = !$empty(values) ? { values: values } : null;
|
|
if (!$empty(filter)) {
|
|
vparams = vparams ? { values: values, filter: filter } : { filter: filter };
|
|
}
|
|
if (vparams) {
|
|
let url = new URL(baseUrl);
|
|
let searchParams = new URLSearchParams(vparams);
|
|
url.search = searchParams.toString();
|
|
apiUrl.value = baseUrl + url.search;
|
|
}
|
|
}
|
|
function showData() {
|
|
let arr = [];
|
|
if (!$empty(values)) {
|
|
let arr1 = values.trim().split(",");
|
|
arr1.map((v) => {
|
|
let val = v.trim();
|
|
let field = $createField(val, val, "string", true);
|
|
arr.push(field);
|
|
});
|
|
} else {
|
|
current.value.fields.map((v) => {
|
|
let field = $createField(v.name, v.name, "string", true);
|
|
arr.push(field);
|
|
});
|
|
}
|
|
let clone = $clone(pagedata.value);
|
|
clone.fields = arr;
|
|
clone.data = datatable.value;
|
|
pagedata.value = undefined;
|
|
setTimeout(() => (pagedata.value = clone));
|
|
}
|
|
function copy() {
|
|
$copyToClipboard(JSON.stringify(query.value));
|
|
}
|
|
function openModel(x) {
|
|
showmodal.value = {
|
|
component: "datatable/ModelInfo",
|
|
title: x.model,
|
|
width: "70%",
|
|
height: "600px",
|
|
vbind: { data: data, info: $find(data, { model: x.model }) },
|
|
};
|
|
}
|
|
</script>
|
|
s
|