Skip to content

Commit

Permalink
Merge pull request #6397 from inverse-inc/feature/gui-perf2
Browse files Browse the repository at this point in the history
perf(admin): various improvements
  • Loading branch information
cgx committed Jun 23, 2021
2 parents 46a6a6f + ebd4558 commit dd502b8
Show file tree
Hide file tree
Showing 505 changed files with 17,246 additions and 13,689 deletions.
1 change: 1 addition & 0 deletions html/pfappserver/root/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
"messageformat": "^2.3.0",
"mime-types": "^2.1.31",
"papaparse": "5.3.0",
"pinia": "^0.5.2",
"plotly.js-basic-dist-min": "^1.58.2",
"promised-debounce": "^0.4.2",
"typeface-b612-mono": "1.1.13",
Expand Down
55 changes: 8 additions & 47 deletions html/pfappserver/root/src/components/new/BaseButtonExportCsv.vue
Original file line number Diff line number Diff line change
Expand Up @@ -34,64 +34,25 @@ const props = {
}
import { computed, toRefs } from '@vue/composition-api'
import { useTableColumnsItems } from '@/composables/useCsv'
import { useDownload } from '@/composables/useDownload'
const setup = (props) => {
const {
columns,
data,
filename
} = toRefs(props)
const visibleColumns = computed(() => columns.value.filter(column => !column.locked && column.visible))
const _getContents = () => {
let formatters = {}
visibleColumns.value.forEach(column => {
if (column.formatter) formatters[column.key] = column.formatter
})
const header = visibleColumns.value.map(column => column.key)
let keyMap = {} // build map to sort data same as header
Object.keys(data.value[0]).forEach(key => {
const idx = header.findIndex(column => column === key)
if (idx >= 0) keyMap[key] = idx
})
const body = data.value.map(row => {
return Object.entries(row).filter(col => header.includes(col[0])).sort((a, b) => {
return keyMap[a[0]] - keyMap[b[0]]
}).map(_row => {
const [ key, value ] = _row
if (key in formatters) {
return formatters[key](value, key, row) || ''
}
return value || ''
})
})
return [ header, ...body ]
}
const onDownload = () => {
let csvContentArray = []
_getContents().forEach(rowArray => {
let row = rowArray.map(col => `"${col.toString().replace('"', '\\"')}"`).join(',')
csvContentArray.push(row)
})
// window.open(encodeURI(`data:text/csv;charset=utf-8,${csvContentArray.join('\r\n')}`)) // doesn't allow naming
var blob = new Blob([csvContentArray.join('\r\n')], { type: 'text/csv' })
if (window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveBlob(blob, filename.value)
} else {
var elem = window.document.createElement('a')
elem.href = window.URL.createObjectURL(blob)
elem.download = filename.value
document.body.appendChild(elem)
elem.click()
document.body.removeChild(elem)
}
const csv = useTableColumnsItems(visibleColumns.value, data.value)
useDownload(filename.value, csv, 'text/csv')
}
return {
visibleColumns,
onDownload
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<template>
<span @click="onClick" class="align-items-center">
<icon name="regular/question-circle" scale="1.25"
class="base-button-help text-secondary"
class="base-button-help"
:title="$i18n.t('Click to view {documentName}', { documentName })" v-b-tooltip.hover.top.d300
></icon>
</span>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ const setup = (props, context) => {
const keyUpSaveSearchInput = event => {
switch (event.keyCode) {
case 13: // [ENTER] submits
if (saveSearchString.value.length > 0)
if (saveSearchString.value.length > 0)
onSave()
break
}
Expand Down
220 changes: 220 additions & 0 deletions html/pfappserver/root/src/components/new/BaseSearch.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,220 @@
<template>
<div>
<transition name="fade" mode="out-in">
<div v-if="advancedMode">
<b-form @submit.prevent="onSearchAdvanced" @reset.prevent="onSearchReset">
<base-search-input-advanced
v-model="conditionAdvanced"
:disabled="disabled || isLoading"
:fields="fields"
@search="onSearchAdvanced"
/>
<b-container fluid class="text-right mt-3 px-0">
<b-button class="ml-1" type="reset" variant="secondary" :disabled="disabled || isLoading">{{ $t('Reset') }}</b-button>
<base-button-save-search
:save-search-namespace="`${uuid}Advanced`"
class="ml-1"
v-model="conditionAdvanced"
:disabled="disabled || isLoading"
@search="onSearchAdvanced"
/>
<b-button class="ml-1" variant="outline-primary" @click="advancedMode = false"
v-b-tooltip.hover.top.d300 :title="$t('Switch to basic search.')">
<icon name="search-minus" />
</b-button>
</b-container>
</b-form>
</div>
<div class="d-flex" v-else>
<base-search-input-basic class="flex-grow-1"
:save-search-namespace="`${uuid}Basic`"
v-model="conditionBasic"
:disabled="disabled || isLoading"
:placeholder="placeholderBasic"
@reset="onSearchReset"
@search="onSearchBasic"
/>
<b-button class="ml-1" variant="outline-primary" @click="advancedMode = true"
v-b-tooltip.hover.top.d300 :title="$t('Switch to advanced search.')">
<icon name="search-plus" />
</b-button>
</div>
</transition>
<b-row align-h="end">
<b-col cols="auto" class="mr-auto my-3">
<slot />
</b-col>
<b-col cols="auto" class="my-3 align-self-end d-flex">
<base-search-input-limit
:value="limit" @input="setLimit"
size="md"
:limits="limits"
:disabled="disabled || isLoading"
/>
<base-search-input-page
:value="page" @input="setPage"
class="ml-3"
:limit="limit"
:total-rows="totalRows"
:disabled="disabled || isLoading"
/>
</b-col>
</b-row>
</div>
</template>
<script>
import BaseButtonConfirm from './BaseButtonConfirm'
import BaseButtonSaveSearch from './BaseButtonSaveSearch'
import BaseInputToggleAdvancedMode from './BaseInputToggleAdvancedMode'
import BaseSearchInputBasic from './BaseSearchInputBasic'
import BaseSearchInputAdvanced from './BaseSearchInputAdvanced'
import BaseSearchInputLimit from './BaseSearchInputLimit'
import BaseSearchInputPage from './BaseSearchInputPage'
const components = {
BaseButtonConfirm,
BaseButtonSaveSearch,
BaseInputToggleAdvancedMode,
BaseSearchInputBasic,
BaseSearchInputAdvanced,
BaseSearchInputLimit,
BaseSearchInputPage
}
const props = {
useSearch: {
type: Function
},
disabled: {
type: Boolean
}
}
import { onMounted, ref, toRefs, watch } from '@vue/composition-api'
import { usePreference } from '@/views/Configuration/_store/preferences'
const setup = (props) => {
const {
useSearch
} = props
const search = useSearch()
const {
uuid,
setUp,
setPage,
defaultCondition,
doSearchCondition,
doSearchString,
doReset
} = search
const {
columns,
page,
limit,
sortBy,
sortDesc
} = toRefs(search)
const saveSearch = usePreference(`search::${uuid}`)
watch([columns, page, limit, sortBy, sortDesc], () => {
Promise.resolve(saveSearch.value).then(_saveSearch => {
saveSearch.value = {
..._saveSearch,
columns: columns.value.filter(c => c.visible).map(c => c.key),
page: page.value,
limit: limit.value,
sortBy: sortBy.value,
sortDesc: sortDesc.value
}
})
})
const advancedMode = ref(false)
const conditionBasic = ref(null)
const conditionAdvanced = ref(defaultCondition()) // default
onMounted(() => {
Promise.resolve(saveSearch.value).then(value => {
if (value) {
const {
conditionAdvanced: _conditionAdvanced,
conditionBasic: _conditionBasic
} = value
setUp(value)
if (_conditionAdvanced) {
conditionAdvanced.value = _conditionAdvanced
advancedMode.value = true
return doSearchCondition(conditionAdvanced.value)
}
if (_conditionBasic) {
conditionBasic.value = _conditionBasic
advancedMode.value = false
return doSearchString(conditionBasic.value)
}
}
doReset()
})
})
const onSearchBasic = () => {
if (conditionBasic.value) {
doSearchString(conditionBasic.value)
Promise.resolve(saveSearch.value).then(_saveSearch => {
const { conditionAdvanced, ...rest } = _saveSearch || {}
saveSearch.value = { ...rest, conditionBasic: conditionBasic.value }
})
}
else
doReset()
}
const onSearchAdvanced = () => {
if (conditionAdvanced.value) {
doSearchCondition(conditionAdvanced.value)
Promise.resolve(saveSearch.value).then(_saveSearch => {
const { conditionBasic, ...rest } = _saveSearch || {}
saveSearch.value = { ...rest, conditionAdvanced: conditionAdvanced.value }
})
}
else
doReset()
}
const onSearchReset = () => {
conditionBasic.value = null
conditionAdvanced.value = defaultCondition()
setPage(1)
Promise.resolve(saveSearch.value).then(_saveSearch => {
const { conditionAdvanced, conditionBasic, ...rest } = _saveSearch || {}
saveSearch.value = rest
})
doReset()
}
return {
uuid,
advancedMode,
conditionBasic,
conditionAdvanced,
onSearchBasic,
onSearchAdvanced,
onSearchReset,
...toRefs(search),
columns
}
}
// @vue/component
export default {
name: 'base-search',
inheritAttrs: false,
components,
props,
setup
}
</script>
Loading

0 comments on commit dd502b8

Please sign in to comment.