PageSourceSearch

https://spark.parkpark.dk/build/assets/js/taskcard-Byisn4S1.js

js parkpark.dk collected 2026-09-24 12:44:44 UTC 19,618 bytes, 497 lines download raw bytes

1import { o as __toESM } from "./chunk-CPYxVWes.js";
2import { t as require_jquery } from "./jquery-Bw33iOZF.js";
3import { B as buildAvatars, G as datetime_to_dynamic_datetimestring, J as datetime_tz_to_datetime, Y as displayErrors, a as PersonPicker, c as _days_short_string_array, ct as openMorphModal, ht as truncateString, lt as paginator_menu, mt as trans, n as InteractiveID, q as datetime_tz_to_date, r as MorphModalIsOpen, ut as populateTable } from "./global-CtxDzNbZ.js";
4import { t as require_daterangepicker } from "./daterangepicker-gcCN3p8A.js";
5require_daterangepicker();
6var import_jquery = /* @__PURE__ */ __toESM(require_jquery(), 1);
7var tasks_loaded = false;
8var taskcenter_task_id = null;
9(0, import_jquery.default)(document).on("click", ".task_resolve", function() {
10	let task_id = (0, import_jquery.default)(this).data("task_id");
11	Swal.fire({
12		title: trans("Update task"),
13		text: trans("Are you sure you mark the task as resolved?"),
14		icon: "warning",
15		showCancelButton: true,
16		cancelButtonColor: "#e1e1e1",
17		cancelButtonText: `<i class="fas fa-times-circle fa-fw"></i> ${trans("Back")}`,
18		confirmButtonColor: "#1cc88a",
19		confirmButtonText: `<i class="fas fa-check-circle fa-fw"></i> ${trans("Yes")}`
20	}).then((result) => {
21		if (result.value) taskcard_changeTaskStatus(task_id, "resolve");
22	});
23});
24(0, import_jquery.default)(document).on("click", ".task_delete", function() {
25	let task_id = (0, import_jquery.default)(this).data("task_id");
26	Swal.fire({
27		title: trans("Update task"),
28		text: trans("Are you sure you mark the task as deleted?"),
29		icon: "warning",
30		showCancelButton: true,
31		cancelButtonColor: "#e1e1e1",
32		cancelButtonText: `<i class="fas fa-times-circle fa-fw"></i> ${trans("Back")}`,
33		confirmButtonColor: "#1cc88a",
34		confirmButtonText: `<i class="fas fa-check-circle fa-fw"></i> ${trans("Yes")}`
35	}).then((result) => {
36		if (result.value) taskcard_changeTaskStatus(task_id, "delete");
37	});
38});
39(0, import_jquery.default)(document).on("click", ".task_pause", function() {
40	let task_id = (0, import_jquery.default)(this).data("task_id");
41	Swal.fire({
42		title: trans("Update task"),
43		text: trans("Are you sure you mark the task as paused?"),
44		icon: "warning",
45		showCancelButton: true,
46		cancelButtonColor: "#e1e1e1",
47		cancelButtonText: `<i class="fas fa-times-circle fa-fw"></i> ${trans("Back")}`,
48		confirmButtonColor: "#1cc88a",
49		confirmButtonText: `<i class="fas fa-check-circle fa-fw"></i> ${trans("Yes")}`
50	}).then((result) => {
51		if (result.value) taskcard_changeTaskStatus(task_id, "pause");
52	});
53});
54(0, import_jquery.default)(document).on("click", ".task_open", function() {
55	taskcard_getTask((0, import_jquery.default)(this).data("task_id"));
56	if (!MorphModalIsOpen("#taskcard_modal")) openMorphModal("#taskcard_modal");
57});
58(0, import_jquery.default)(document).on("click", ".task_back", function() {
59	if (!tasks_loaded) taskcard_getTasks();
60	(0, import_jquery.default)("#taskcenter_task_details_container").html("").addClass("d-none");
61	(0, import_jquery.default)("#task_overview_container").removeClass("d-none");
62});
63(0, import_jquery.default)(document).on("click", ".tasks_open", function() {
64	taskcard_getTasks();
65	if (!MorphModalIsOpen("#taskcard_modal")) openMorphModal("#taskcard_modal");
66});
67(0, import_jquery.default)(document).on("click", ".taskcard_status_select", function() {
68	taskcard_getTasks();
69});
70(0, import_jquery.default)(document).on("change", "#taskcard_own_tasks_only", function() {
71	taskcard_getTasks();
72});
73(0, import_jquery.default)(document).on("click", "#task_pagination_size_10,#task_pagination_size_25,#task_pagination_size_100", function() {
74	(0, import_jquery.default)("#task_pagination_size").val((0, import_jquery.default)(this).val());
75	taskcard_getTasks();
76});
77function taskcard_getTasks(option = { page: 0 }) {
78	tasks_loaded = true;
79	let paginator_config = {
80		callback_function: taskcard_getTasks,
81		filter_data: [{
82			label: trans("Own tasks only"),
83			column_name: "own_tasks_only",
84			type: "checkbox"
85		}, {
86			label: trans("Status"),
87			column_name: "status",
88			type: "checkbox-list",
89			data: { list: filter_task_status }
90		}],
91		search_enabled: true,
92		search_label: trans("Search for task"),
93		pagination_size: localStorage.getItem(`paginator_per_page_taskcard_getTasks`)
94	};
95	paginator_config = {
96		...paginator_config,
97		...option
98	};
99	let table = "taskcard_tasks_table";
100	(0, import_jquery.default)(`#${table}, #${table}_wrapper`).addClass("tableloader");
101	import_jquery.default.ajax({
102		type: "GET",
103		url: `${_route_prefix}/ajax/fragment/gettasks`,
104		data: {
105			page: paginator_config?.page,
106			search: paginator_config?.search,
107			filters: paginator_config?.filters,
108			pagination_size: paginator_config?.pagination_size
109		},
110		success: function(data) {
111			let tasks = data.data;
112			let options = {
113				searching: false,
114				paging: false,
115				info: false,
116				order: [[0, "desc"]]
117			};
118			let collection = [];
119			let columns = [
120				{
121					data: "id",
122					title: "#",
123					width: "5%"
124				},
125				{
126					data: "status",
127					title: trans("Status"),
128					width: "5%"
129				},
130				{
131					data: "title",
132					title: trans("Description"),
133					width: "57%"
134				},
135				{
136					data: "assigned_group",
137					title: trans("Responsible"),
138					width: "10%"
139				},
140				{
141					data: "assignee",
142					title: trans("Assigned"),
143					width: "10%"
144				},
145				{
146					data: "due_date",
147					title: trans("Due date"),
148					width: "10%"
149				},
150				{
151					data: "created_at",
152					title: trans("Created at"),
153					width: "10%"
154				},
155				{
156					data: "action",
157					title: "<i class=\"fas fa-bolt fa-fw\"></i>",
158					className: "text-center",
159					width: "3%"
160				}
161			];
162			for (let i = 0; tasks.length > i; i++) {
163				let task = tasks[i];
164				let account_html = ``;
165				switch (task.resource) {
166					case "App\\Account":
167						account_html = InteractiveID({
168							string: "account_id:" + task.identifier,
169							icon: "<i class='fas fa-user fa-fw'></i>"
170						});
171						break;
172					case "App\\Models\\AccountMaster\\AccountMaster":
173						account_html = InteractiveID({
174							string: "accountmaster_id:" + task.identifier,
175							icon: "<i class='fas fa-building fa-fw'></i>"
176						});
177						break;
178				}
179				let status_html = ``;
180				switch (task.status) {
181					case 0:
182						status_html = `<small class="badge badge-danger">${trans("Deleted")}</small class>`;
183						break;
184					case 1:
185						status_html = `<small class="badge badge-primary">${trans("Active")}</small>`;
186						break;
187					case 2:
188						status_html = `<small class="badge badge-warning">${trans("Paused")}</small>`;
189						break;
190					case 3:
191						status_html = `<small class="badge badge-success">${trans("Resolved")}</small>`;
192						break;
193				}
194				let assignee_html = "";
195				if (task.rel_assignee) {
196					let avatar_html;
197					if (task.rel_assignee.avatar) avatar_html = buildAvatars({
198						useImagePath: `/upload/avatar/${task.rel_assignee.avatar}`,
199						setheight: 20,
200						setwidth: 20,
201						classes: "d-inline rounded",
202						returnHtml: true
203					});
204					else avatar_html = buildAvatars({
205						setheight: 20,
206						setwidth: 20,
207						classes: "d-inline rounded",
208						returnHtml: true
209					});
210					assignee_html = `
211                        <div class="d-inline">
212                            <small class="badge badge-light">${avatar_html} ${task.rel_assignee.name} ${task.rel_assignee.lastname ?? ""}</small>
213                        </div>
214                    `;
215				} else assignee_html = `
216                        <div class="d-inline">
217                            <small class="text-muted">-- ${trans("Not assigned")} --</small>
218                        </div>
219                    `;
220				let due_date_html = "";
221				let due_date_badge = "badge-light";
222				if (task.hasOwnProperty("due_date") && task.due_date != null) {
223					var then = dayjs();
224					if (dayjs(task.due_date).diff(then, "second") < 0) due_date_badge = "badge-danger";
225					task.due_date != null ? due_date_html = `<small title="${datetime_tz_to_date(task.due_date)}" class="text-center badge ${due_date_badge}"><i class="fas fa-clock fa-fw"></i> ${datetime_tz_to_date(task.due_date)}</small>` : due_date_html = "";
226				}
227				let action_html = `
228                    ${account_html}
229                    <button class="btn btn-sm btn-light task_open" data-task_id="${task.id}"><i class="fas fa-tasks fa-fw"></i></button>
230                `;
231				let item = {
232					"id": `<span class="badge badge-light">#${task.id}</span>`,
233					"status": `${status_html}`,
234					"title": `<small style="min-width:150px;">${truncateString(task.title, 120)}</small>`,
235					"assigned_group": task.rel_assigned_group ? task.rel_assigned_group.name : "-",
236					"assignee": assignee_html,
237					"due_date": due_date_html,
238					"created_at": `<small title="${datetime_tz_to_datetime(task.created_at)}" class="text-muted flex-shrink-1 text-center " data-task_id="${task.id}">${datetime_to_dynamic_datetimestring(datetime_tz_to_datetime(task.created_at))}</small>`,
239					"action": action_html
240				};
241				collection.push(item);
242			}
243			populateTable({
244				collection,
245				table,
246				columns,
247				options
248			});
249			paginator_menu(table, data, paginator_config);
250		},
251		error: function(xhr) {
252			displayErrors(xhr, typeof table !== "undefined" ? table : null);
253		}
254	});
255}
256function taskcard_updateAssignee(assignee_id) {
257	import_jquery.default.ajax({
258		type: "POST",
259		url: `${_route_prefix}/ajax/fragment/updateassignee`,
260		data: {
261			task_id: taskcenter_task_id,
262			assignee_id
263		},
264		success: function(data) {
265			let assignee = data.data;
266			let avatar_html;
267			if (assignee.avatar) avatar_html = buildAvatars({
268				useImagePath: `/upload/avatar/${assignee.avatar}`,
269				setheight: 20,
270				setwidth: 20,
271				classes: "d-inline rounded",
272				returnHtml: true
273			});
274			else avatar_html = buildAvatars({
275				setheight: 20,
276				setwidth: 20,
277				classes: "d-inline rounded",
278				returnHtml: true
279			});
280			(0, import_jquery.default)(".taskcard_get_assignees").html(`${avatar_html} ${assignee.name}`);
281			taskcard_getTasks();
282		},
283		error: function(xhr) {
284			displayErrors(xhr, typeof table !== "undefined" ? table : null);
285		}
286	});
287}
288function taskcard_getAssignees(task_id, selected_assignee = null) {
289	import_jquery.default.ajax({
290		type: "POST",
291		url: `${_route_prefix}/ajax/fragment/getassignees`,
292		data: {},
293		success: function(data) {
294			let assignees = data;
295			let selected_person_id = 0;
296			if (selected_assignee) selected_person_id = selected_assignee.id;
297			PersonPicker({ persons: assignees }, {
298				id: "taskcard_selected_assignee",
299				target: "#taskcard_assignee_container",
300				display_avatar: true,
301				selected_person_id,
302				callback: function(selected_id) {
303					taskcard_updateAssignee(selected_id);
304				}
305			});
306		},
307		error: function(xhr) {
308			displayErrors(xhr, typeof table !== "undefined" ? table : null);
309		}
310	});
311}
312function taskcard_getTask(task_id) {
313	taskcenter_task_id = task_id;
314	import_jquery.default.ajax({
315		type: "POST",
316		url: `${_route_prefix}/ajax/fragment/gettask`,
317		data: { task_id },
318		success: function(data) {
319			let task = data;
320			let isDisabled = `disabled="disabled"`;
321			if (task.status === 1) isDisabled = "";
322			let assignee = null;
323			if (task.rel_assignee) assignee = task.rel_assignee;
324			let due_date_badge = "badge-light";
325			let due_date_content = `${trans("Add due date")}`;
326			if (task.hasOwnProperty("due_date") && task.due_date != null) {
327				var then = dayjs();
328				if (dayjs(task.due_date).diff(then, "second") < 0) due_date_badge = "badge-danger";
329				task.due_date != null && (due_date_content = `${datetime_tz_to_date(task.due_date)}`);
330			}
331			let due_date_btn_html = `<button class="btn btn-sm btn-light task_add_duedate ${due_date_badge}" data-task_id="${task_id}" ${isDisabled}><input type="hidden" id="task_duedate"><i class="fas fa-clock fa-fw"></i> ${due_date_content}</button>`;
332			let resource_btn = ``;
333			switch (task.resource) {
334				case "App\\Account":
335					resource_btn = InteractiveID({
336						string: `account_id:${task.identifier}`,
337						tooltip: ``,
338						icon: "<i class='fas fa-user fa-fw'></i>",
339						element_type: "a",
340						href: `${_route_prefix}/account/${task.identifier}`
341					});
342					break;
343				case "App\\Models\\AccountMaster\\AccountMaster":
344					resource_btn = `${InteractiveID({
345						string: "accountmaster_id:" + task.identifier,
346						icon: "<i class='fas fa-user-tie fa-fw'></i>"
347					})}`;
348					break;
349			}
350			let html = `
351                <div class="row">
352                    <div class="col-12 task_toolbar d-flex justify-content-between align-items-center">
353                        <button title="${trans("Back to overview")}" type="button" class="btn btn-sm btn-light task_back"><i class="fas fa-arrow-left fa-fw"></i> ${trans("Back to overview")}</button>
354                        <span>
355                            <button title="${trans("Delete task")}" type="button" class="btn btn-sm btn-danger task_delete" data-task_id="${task_id}" ${isDisabled}><i class="fas fa-trash fa-fw"></i></button>
356                        </span>
357                    </div>
358                </div>
359                <hr class="dashed">
360                <div class="task">
361                            <div class="row">
362                                <div class="col-9 border-right">
363                                    <div class="d-flex justify-content-center">
364                                        <span class="font-bold text-center">${trans(task.title)}</span>
365                                    </div>
366                                    <div class="row">
367                                        <div class="col-12">
368                                            <small>${trans(task.description)}</small>
369                                        </div>
370                                    </div>
371                                </div>
372                                <div class="col-3">
373                                    <div class="row">
374                                        <div class="col-12 text-center">
375                                            ${trans("Task id")} <span class="badge badge-counter border">#${task.id}</span>
376                                        </div>
377                                    </div>
378                                    <hr class="dashed">
379                                    <div class="d-flex justify-content-between">
380                                        <small>${trans("Responsible")}</small>
381                                        <span>${trans(task.rel_assigned_group?.name ?? "-")}</span>
382                                    </div>
383                                    <hr class="dashed">
384                                    <div class="d-flex justify-content-between">
385                                        <small>${trans("Assigned")}</small>
386                                        <div id="taskcard_assignee_container"></div>
387                                    </div>
388                                    <hr class="dashed">
389                                    <div class="d-flex justify-content-between">
390                                        <small>${trans("Due date")}</small>
391                                        ${due_date_btn_html}
392                                    </div>
393                                    <hr class="dashed">
394                                    <div class="d-flex justify-content-center">
395                                        ${resource_btn}
396                                    </div>
397                                    <div class="row">
398                                        <div class="col-12">
399                                            <small title="${datetime_tz_to_datetime(task.created_at)}"  class="text-muted">${trans("Created at")} ${datetime_to_dynamic_datetimestring(datetime_tz_to_datetime(task.created_at))}</small>
400                                        </div>
401                                    </div>
402                                    <div class="row">
403                                        <div class="col-12">
404                                            <small title="${datetime_tz_to_datetime(task.updated_at)}"  class="text-muted">${trans("Updated at")} ${datetime_to_dynamic_datetimestring(datetime_tz_to_datetime(task.updated_at))}</small>
405                                        </div>
406                                    </div>
407                                </div>
408                            </div>
409                    </div>
410                <hr class="dashed">
411                <div class="row">
412                    <div class="col-12">
413                        <button class="btn btn-sm btn-outline-success task_resolve float-right" data-task_id="${task.id}" ${isDisabled}><i class="fas fa-circle-check fa-fw"></i> ${trans("Mark as resolved")}</button>
414                    </div>
415                </div>
416            `;
417			(0, import_jquery.default)("#taskcenter_task_details_container").html(html).removeClass("d-none");
418			if ((0, import_jquery.default)(".task_add_duedate").length) {
419				(0, import_jquery.default)(".task_add_duedate").daterangepicker({
420					"singleDatePicker": true,
421					"timePicker": false,
422					"timePicker24Hour": true,
423					"timePickerSeconds": false,
424					"autoUpdateInput": true,
425					"minDate": dayjs(),
426					"locale": {
427						"format": "YYYY-MM-DD",
428						"separator": " - ",
429						"applyLabel": trans("Apply"),
430						"cancelLabel": trans("Undo"),
431						"fromLabel": trans("From"),
432						"toLabel": trans("To"),
433						"customRangeLabel": "Custom",
434						"weekLabel": trans("Week"),
435						"daysOfWeek": _days_short_string_array,
436						"monthNames": _month_long_string_array,
437						"firstDay": 1
438					},
439					"linkedCalendars": false,
440					"showCustomRangeLabel": false,
441					"alwaysShowCalendars": true,
442					"opens": "center",
443					"drops": "down"
444				});
445				(0, import_jquery.default)(".task_add_duedate").on("apply.daterangepicker", function(ev, picker) {
446					(0, import_jquery.default)(".task_add_duedate").html(`<i class="fas fa-clock fa-fw"></i> ${unix_to_date(picker.startDate.unix())}`);
447					(0, import_jquery.default)("#task_duedate").val(picker.startDate.unix());
448					taskcard_changeProperty((0, import_jquery.default)(this).data("task_id"), "due_date", picker.startDate.unix());
449				});
450			}
451			taskcard_getAssignees(task_id, assignee);
452			(0, import_jquery.default)("#task_overview_container").addClass("d-none");
453		},
454		error: function(xhr) {
455			displayErrors(xhr, typeof table !== "undefined" ? table : null);
456		}
457	});
458}
459function taskcard_changeTaskStatus(task_id, status) {
460	import_jquery.default.ajax({
461		type: "POST",
462		url: `${_route_prefix}/ajax/fragment/changestatus`,
463		data: {
464			task_id,
465			status
466		},
467		success: function(data) {
468			if (status === "resolve") {
469				taskcard_getTasks();
470				(0, import_jquery.default)("#taskcenter_task_details_container").html("").addClass("d-none");
471				(0, import_jquery.default)("#task_overview_container").removeClass("d-none");
472			}
473		},
474		error: function(xhr) {
475			displayErrors(xhr, typeof table !== "undefined" ? table : null);
476		}
477	});
478}
479function taskcard_changeProperty(task_id, property, value) {
480	import_jquery.default.ajax({
481		type: "POST",
482		url: `${_route_prefix}/ajax/fragment/changeproperty`,
483		data: {
484			task_id,
485			property,
486			value
487		},
488		success: function(data) {
489			taskcard_getTasks();
490		},
491		error: function(xhr) {
492			displayErrors(xhr, typeof table !== "undefined" ? table : null);
493		}
494	});
495}
496//#endregion
497export { taskcard_changeProperty, taskcard_changeTaskStatus, taskcard_getAssignees, taskcard_getTask, taskcard_getTasks, taskcard_updateAssignee };

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.