File: HtmlTagSelect.cpp

package info (click to toggle)
railcontrol 24%2Bdfsg1-8
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,636 kB
  • sloc: cpp: 40,819; javascript: 2,509; makefile: 144; php: 97; sh: 60
file content (112 lines) | stat: -rw-r--r-- 3,097 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*
RailControl - Model Railway Control Software

Copyright (c) 2017-2025 by Teddy / Dominik Mahrer - www.railcontrol.org

RailControl is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3, or (at your option) any
later version.

RailControl is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with RailControl; see the file LICENCE. If not see
<http://www.gnu.org/licenses/>.
*/

#include "Server/Web/HtmlTagSelect.h"

namespace Server { namespace Web
{
	HtmlTagSelect::HtmlTagSelect(const std::string& name,
		const std::map<std::string,std::string>& options,
		const std::string& defaultValue)
	:	HtmlTagSelect(name)
	{
		for (auto& option : options)
		{
			AddOption(option.first, option.second, option.first == defaultValue);
		}
		CheckDefaultKeyValue();
	}

	HtmlTagSelect::HtmlTagSelect(const std::string& name,
		const std::map<std::string,DataModel::ObjectIdentifier>& options,
		const DataModel::ObjectIdentifier& defaultValue)
	:	HtmlTagSelect(name)
	{
		for (auto& option : options)
		{
			AddOption(option.second, option.first, option.second == defaultValue);
		}
		CheckDefaultKeyValue();
	}

	HtmlTagSelect::HtmlTagSelect(const std::string& name)
	:	HtmlTag("div"),
		commandID("s_" + name),
		defaultKeyValueFound(false)
	{
		AddId(commandID + "_container");
		AddClass("dropdowncontainer");

		HtmlTagInputHidden hidden(name, "");
		hidden.AddId(commandID);
		AddChildTag(hidden);

		HtmlTagInputText text("skip_" + commandID);
		text.AddId("skip_" + commandID);
		text.AddAttribute("onclick", "toggleClass('d_" + commandID + "', 'show'); return false;");
		text.AddAttribute("readonly");
		AddChildTag(text);

		HtmlTag dropDown("div");
		dropDown.AddClass("dropdown");
		dropDown.AddId("d_" + commandID);
		AddChildTag(dropDown);
	}

	HtmlTag HtmlTagSelect::AddAttribute(const std::string& name, const std::string& value)
	{
		childTags[0].AddAttribute(name, value);
		return *this;
	}

	void HtmlTagSelect::AddOption(const std::string& key,
		const std::string& value,
		const bool defaultKeyValue)
	{
		defaultKeyValueFound |= defaultKeyValue;
		if (defaultKeyValue || defaultKey.length() == 0)
		{
			defaultKey = key;
			defaultValue = value;
		}

		HtmlTag optionTag("div");
		optionTag.AddAttribute("key", key);
		optionTag.AddClass("dropdownentry");
		optionTag.AddContent(value);
		if (defaultKeyValue)
		{
			SetDefaultKeyValue(key, value);
			optionTag.AddClass("selected_option");
		}
		optionTag.AddAttribute("onclick", "selectValue('" + key + "', '" + value + "', '" + commandID + "');");
		childTags[2].AddChildTag(optionTag);
	}

	void HtmlTagSelect::CheckDefaultKeyValue()
	{
		if (defaultKeyValueFound)
		{
			return;
		}

		SetDefaultKeyValue(defaultKey, defaultValue);
	}
}} // namespace Server::Web