You’ve got several options here:
- You can create a wrapper for the dragula React component, this requires a bit of knowledge of Javascript, you can find more info on how to do this here
- You can use
clientside_callback
and the external dragula script as shown below (I also use dash_bootstrap_components to style cards)
The Dash app:
app.py
import dash
import dash_core_components as dcc
import dash_html_components as html
import dash_bootstrap_components as dbc
from dash.dependencies import Input, Output, State, ClientsideFunction
app = dash.Dash(
__name__,
external_scripts=["https://cdnjs.cloudflare.com/ajax/libs/dragula/3.7.2/dragula.min.js"],
external_stylesheets=[dbc.themes.BOOTSTRAP]
)
app.layout = html.Div(id="main", children=[
html.Div(id="drag_container", className="container", children=[
dbc.Card([
dbc.CardHeader("Card 1"),
dbc.CardBody(
"Some content"
),
]),
dbc.Card([
dbc.CardHeader("Card 2"),
dbc.CardBody(
"Some other content"
),
]),
dbc.Card([
dbc.CardHeader("Card 3"),
dbc.CardBody(
"Some more content"
),
]),
]),
])
app.clientside_callback(
ClientsideFunction(namespace="clientside", function_name="make_draggable"),
Output("drag_container", "data-drag"),
[Input("drag_container", "id")],
)
if __name__ == "__main__":
app.run_server(debug=True)
The clientside function:
assets/scripts.js
if (!window.dash_clientside) {
window.dash_clientside = {};
}
window.dash_clientside.clientside = {
make_draggable: function(id) {
setTimeout(function() {
var el = document.getElementById(id)
window.console.log(el)
dragula([el])
}, 1)
return window.dash_clientside.no_update
}
}
And finally the dragula css:
assets/dragula.css
.gu-mirror {
position: fixed !important;
margin: 0 !important;
z-index: 9999 !important;
opacity: 0.8;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";
filter: alpha(opacity=80);
}
.gu-hide {
display: none !important;
}
.gu-unselectable {
-webkit-user-select: none !important;
-moz-user-select: none !important;
-ms-user-select: none !important;
user-select: none !important;
}
.gu-transit {
opacity: 0.2;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";
filter: alpha(opacity=20);
}