Skip to content

Commit ca126ae

Browse files
authored
Merge pull request #17 from anupamvs/main
add sub type in record actions web form
2 parents e0bdb9f + a2bb48d commit ca126ae

File tree

3 files changed

+144
-35
lines changed

3 files changed

+144
-35
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
frappe.treeview_settings['Event Type'] = {
2+
breadcrumb: 'Samaaja',
3+
title: __('Event Type'),
4+
get_tree_nodes: 'frappe.desk.treeview.get_children',
5+
root_label: 'All Event Types',
6+
ignore_fields: ['parent_event_type'],
7+
filters: [
8+
{
9+
fieldname: 'type',
10+
label: __('Type'),
11+
fieldtype: 'Data'
12+
}
13+
],
14+
fields: [
15+
{
16+
fieldtype: 'Data',
17+
fieldname: 'type',
18+
label: __('New Event Type Name'),
19+
reqd: true
20+
},
21+
{
22+
fieldtype: 'Check',
23+
fieldname: 'is_group',
24+
label: __('Is Group'),
25+
description: __('Further cost centers can be made under Groups but entries can be made against non-Groups')
26+
}
27+
],
28+
add_tree_node: 'samaaja.samaaja.doctype.event_type.event_type.add_node'
29+
};
Lines changed: 72 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,76 @@
11
frappe.ready(function () {
2+
// Load top-level event types
3+
frappe.call({
4+
method: "frappe.client.get_list",
5+
args: {
6+
doctype: "Event Type",
7+
filters: {
8+
is_group: 1
9+
},
10+
fields: ["name"]
11+
},
12+
callback: function (r) {
13+
if (r.message) {
14+
const options = r.message.map(row => row.name);
15+
frappe.web_form.fields_dict.type.df.options = options;
16+
frappe.web_form.fields_dict.type.refresh();
17+
}
18+
}
19+
});
20+
21+
// Load subtypes when type is selected
22+
frappe.web_form.on('type', function (value) {
23+
if (!value) return;
24+
25+
frappe.call({
26+
method: "frappe.client.get_list",
27+
args: {
28+
doctype: "Event Type",
29+
filters: {
30+
parent_event_type: value.value,
31+
is_group: 0
32+
},
33+
fields: ["name"]
34+
},
35+
callback: function (r) {
36+
const subOptions = r.message.map(row => row.name);
37+
frappe.web_form.fields_dict.sub_type.df.options = subOptions;
38+
frappe.web_form.fields_dict.sub_type.refresh();
39+
frappe.web_form.set_value("sub_type", "");
40+
}
41+
});
42+
});
43+
44+
// Validation before form submission
245
frappe.web_form.validate = () => {
346
let data = frappe.web_form.get_values();
447
if (data.title.length > 70) {
548
frappe.msgprint("Please restrict title to max 70 characters.");
649
return false;
750
}
8-
if (frappe.web_form.get_value("user") && !(frappe.utils.validate_type(frappe.web_form.get_value("user"), "email"))) {
51+
if (
52+
frappe.web_form.get_value("user") &&
53+
frappe.web_form.get_value("user") !== "Administrator" &&
54+
!frappe.utils.validate_type(frappe.web_form.get_value("user"), "email")
55+
) {
956
frappe.msgprint('Invalid email address');
1057
return false;
1158
}
12-
1359
};
1460

61+
// Title input live validation
1562
frappe.web_form.on("title", (field, value) => {
16-
console.log(value)
1763
if (value.length > 70) {
18-
frappe.msgprint(`Please restrict the title to max 70 characters, <br> You've entered ${value.length} characters in the title`);
64+
frappe.msgprint(
65+
`Please restrict the title to max 70 characters, <br> You've entered ${value.length} characters in the title`
66+
);
1967
}
2068
});
2169

70+
// Set max length for title input
2271
$('*[data-fieldname="title"]').attr("maxlength", "70");
2372

24-
25-
// hide / show fields based on user login information
73+
// Show/hide fields based on user login
2674
if (frappe.session.user && frappe.session.user != "Guest") {
2775
frappe.web_form.set_value(["user"], frappe.session.user);
2876
frappe.web_form.set_df_property("user", "hidden", 1);
@@ -43,7 +91,7 @@ frappe.ready(function () {
4391
frappe.web_form.set_df_property("user", "hidden", 0);
4492
}
4593

46-
// default starting position for map
94+
// Default map position
4795
let defaultPosition = [22.1458, 80.0882];
4896

4997
if (navigator.geolocation) {
@@ -53,52 +101,45 @@ frappe.ready(function () {
53101
}
54102

55103
function showMap(position) {
56-
if (position) {
57-
if (position.coords) {
58-
let lat = position.coords.longitude;
59-
let long = position.coords.latitude;
60-
defaultPosition = [];
61-
defaultPosition.push(lat);
62-
defaultPosition.push(long);
63-
}
104+
if (position && position.coords) {
105+
let lat = position.coords.longitude;
106+
let long = position.coords.latitude;
107+
defaultPosition = [lat, long];
64108
}
109+
65110
const container = document.getElementById("map");
66111
if (container) {
67-
68112
const screenWidth = window.screen.width;
113+
let mapZoom = screenWidth < 700 ? 4 : 5.4;
69114

70-
let mapZoom = 5.4
71-
if (screenWidth < 700) {
72-
mapZoom = 4
73-
}
74115
let map = L.map("map").setView(defaultPosition, mapZoom);
75116

76117
L.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", {
77118
maxZoom: 19,
78119
attribution:
79120
'&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>',
80121
}).addTo(map);
122+
81123
let allMarkers = [];
82-
map
83-
.locate({
84-
setView: true,
85-
})
86-
.on("locationerror", function (e) {
87-
console.log(e);
88-
});
124+
125+
map.locate({
126+
setView: true,
127+
}).on("locationerror", function (e) {
128+
console.log(e);
129+
});
89130

90131
function onMapClick(e) {
91-
for (let step = 0; step < allMarkers.length; step++) {
92-
map.removeLayer(allMarkers[step]);
93-
}
132+
allMarkers.forEach(marker => map.removeLayer(marker));
94133
const latlng = e.latlng;
134+
95135
frappe.web_form.set_value(["latitude"], latlng.lat);
96136
frappe.web_form.set_value(["longitude"], latlng.lng);
97137

98138
let marker = L.marker([latlng.lat, latlng.lng]).addTo(map);
99139
allMarkers.push(marker);
100140
}
141+
101142
map.on("click", onMapClick);
102143
}
103144
}
104-
});
145+
});

samaaja/samaaja/web_form/record_actions/record_actions.json

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
"list_columns": [],
2020
"login_required": 1,
2121
"max_attachment_size": 0,
22-
"modified": "2024-10-10 12:08:40.563869",
23-
"modified_by": "hello@anupamvs.dev",
22+
"modified": "2025-05-21 11:37:28.482988",
23+
"modified_by": "Administrator",
2424
"module": "Samaaja",
2525
"name": "record-actions",
2626
"owner": "Administrator",
@@ -58,15 +58,28 @@
5858
"reqd": 1,
5959
"show_in_filter": 0
6060
},
61+
{
62+
"allow_read_on_all_link_options": 0,
63+
"fieldname": "",
64+
"fieldtype": "Section Break",
65+
"hidden": 0,
66+
"label": "",
67+
"max_length": 0,
68+
"max_value": 0,
69+
"options": "",
70+
"read_only": 0,
71+
"reqd": 0,
72+
"show_in_filter": 0
73+
},
6174
{
6275
"allow_read_on_all_link_options": 1,
6376
"fieldname": "type",
64-
"fieldtype": "Link",
77+
"fieldtype": "Select",
6578
"hidden": 0,
6679
"label": "Type",
6780
"max_length": 0,
6881
"max_value": 0,
69-
"options": "Event Type",
82+
"options": "",
7083
"read_only": 0,
7184
"reqd": 1,
7285
"show_in_filter": 0
@@ -84,6 +97,32 @@
8497
"reqd": 1,
8598
"show_in_filter": 0
8699
},
100+
{
101+
"allow_read_on_all_link_options": 0,
102+
"fieldname": "",
103+
"fieldtype": "Column Break",
104+
"hidden": 0,
105+
"label": "",
106+
"max_length": 0,
107+
"max_value": 0,
108+
"options": "",
109+
"read_only": 0,
110+
"reqd": 0,
111+
"show_in_filter": 0
112+
},
113+
{
114+
"allow_read_on_all_link_options": 0,
115+
"fieldname": "sub_type",
116+
"fieldtype": "Select",
117+
"hidden": 0,
118+
"label": "Sub Type",
119+
"max_length": 0,
120+
"max_value": 0,
121+
"options": "",
122+
"read_only": 0,
123+
"reqd": 1,
124+
"show_in_filter": 0
125+
},
87126
{
88127
"allow_read_on_all_link_options": 1,
89128
"fieldname": "subcategory",

0 commit comments

Comments
 (0)