1 /**
2 * Copyright © Webd 2018
3 * License: MIT (https://github.com/DiamondMVC/Webd/blob/master/LICENSE)
4 * Author: Jacob Jensen (bausshf)
5 */
6 module webd.extensions.view;
7 
8 /// Extensions for views.
9 mixin template extensions()
10 {
11   import webd.web.page;
12 
13   /// The page associated with the view.
14   private Page _webd_page;
15 
16   @property
17   {
18     /// Gets the page associated with the view.
19     public Page page()
20     {
21       if (!_webd_page)
22       {
23         _webd_page = new Page;
24 
25         _webd_page.add("Page::Test", "Hello Tags!");
26       }
27 
28       return _webd_page;
29     }
30   }
31 
32   import webd.models : WebdWebItem;
33 
34   /**
35   * Generates tags for an item.
36   * Params:
37   *   itemId = The item id.
38   *   strict = Boolean determining whether the tag generation is strict or not. If it's strict it will throw a 404, else it will just return null for the item.
39   * Returns:
40   *   The item that generated the tags' db representation. Returns null if it's non-strict and the item doesn't exist.
41   */
42   WebdWebItem generateItemTags(ulong itemId, bool strict = true)
43   {
44     import webd.web;
45     import webd.dal;
46 
47     auto item = getItem(itemId);
48 
49     if (!item)
50     {
51       if (strict)
52       {
53         client.notFound();
54       }
55 
56       return null;
57     }
58 
59     page.add("item::name", item.name);
60 
61     auto itemValues = getItemValues(item.id);
62 
63     Loop values;
64 
65     foreach (itemValue; itemValues)
66     {
67       auto itemValueTags = new TagCollection!();
68       values.add(itemValueTags);
69       auto tagName = "item::value::" ~ itemValue.name;
70 
71       itemValueTags.add("name", itemValue.name);
72       itemValueTags.add("type", itemValue.type);
73 
74       switch (itemValue.type)
75       {
76         case "text":
77         case "longText":
78         case "image":
79         case "html":
80         {
81           itemValueTags.add("value", itemValue.textValue);
82           page.add(tagName, itemValue.textValue);
83           break;
84         }
85 
86         case "number":
87         {
88           itemValueTags.add("value", itemValue.numericValue);
89           page.add(tagName, itemValue.numericValue);
90           break;
91         }
92 
93         case "decimalNumber":
94         {
95           itemValueTags.add("value", itemValue.decimalValue);
96           page.add(tagName, itemValue.decimalValue);
97           break;
98         }
99 
100         case "datetime":
101         case "date":
102         case "time":
103         {
104           itemValueTags.add("value", itemValue.datetimeValue);
105           page.add(tagName, itemValue.datetimeValue);
106           break;
107         }
108 
109         case "boolean":
110         {
111           itemValueTags.add("value", itemValue.booleanValue);
112           page.add(tagName, itemValue.booleanValue);
113           break;
114         }
115 
116         case "values":
117         {
118           auto childValues = getItemValues(item.id, itemValue.id);
119 
120           Loop childValuesLoop;
121 
122           foreach (childValue; childValues)
123           {
124             auto childItemValueTags = new TagCollection!();
125             childItemValueTags.add("name", childValue.name);
126             childItemValueTags.add("type", childValue.type);
127 
128             childValuesLoop.add(childItemValueTags);
129 
130             switch (childValue.type)
131             {
132               case "text":
133               case "longText":
134               case "image":
135               case "html":
136               {
137                 childItemValueTags.add("value", childValue.textValue);
138                 page.add(tagName ~ "::" ~ childValue.name, childValue.textValue);
139                 break;
140               }
141 
142               case "number":
143               {
144                 childItemValueTags.add("value", childValue.numericValue);
145                 page.add(tagName ~ "::" ~ childValue.name, childValue.numericValue);
146                 break;
147               }
148 
149               case "decimalNumber":
150               {
151                 childItemValueTags.add("value", childValue.decimalValue);
152                 page.add(tagName ~ "::" ~ childValue.name, childValue.decimalValue);
153                 break;
154               }
155 
156               case "datetime":
157               case "date":
158               case "time":
159               {
160                 childItemValueTags.add("value", childValue.datetimeValue);
161                 page.add(tagName ~ "::" ~ childValue.name, childValue.datetimeValue);
162                 break;
163               }
164 
165               case "boolean":
166               {
167                 childItemValueTags.add("value", childValue.booleanValue);
168                 page.add(tagName ~ "::" ~ childValue.name, childValue.booleanValue);
169                 break;
170               }
171 
172               default: break;
173             }
174           }
175 
176           itemValueTags.add("values", childValuesLoop);
177           break;
178         }
179 
180         default: break;
181       }
182     }
183 
184     page.add("item::values", values);
185 
186     return item;
187   }
188 }