diff --git a/assets/icons/duplicateicon.svg b/assets/icons/duplicateicon.svg
new file mode 100644
index 00000000..6eac6aa3
--- /dev/null
+++ b/assets/icons/duplicateicon.svg
@@ -0,0 +1,11 @@
+
+
+
diff --git a/assets/stylesheets/App.css b/assets/stylesheets/App.css
index d92b0d38..a0d62271 100644
--- a/assets/stylesheets/App.css
+++ b/assets/stylesheets/App.css
@@ -1439,6 +1439,47 @@ span.ant-skeleton-input.ant-skeleton-input-sm.text-skeleton {
flex-direction: column;
}
+.object-table-select-cell {
+ position: relative;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 16px;
+ height: 16px;
+}
+
+.object-table-select-cell .object-table-row-checkbox,
+.object-table-select-cell .object-table-row-icon {
+ position: absolute;
+ inset: 0;
+}
+
+.object-table-select-cell .object-table-row-checkbox {
+ opacity: 0;
+ pointer-events: none;
+ transition: opacity 0.2s;
+}
+
+.dashboard-table
+ .ant-table-row:hover
+ .object-table-select-cell
+ .object-table-row-checkbox,
+.object-table-select-cell.object-table-select-cell-selected
+ .object-table-row-checkbox {
+ opacity: 1;
+ pointer-events: auto;
+}
+
+.dashboard-table
+ .ant-table-row:hover
+ .object-table-select-cell
+ .object-table-row-icon,
+.object-table-select-cell.object-table-select-cell-selected
+ .object-table-row-icon {
+ transition: opacity 0.2s;
+ opacity: 0;
+}
+
.objectKanbanContainerWrapper {
position: relative;
width: 100%;
diff --git a/src/components/Dashboard/Finance/Invoices.jsx b/src/components/Dashboard/Finance/Invoices.jsx
index fb716014..2cc85d33 100644
--- a/src/components/Dashboard/Finance/Invoices.jsx
+++ b/src/components/Dashboard/Finance/Invoices.jsx
@@ -2,6 +2,7 @@ import { useRef } from 'react'
import { Flex, Space } from 'antd'
import ObjectTable from '../common/ObjectTable'
import ObjectActions from '../common/ObjectActions'
+import BulkObjectActions from '../common/BulkObjectActions'
import useColumnVisibility from '../hooks/useColumnVisibility'
import ObjectTableViewButton from '../common/ObjectTableViewButton'
import FilterSidebarButton from '../common/FilterSidebarButton'
@@ -31,6 +32,10 @@ const Invoices = () => {
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />
{
+ tableRef.current?.reload()}
+ />