0xJacky преди 2 години
родител
ревизия
20daf836e9

+ 9 - 2
frontend/src/components/StdDataDisplay/StdCurd.vue

@@ -152,7 +152,7 @@ function edit(id: any) {
         <a-modal
                 class="std-curd-edit-modal"
                 :mask="false"
-                :title="data.id ? $gettext('Modify') : $gettext('Add')"
+                :title="edit_text?edit_text:(data.id ? $gettext('Modify') : $gettext('Add'))"
                 :visible="visible"
                 :cancel-text="$gettext('Cancel')"
                 :ok-text="$gettext('OK')"
@@ -161,17 +161,24 @@ function edit(id: any) {
                 :width="modalWidth"
                 destroyOnClose
         >
+            <div class="before-edit" v-if="$slots.beforeEdit">
+                <slot name="beforeEdit" :data="data"/>
+            </div>
+
             <std-data-entry
                     ref="std_data_entry"
                     :data-list="editableColumns()"
                     v-model:data-source="data"
                     :error="error"
             />
+
             <slot name="edit" :data="data"/>
         </a-modal>
     </div>
 </template>
 
 <style lang="less" scoped>
-
+.before-edit {
+    margin-bottom: 20px;
+}
 </style>

+ 24 - 10
frontend/src/components/StdDataDisplay/StdTable.vue

@@ -70,8 +70,7 @@ const props = defineProps({
     },
     size: String,
     selectedRowKeys: {
-        type: Array,
-        default: []
+        type: Array
     }
 })
 
@@ -89,11 +88,14 @@ const params = reactive({
     ...props.get_params
 })
 
+const selectedKeysLocalBuffer: any = ref([])
+
 const selectedRowKeysBuffer = computed({
     get() {
-        return props?.selectedRowKeys ?? []
+        return props.selectedRowKeys || selectedKeysLocalBuffer.value
     },
     set(v) {
+        selectedKeysLocalBuffer.value = v
         emit('update:selectedRowKeys', v)
     }
 })
@@ -182,13 +184,23 @@ function checked(c: any) {
     params[c.target.value] = c.target.checked
 }
 
-function onSelectChange(_selectedRowKeys: any) {
-    const n: any = [..._selectedRowKeys]
-    const t = [...selectedRowKeysBuffer.value].concat(n)
+const crossPageSelect: any = {}
+
+async function onSelectChange(_selectedRowKeys: any) {
+
+    const page = params.page || 1
+
+    crossPageSelect[page] = await _selectedRowKeys
 
+    let t: any = []
+    Object.keys(crossPageSelect).forEach(v => {
+        t.push(...crossPageSelect[v])
+    })
+    const n: any = [..._selectedRowKeys]
+    t = await t.concat(n)
+    // console.log(crossPageSelect)
     const set = new Set(t)
     selectedRowKeysBuffer.value = Array.from(set)
-
     emit('onSelected', selectedRowKeysBuffer.value)
 }
 
@@ -212,14 +224,16 @@ const reset_search = async () => {
 }
 
 watch(params, () => {
-    router.push({query: params})
+    if (!props.disable_query_params) {
+        router.push({query: params})
+    }
     get_list()
 })
 
 const rowSelection = computed(() => {
     if (props.selectionType) {
         return {
-            selectedRowKeys: selectedRowKeysBuffer, onChange: onSelectChange,
+            selectedRowKeys: selectedRowKeysBuffer.value, onChange: onSelectChange,
             onSelect: onSelect, type: props.selectionType
         }
     } else {
@@ -307,7 +321,7 @@ async function export_csv() {
 <template>
     <div class="std-table">
         <std-data-entry
-                v-if="!disable_search"
+                v-if="!disable_search && searchColumns.length"
                 :data-list="searchColumns"
                 v-model:data-source="params"
                 layout="inline"

+ 2 - 2
frontend/src/components/StdDataEntry/compontents/StdSelector.vue

@@ -73,7 +73,7 @@ watch(props, () => {
                     :mask="false"
                     :visible="visible"
                     :cancel-text="$gettext('Cancel')"
-                    :ok-text="$gettext('Ok')"
+                    :ok-text="$gettext('OK')"
                     :title="$gettext('Selector')"
                     @cancel="visible=false"
                     @ok="ok()"
@@ -102,7 +102,7 @@ watch(props, () => {
 .std-selector-container {
     height: 39.9px;
     display: flex;
-    align-items: center;
+    align-items: flex-start;
 
     .std-selector {
         box-sizing: border-box;

+ 20 - 1
frontend/src/components/StdDataEntry/index.tsx

@@ -22,8 +22,27 @@ interface IEdit {
     generate: boolean
 }
 
+function fn(obj: Object, desc: any) {
+    let arr: string[]
+    if (typeof desc === 'string') {
+        arr = desc.split('.')
+    } else {
+        arr = [...desc]
+    }
+
+    while (arr.length) {
+        // @ts-ignore
+        const top = obj[arr.shift()]
+        if (top === undefined) {
+            return null
+        }
+        obj = top
+    }
+    return obj
+}
+
 function readonly(edit: IEdit, dataSource: any, dataIndex: any) {
-    return h('p', dataSource[dataIndex])
+    return h('p', fn(dataSource, dataIndex))
 }
 
 function input(edit: IEdit, dataSource: any, dataIndex: any) {