JavaScript UI Libraries & Blazor Components Suite – Smart UI › Forums › Scheduler › [Blazor Scheduler] Add event from an external source
Tagged: Scheduler
- This topic has 1 reply, 2 voices, and was last updated 2 years, 2 months ago by admin.
Viewing 2 posts - 1 through 2 (of 2 total)
-
AuthorPosts
-
August 26, 2022 at 6:31 am #103545einaradolfsenParticipant
I’m aware of the demo of dragging and dropping scheduler events between two schedulers, But lets say you want to drag and drop scheduler events from a treeview or a listbox to a scheduler how is this done?
August 27, 2022 at 8:08 am #103552adminKeymasterHi,
It can be achieved with a combination of Razor and Javascript. On the left side of the page, we will have a list with items which we will be able to drag and drop into the Scheduler. The drag and drop is implemented with Javascript.
Example:
@page "/" @inject IJSRuntime JSRuntime @using Smart.Blazor.Demos.Data <style> /* This is the CSS used in the demo */ html, body { width: 100%; height: 100%; margin: 0 auto; --smart-scheduler-timeline-cell-min-width: 40px; --smart-scheduler-event-border-radius: 4px; --smart-scheduler-timeline-nonworking-color: var(--smart-background); } .layout { display: flex; } .events { width: 200px; margin-right: 50px; } .smart-scheduler { width: calc(100% - 250px); height: 100%; } </style> <Example Name="Scheduler"> <div class="layout"> <div class="events"> <ul> @foreach (var item in Items) { <li value="@item" draggable="true">@item</li> } </ul> </div> <Scheduler OnReady="Ready" @ref="scheduler" Views="@views" View="SchedulerViewType.Week" DateCurrent="@dateCurrent"></Scheduler> </div> </Example> @code { Scheduler scheduler; string[] Items = new string[] { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" }; private object dateCurrent = DateTime.Today; private IEnumerable<SchedulerViewType> views = new List<SchedulerViewType>() { SchedulerViewType.Day, SchedulerViewType.Week, SchedulerViewType.Month, SchedulerViewType.Agenda }; public async void Ready(Scheduler scheduler) { await JSRuntime.InvokeVoidAsync("dragDrop"); } protected override void OnInitialized() { base.OnInitialized(); } }
and the index file.
<!DOCTYPE html> <html> <head lang="en-us"> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> <title>Smart Blazor Components Library</title> <base href="/" /> <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" rel="stylesheet" /> <link href="_content/Smart.Blazor/css/smart.default.css" rel="stylesheet" /> <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css" rel="stylesheet" /> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"> <script type="text/javascript" src="js/smart.blazor.js"></script> <script type="text/javascript" src="js/rrule.min.js"></script> <script type="text/javascript" src="_content/Smart.Blazor/js/smart.elements.js"></script> <script type="text/javascript"> function dragover_handler(ev) { ev.preventDefault(); ev.dataTransfer.dropEffect = 'move'; } function drop_handler(ev) { ev.preventDefault(); const scheduler = document.querySelector('smart-scheduler'); // Get the target element's data from the data transfer object const data = ev.dataTransfer.getData('text/plain').split(','); // gets the date from the drop coordinates. const date = scheduler.getDateFromCoordinates(ev.clientX, ev.clientY); // gets if we dropped over an all day cell. const isAllDay = scheduler.getIsAllDayCellFromCoordinates(ev.clientX, ev.clientY); if (!date) { return; } const dateStart = date; const dateEnd = new Date(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours() + 1, date.getMinutes(), 0) // adds a new scheduler event. scheduler.createEvent( data[0], data[1], dateStart, dateEnd, isAllDay ) // finds the dragged item. const item = [...document.querySelectorAll('[draggable]')].find((item) => { if (item.getAttribute('value') === data[1]) { return true; } return false; }); // removes the dragged item. if (item) { item.remove(); } } function dragstart_handler(ev) { // Add the target element's data to the data transfer object ev.dataTransfer.setData('text/plain', ev.target.innerHTML + ',' + ev.target.getAttribute('value')); ev.dataTransfer.effectAllowed = 'move'; } // called by the scheduler after it is created. Setups drag & drop. function dragDrop() { const scheduler = document.querySelector('smart-scheduler'); scheduler.addEventListener('drop', (event) => { drop_handler(event); }); scheduler.addEventListener('dragover', (event) => { dragover_handler(event); }); document.querySelectorAll('[draggable]').forEach((item) => { item.ondragstart = dragstart_handler; }); } window.onload = () => { // } document.oncontextmenu = () => { return false; } // Single Page Apps for GitHub Pages // https://github.com/rafrex/spa-github-pages // Copyright (c) 2016 Rafael Pedicini, licensed under the MIT License // ---------------------------------------------------------------------- // This script checks to see if a redirect is present in the query string // and converts it back into the correct url and adds it to the // browser's history using window.history.replaceState(...), // which won't cause the browser to attempt to load the new url. // When the single page app is loaded further down in this file, // the correct url will be waiting in the browser's history for // the single page app to route accordingly. (function (l) { if (l.search) { var q = {}; l.search.slice(1).split('&').forEach(function (v) { var a = v.split('='); q[a[0]] = a.slice(1).join('=').replace(/~and~/g, '&'); }); if (q.p !== undefined) { window.history.replaceState(null, null, l.pathname.slice(0, -1) + (q.p || '') + (q.q ? ('?' + q.q) : '') + l.hash ); } } }(window.location)) </script> </head> <body> <div id="app"> <div style="position:absolute; top:30vh; width:100%; text-align:center"> <p><i class="fas fa-spin fa-spinner"></i>Loading...</p> </div> </div> <script src="_framework/blazor.webassembly.js"></script> </body> </html>
Best regards,
Peter StoevSmart UI Team
https://www.htmlelements.com/ -
AuthorPosts
Viewing 2 posts - 1 through 2 (of 2 total)
- You must be logged in to reply to this topic.