-
+
{{ i + pageStart + 1 }}
-
+
+
+
+
+
,
+ selectedItems: [] as string[],
};
},
computed: {
@@ -155,6 +192,11 @@ export default defineComponent({
count() {
return this.pageEnd - this.pageStart + 1;
},
+ isAllSelected(): boolean {
+ return (
+ this.data.length > 0 && this.selectedItems.length === this.data.length
+ );
+ },
columns() {
let columns = this.listConfig?.columns ?? [];
@@ -261,6 +303,21 @@ export default defineComponent({
})) as RenderData[];
this.$emit('updatedData', filters);
},
+ toggleItemSelection(itemName: string) {
+ const index = this.selectedItems.indexOf(itemName);
+ if (index > -1) {
+ this.selectedItems.splice(index, 1);
+ } else {
+ this.selectedItems.push(itemName);
+ }
+ this.$emit('selected-items-changed', this.selectedItems);
+ },
+ toggleSelectAll(checked: boolean) {
+ this.selectedItems = checked
+ ? this.data.map((row) => row.name as string)
+ : [];
+ this.$emit('selected-items-changed', this.selectedItems);
+ },
},
});
diff --git a/src/pages/ListView/ListView.vue b/src/pages/ListView/ListView.vue
index b1870d97..6325a716 100644
--- a/src/pages/ListView/ListView.vue
+++ b/src/pages/ListView/ListView.vue
@@ -1,6 +1,32 @@
+
+
@@ -16,7 +42,7 @@
type="primary"
:padding="false"
class="px-3"
- @click="makeNewDoc"
+ @click="handleMakeNewDoc"
>
@@ -27,10 +53,12 @@
:list-config="listConfig"
:filters="filters"
:can-create="canCreate"
+ :is-selection-mode="isSelectionMode"
class="flex-1 flex h-full"
@open-doc="openDoc"
@updated-data="updatedData"
@make-new-doc="makeNewDoc"
+ @selected-items-changed="updateSelectedItems"
/>
| null>(null),
makeNewDocButton: ref | null>(null),
exportButton: ref | null>(null),
+ selectButton: ref | null>(null),
filterDropdown: ref | null>(null),
};
},
@@ -90,10 +122,16 @@ export default defineComponent({
listConfig: undefined,
openExportModal: false,
listFilters: {},
+ isSelectionMode: false,
+ selectedAction: '',
+ selectedItems: [] as string[],
} as {
listConfig: undefined | ReturnType;
openExportModal: boolean;
listFilters: QueryFilter;
+ isSelectionMode: boolean;
+ selectedAction: string;
+ selectedItems: string[];
};
},
computed: {
@@ -113,6 +151,12 @@ export default defineComponent({
canCreate(): boolean {
return fyo.schemaMap[this.schemaName]?.create !== false;
},
+ actionOptions(): { value: string; label: string }[] {
+ return [
+ { value: 'SalesInvoice', label: 'Sales Invoice' },
+ { value: 'PurchaseInvoice', label: 'Purchase Invoice' },
+ ];
+ },
},
activated() {
this.listConfig = getListConfig(this.schemaName);
@@ -160,9 +204,46 @@ export default defineComponent({
const route = getFormRoute(this.schemaName, doc.name!);
await routeTo(route);
},
+ async handleMakeNewDoc() {
+ await this.makeNewDoc();
+ },
applyFilter(filters: QueryFilter) {
this.list?.updateData(filters);
},
+ toggleSelectionMode() {
+ this.isSelectionMode = !this.isSelectionMode;
+ if (!this.isSelectionMode) {
+ this.selectedAction = '';
+ this.selectedItems = [];
+ }
+ },
+ async onActionChange(value: string) {
+ this.selectedAction = value;
+ if (value === 'SalesInvoice' || value === 'PurchaseInvoice') {
+ const doc = fyo.doc.getNewDoc(value);
+
+ for (const itemName of this.selectedItems) {
+ const itemDoc = await fyo.doc.getDoc('Item', itemName);
+
+ const itemRow = {
+ item: itemName,
+ rate: (itemDoc.rate as Money) || fyo.pesa(0),
+ quantity: 1,
+ };
+
+ await doc.append('items', itemRow);
+ }
+
+ const route = getFormRoute(value, doc.name!);
+ await routeTo(route);
+ this.selectedItems = [];
+ this.isSelectionMode = false;
+ }
+ },
+
+ updateSelectedItems(selected: string[]) {
+ this.selectedItems = selected;
+ },
},
});