Skip to content

Commit d944a0f

Browse files
Update projects
1 parent edb5ab7 commit d944a0f

File tree

172 files changed

+7812
-1701925
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

172 files changed

+7812
-1701925
lines changed
Lines changed: 144 additions & 154 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,4 @@
11
@using ASP_NET_Core.Models
2-
@using System.Text.Json
3-
4-
@{
5-
var tasksJson = JsonSerializer.Serialize(GanttData.Tasks);
6-
var resourcesJson = JsonSerializer.Serialize(GanttData.Resources);
7-
}
82

93
<h2>Gantt - Custom Task Details Dialog</h2>
104

@@ -50,182 +44,178 @@
5044
.DataField("End")
5145
.Caption("End Date");
5246
})
47+
.Toolbar(t => {
48+
t.Items(i => {
49+
i.Add().Name(GanttToolbarItem.Undo);
50+
i.Add().Name(GanttToolbarItem.Redo);
51+
i.Add().Name(GanttToolbarItem.Separator);
52+
i.Add().Name(GanttToolbarItem.CollapseAll);
53+
i.Add().Name(GanttToolbarItem.ExpandAll);
54+
i.Add().Name(GanttToolbarItem.Separator);
55+
i.Add().Name(GanttToolbarItem.AddTask);
56+
i.Add().Name(GanttToolbarItem.DeleteTask);
57+
i.Add().Name(GanttToolbarItem.Separator);
58+
i.Add().Name(GanttToolbarItem.ZoomIn);
59+
i.Add().Name(GanttToolbarItem.ZoomOut);
60+
});
61+
})
5362
.Editing(e => e.Enabled(true))
63+
.OnInitialized("onGanttInitialized")
5464
.OnTaskEditDialogShowing("onTaskEditDialogShowing")
5565
)
5666

5767
@(Html.DevExtreme().Popup()
5868
.ID("taskDetailsPopup")
59-
.Width(400)
60-
.Height(450)
69+
.MaxWidth(800)
70+
.MaxHeight(500)
6171
.Title("Task Details")
62-
.ShowTitle(true)
63-
.DragEnabled(false)
64-
.Visible(false)
65-
.Container("body")
66-
.ContentTemplate(@<text>
67-
@(Html.DevExtreme().Form()
68-
.ID("taskForm")
69-
.Items(items => {
70-
items.AddSimple()
71-
.DataField("Title")
72-
.Label(l => l.Text("Title"))
73-
.ValidationRules(v => v.AddRequired().Message("Title is required"));
74-
items.AddSimple()
75-
.DataField("Start")
76-
.Label(l => l.Text("Start Date"))
77-
.Editor(e => e.DateBox()
78-
.Type(DateBoxType.DateTime)
79-
.OnValueChanged("onStartDateChanged")
80-
);
81-
items.AddSimple()
82-
.DataField("End")
83-
.Label(l => l.Text("End Date"))
84-
.Editor(e => e.DateBox()
85-
.Type(DateBoxType.DateTime)
86-
.OnValueChanged("onEndDateChanged")
87-
);
88-
items.AddSimple()
89-
.DataField("Progress")
90-
.Label(l => l.Text("Progress"))
91-
.Editor(e => e.Slider()
92-
.Min(0)
93-
.Max(100)
94-
.Tooltip(t => t
95-
.Enabled(true)
96-
.Format(new JS("formatProgress"))
97-
.ShowMode(SliderTooltipShowMode.Always)
98-
.Position(VerticalEdge.Bottom)
99-
)
100-
);
101-
items.AddSimple()
102-
.DataField("resourceIds")
103-
.Label(l => l.Text("Resources"))
104-
.Editor(e => e.TagBox()
105-
.DataSource(new JS("resources"))
106-
.DisplayExpr("Text")
107-
.ValueExpr("Id")
108-
.ShowSelectionControls(true)
109-
.ApplyValueMode(EditorApplyValueMode.UseButtons)
110-
);
111-
})
112-
)
113-
<div class="popup-buttons">
114-
<button class="btn btn-primary" onclick="onConfirmClick()">OK</button>
115-
<button class="btn btn-secondary" onclick="onCancelClick()">Cancel</button>
116-
</div>
117-
</text>)
72+
.ContentTemplate(new TemplateName("customPopupContentTemplate"))
73+
.ToolbarItems(items => {
74+
items.Add()
75+
.Widget(editor => editor.Button()
76+
.Text("Confirm")
77+
.Type(ButtonType.Success)
78+
.OnClick("onConfirmClick")
79+
)
80+
.Location(ToolbarItemLocation.After)
81+
.Toolbar(Toolbar.Bottom);
82+
items.Add()
83+
.Widget(editor => editor.Button()
84+
.Text("Cancel")
85+
.OnClick("onCancelClick")
86+
)
87+
.Location(ToolbarItemLocation.After)
88+
.Toolbar(Toolbar.Bottom);
89+
})
90+
.OnInitialized("onPopupInitialized")
91+
.OnShown("onShown")
11892
)
11993

120-
<script>
121-
const resources = @Html.Raw(resourcesJson);
122-
let ganttInstance;
123-
let popupInstance;
124-
let formInstance;
125-
126-
function onTaskEditDialogShowing(e) {
127-
console.log('onTaskEditDialogShowing called', e);
128-
e.cancel = true;
129-
console.log('After setting cancel:', e.cancel);
130-
131-
if (!ganttInstance) {
132-
ganttInstance = $('#gantt').dxGantt('instance');
133-
}
134-
if (!popupInstance) {
135-
popupInstance = $('#taskDetailsPopup').dxPopup('instance');
136-
}
137-
138-
console.log('Popup instance:', popupInstance);
139-
140-
const taskData = ganttInstance.getTaskData(e.key);
141-
if (!taskData) {
142-
return;
143-
}
144-
145-
const taskResources = ganttInstance.getTaskResources(e.key);
146-
const resourceIds = taskResources.map(r => r.id);
94+
@using (Html.DevExtreme().NamedTemplate("customPopupContentTemplate")) {
95+
@(Html.DevExtreme().Form()
96+
.ID("taskForm")
97+
.ColCount(2)
98+
.Items(items => {
99+
items.AddSimple()
100+
.DataField("Title")
101+
.ValidationRules(v => v.AddRequired())
102+
.ColSpan(2);
103+
items.AddSimple()
104+
.DataField("Start")
105+
.Editor(e => e.DateBox()
106+
.Type(DateBoxType.DateTime)
107+
.OnValueChanged("onStartDateChanged")
108+
.Width("100%")
109+
);
110+
items.AddSimple()
111+
.DataField("End")
112+
.Editor(e => e.DateBox()
113+
.Type(DateBoxType.DateTime)
114+
.OnValueChanged("onEndDateChanged")
115+
.Width("100%")
116+
);
117+
items.AddSimple()
118+
.DataField("Progress")
119+
.Editor(e => e.Slider()
120+
.Min(0)
121+
.Max(100)
122+
.Label(l => l
123+
.Visible(true)
124+
.Format(new JS("formatLabel"))
125+
.Position(VerticalEdge.Top)
126+
)
127+
.Tooltip(t => t
128+
.Enabled(true)
129+
.Format(new JS("formatLabel"))
130+
.Position(VerticalEdge.Top)
131+
.ShowMode(SliderTooltipShowMode.OnHover)
132+
)
133+
.Width("100%")
134+
);
135+
items.AddSimple()
136+
.DataField("Resources")
137+
.Editor(e => e.TagBox()
138+
.DataSource(GanttData.Resources)
139+
.ValueExpr("Id")
140+
.DisplayExpr("Text")
141+
.Width("100%")
142+
);
143+
items.AddButton()
144+
.ColSpan(1)
145+
.HorizontalAlignment(HorizontalAlignment.Left)
146+
.ButtonOptions(options => {
147+
options.Text("Resource Manager");
148+
options.OnClick("onShowResourceManagerClick");
149+
});
150+
})
151+
.OnInitialized("onFormInitialized")
152+
)
153+
}
147154

148-
console.log('Showing popup with data:', taskData);
155+
<script>
156+
var form, popup, gantt;
157+
var rowData = {};
149158
150-
// Show popup first so the form gets rendered
151-
popupInstance.show();
159+
function onGanttInitialized(e) {
160+
gantt = e.component;
161+
}
152162
153-
// Now get the form instance after popup is shown
154-
formInstance = $('#taskForm').dxForm('instance');
163+
function onPopupInitialized(e) {
164+
popup = e.component;
165+
}
155166
156-
console.log('Form instance:', formInstance);
167+
function onFormInitialized(e) {
168+
form = e.component;
169+
}
157170
158-
formInstance.option('formData', {
159-
...taskData,
160-
resourceIds: resourceIds
161-
});
171+
function onShown(e) {
172+
var data = form.option("formData");
173+
var resources = gantt.getTaskResources(data.Id);
174+
form.getEditor("Resources").option("value", resources.map(r => r.id));
162175
}
163176
164-
function onStartDateChanged(e) {
165-
if (!formInstance) {
166-
formInstance = $('#taskForm').dxForm('instance');
167-
}
168-
const startDate = e.value;
169-
const endDate = formInstance.option('formData').End;
170-
if (startDate && endDate && startDate > endDate) {
171-
formInstance.getEditor('End').option('value', startDate);
172-
}
177+
function onTaskEditDialogShowing(e) {
178+
e.cancel = true;
179+
showTaskDetails(gantt.getTaskData(e.key));
173180
}
174181
175-
function onEndDateChanged(e) {
176-
if (!formInstance) {
177-
formInstance = $('#taskForm').dxForm('instance');
178-
}
179-
const endDate = e.value;
180-
const startDate = formInstance.option('formData').Start;
181-
if (startDate && endDate && endDate < startDate) {
182-
formInstance.getEditor('Start').option('value', endDate);
182+
function onConfirmClick(e) {
183+
let result = form.validate();
184+
if (result.isValid) {
185+
var data = form.option("formData");
186+
gantt.updateTask(data.Id, data);
187+
gantt.unassignAllResourcesFromTask(data.Id);
188+
if (data.Resources && data.Resources.length > 0) {
189+
data.Resources.forEach(r => gantt.assignResourceToTask(r, data.Id));
190+
}
191+
popup.hide();
183192
}
184193
}
185194
186-
function formatProgress(value) {
187-
return value + '%';
195+
function onShowResourceManagerClick(e) {
196+
gantt.showResourceManagerDialog();
188197
}
189198
190-
function onConfirmClick() {
191-
if (!formInstance) {
192-
formInstance = $('#taskForm').dxForm('instance');
193-
}
194-
if (!ganttInstance) {
195-
ganttInstance = $('#gantt').dxGantt('instance');
196-
}
197-
if (!popupInstance) {
198-
popupInstance = $('#taskDetailsPopup').dxPopup('instance');
199-
}
199+
function onCancelClick(e) {
200+
popup.hide();
201+
}
200202
201-
const result = formInstance.validate();
202-
if (!result.isValid) {
203-
return;
203+
function showTaskDetails(data) {
204+
popup.option("visible", true);
205+
if (form) {
206+
form.option('formData', data);
204207
}
208+
}
205209
206-
const data = formInstance.option('formData');
207-
ganttInstance.updateTask(data.Id, data);
208-
209-
const currentResourceIds = ganttInstance.getTaskResources(data.Id).map(r => r.id);
210-
const newResourceIds = data.resourceIds || [];
211-
212-
const resourcesToRemove = currentResourceIds.filter(id => !newResourceIds.includes(id));
213-
resourcesToRemove.forEach(resourceId => {
214-
ganttInstance.unassignResourceFromTask(resourceId, data.Id);
215-
});
216-
217-
const resourcesToAdd = newResourceIds.filter(id => !currentResourceIds.includes(id));
218-
resourcesToAdd.forEach(resourceId => {
219-
ganttInstance.assignResourceToTask(resourceId, data.Id);
220-
});
210+
function onEndDateChanged(e) {
211+
form.getEditor("Start").option("max", e.value);
212+
}
221213
222-
popupInstance.hide();
214+
function onStartDateChanged(e) {
215+
form.getEditor("End").option("min", e.value);
223216
}
224217
225-
function onCancelClick() {
226-
if (!popupInstance) {
227-
popupInstance = $('#taskDetailsPopup').dxPopup('instance');
228-
}
229-
popupInstance.hide();
218+
function formatLabel(value) {
219+
return value + "%";
230220
}
231221
</script>

0 commit comments

Comments
 (0)