1+ {% comment %}
2+ User base currency (EUR, USD, etc.)
3+ {% endcomment %}
4+ {% assign base = trmnl .plugin_settings .custom_fields_values .base_currency | upcase %}
5+
6+ {% comment %}
7+ User metal unit (troy_ounce, grams)
8+ {% endcomment %}
9+ {% assign metal_unit = trmnl .plugin_settings .custom_fields_values .metal_unit %}
10+
11+ {% comment %}
12+ Currency symbol mapping
13+ {% endcomment %}
14+ {% if base == "USD" %}
15+ {% assign currency_symbol = "$" %}
16+ {% elsif base == "EUR" %}
17+ {% assign currency_symbol = "€" %}
18+ {% elsif base == "GBP" %}
19+ {% assign currency_symbol = "£" %}
20+ {% elsif base == "JPY" or base == "CNY" %}
21+ {% assign currency_symbol = "¥" %}
22+ {% elsif base == "UAH" %}
23+ {% assign currency_symbol = "₴" %}
24+ {% elsif base == "INR" %}
25+ {% assign currency_symbol = "₹" %}
26+ {% elsif base == "ILS" %}
27+ {% assign currency_symbol = "₪" %}
28+ {% elsif base == "KRW" %}
29+ {% assign currency_symbol = "₩" %}
30+ {% elsif base == "VND" %}
31+ {% assign currency_symbol = "₫" %}
32+ {% elsif base == "PHP" %}
33+ {% assign currency_symbol = "₱" %}
34+ {% elsif base == "RUB" %}
35+ {% assign currency_symbol = "₽" %}
36+ {% else %}
37+ {% assign currency_symbol = "" %}
38+ {% endif %}
39+
40+ {% comment %}
41+ Fetch rates
42+ {% endcomment %}
43+ {% assign forex = IDX_0 %}
44+ {% assign metals = IDX_1 %}
45+ {% assign crypto = IDX_2 %}
46+ {% assign stocks = IDX_3 %}
47+
48+ {% comment %}
49+ Collect all symbols from different asset types
50+ {% endcomment %}
51+ {% assign all_symbols = "" | split: "" %}
52+
53+ {% comment %}
54+ Process fiat assets
55+ {% endcomment %}
56+ {% assign fiat_assets_string = trmnl .plugin_settings .custom_fields_values .fiat_assets %}
57+ {% assign fiat_assets = fiat_assets_string | split: ',' %}
58+
59+ {% for symbol in fiat_assets %}
60+ {% assign symbol = symbol | strip %}
61+ {% if symbol != "" %}
62+ {% assign symbol_with_type = symbol | append: ":forex" %}
63+ {% assign temp_array = symbol_with_type | split: "|" %}
64+ {% assign all_symbols = temp_array | concat: all_symbols %}
65+ {% endif %}
66+ {% endfor %}
67+
68+ {% comment %}
69+ Process metal assets
70+ {% endcomment %}
71+ {% assign metal_assets_string = trmnl .plugin_settings .custom_fields_values .metal_assets %}
72+ {% assign metal_assets = metal_assets_string | split: ',' %}
73+
74+ {% for symbol in metal_assets %}
75+ {% assign symbol = symbol | strip %}
76+ {% if symbol != "" %}
77+ {% assign symbol_with_type = symbol | append: ":metal" %}
78+ {% assign temp_array = symbol_with_type | split: "|" %}
79+ {% assign all_symbols = temp_array | concat: all_symbols %}
80+ {% endif %}
81+ {% endfor %}
82+
83+ {% comment %}
84+ Process crypto assets
85+ {% endcomment %}
86+ {% assign crypto_assets_string = trmnl .plugin_settings .custom_fields_values .crypto_assets %}
87+ {% assign crypto_assets = crypto_assets_string | split: ',' %}
88+
89+ {% for symbol in crypto_assets %}
90+ {% assign symbol = symbol | strip %}
91+ {% if symbol != "" %}
92+ {% assign symbol_with_type = symbol | append: ":crypto" %}
93+ {% assign temp_array = symbol_with_type | split: "|" %}
94+ {% assign all_symbols = temp_array | concat: all_symbols %}
95+ {% endif %}
96+ {% endfor %}
97+
98+ {% comment %}
99+ Process stock assets
100+ {% endcomment %}
101+ {% assign stock_assets_string = trmnl .plugin_settings .custom_fields_values .stock_assets %}
102+ {% assign stock_assets = stock_assets_string | split: ',' %}
103+
104+ {% for symbol in stock_assets %}
105+ {% assign symbol = symbol | strip %}
106+ {% if symbol != "" %}
107+ {% assign symbol_with_type = symbol | append: ":stock" %}
108+ {% assign temp_array = symbol_with_type | split: "|" %}
109+ {% assign all_symbols = temp_array | concat: all_symbols %}
110+ {% endif %}
111+ {% endfor %}
112+
113+ {%- comment -%} Build sortable_str with entries separated by a unique token {%- endcomment -%}
114+ {% assign sortable_str = "" %}
115+
116+ {% for symbol_with_type in all_symbols %}
117+ {% assign parts = symbol_with_type | split: ":" %}
118+ {% assign symbol = parts [0] %}
119+ {% assign type = parts [1] %}
120+ {% assign price = 0 %}
121+
122+ {% case type %}
123+ {% when "forex" %}
124+ {% if forex .rates [symbol] %}
125+ {% assign price = 1 | divided_by: forex .rates [symbol] %}
126+ {% endif %}
127+ {% when "metal" %}
128+ {% if metals .rates [symbol] %}
129+ {% assign price = 1 | divided_by: metals .rates [symbol] %}
130+ {% if metal_unit == "troy_ounce" %}
131+ {% assign price = price | times: 31.1034768 %}
132+ {% endif %}
133+ {% endif %}
134+ {% when "crypto" %}
135+ {% if crypto .rates [symbol] %}
136+ {% assign price = 1 | divided_by: crypto .rates [symbol] %}
137+ {% endif %}
138+ {% when "stock" %}
139+ {% if stocks .rates [symbol] %}
140+ {% assign price = 1 | divided_by: stocks .rates [symbol] %}
141+ {% endif %}
142+ {% endcase %}
143+
144+ {%- comment -%} zero-pad numeric value (multiply to preserve decimals) {%- endcomment -%}
145+ {% assign padded_num = price | times: 1000000 | round %}
146+ {% assign padded = padded_num | prepend: "000000000000" | slice: -12 , 12 %}
147+
148+ {%- comment -%} entry format: padded|SYMBOL|TYPE|RAWPRICE {%- endcomment -%}
149+ {% assign entry = padded | append: "|" | append: symbol | append: "|" | append: type | append: "|" | append: price %}
150+
151+ {%- comment -%} append to sortable_str using a separator that won't appear in data {%- endcomment -%}
152+ {% if sortable_str == "" %}
153+ {% assign sortable_str = entry %}
154+ {% else %}
155+ {% assign sortable_str = sortable_str | append: "§§§" | append: entry %}
156+ {% endif %}
157+ {% endfor %}
158+
159+ {%- comment -%} turn into a real array and sort by padded prefix (lexicographic), then reverse for DESC {%- endcomment -%}
160+ {% assign sortable = sortable_str | split: "§§§" %}
161+ {% assign sortable = sortable | sort %}
162+ {% assign sortable = sortable | reverse %}
163+
164+ {% comment %}
165+ Determine grid layout based on number of symbols
166+ {% endcomment %}
167+ {% assign symbol_count = all_symbols .size %}
168+
169+ {% if symbol_count == 0 %}
170+ {% assign grid_class = "grid" %}
171+ {% elsif symbol_count == 1 %}
172+ {% assign grid_class = "grid" %}
173+ {% elsif symbol_count == 2 %}
174+ {% assign grid_class = "grid grid--cols-1" %}
175+ {% elsif symbol_count <= 12 %}
176+ {% assign grid_class = "grid grid--cols-2" %}
177+ {% else %}
178+ {% comment %} Limit to 12 symbols maximum {% endcomment %}
179+ {% assign grid_class = "grid grid--cols-2" %}
180+ {% assign symbol_count = 12 %}
181+ {% endif %}
182+
183+ <div class =" layout layout--col gap--space-between" >
184+
185+ {% if symbol_count == 0 %}
186+ <div class =" grid" >
187+ <div class =" item" >
188+ <div class =" meta" ></div >
189+ <div class =" content" >
190+ <span class =" value md:value--large lg:value--xlarge value--tnums" >No symbols configured</span >
191+ <span class =" label" >Add symbols in plugin settings</span >
192+ </div >
193+ </div >
194+ </div >
195+
196+ {% else %}
197+ <div class =" {{ grid_class }}" >
198+ {% for entry in sortable %}
199+ {% assign parts = entry | split: "|" %}
200+ {% assign symbol = parts [1] %}
201+ {% assign type = parts [2] %}
202+ {% assign price = parts [3] %}
203+
204+ {% assign price = 0 %}
205+
206+ {% case type %}
207+ {% when "forex" %}
208+ {% if forex .rates [symbol] %}
209+ {% assign price = 1 | divided_by: forex .rates [symbol] %}
210+ {% endif %}
211+ {% when "metal" %}
212+ {% if metals .rates [symbol] %}
213+ {% assign price = 1 | divided_by: metals .rates [symbol] %}
214+ {% if metal_unit == "troy_ounce" %}
215+ {% assign price = price | times: 31.1034768 %}
216+ {% endif %}
217+ {% endif %}
218+ {% when "crypto" %}
219+ {% if crypto .rates [symbol] %}
220+ {% assign price = 1 | divided_by: crypto .rates [symbol] %}
221+ {% endif %}
222+ {% when "stock" %}
223+ {% if stocks .rates [symbol] %}
224+ {% assign price = 1 | divided_by: stocks .rates [symbol] %}
225+ {% endif %}
226+ {% endcase %}
227+
228+ <div class =" item" >
229+ <div class =" meta" ></div >
230+ <div class =" content" >
231+ <span class =" value {% if symbol_count == 1 %}md:value--xxlarge lg:value--xxxlarge{% elsif symbol_count == 2 %}md:value--xxlarge lg:value--xxxlarge{% elsif symbol_count <= 4 %}md:value--large lg:value--xlarge{% elsif symbol_count <= 6 %}md:value--large lg:value--xlarge{% elsif symbol_count <= 8 %}md:value--large lg:value--large{% elsif symbol_count <= 10 %}md:value lg:value--large{% elsif symbol_count <= 12 %}md:value--small lg:value--large{% else %}md:value--large lg:value--xlarge{% endif %} value--tnums" data-value-format =" true" >
232+ {{ price | round: 4 | number_to_currency: currency_symbol }}
233+ </span >
234+ <span class =" label" >
235+ {% case type %}
236+ {% when "forex" %}
237+ <svg xmlns =" http://www.w3.org/2000/svg" width =" 24" height =" 24" viewBox =" 0 0 24 24" fill =" none" stroke =" currentColor" stroke-width =" 2" stroke-linecap =" round" stroke-linejoin =" round" class =" icon icon-tabler icons-tabler-outline icon-tabler-cash" ><path stroke =" none" d =" M0 0h24v24H0z" fill =" none" /><path d =" M7 9m0 1a1 1 0 0 1 1 -1h12a1 1 0 0 1 1 1v8a1 1 0 0 1 -1 1h-12a1 1 0 0 1 -1 -1z" /><path d =" M12 14a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /></svg >
238+ {% when "metal" %}
239+ <svg xmlns =" http://www.w3.org/2000/svg" width =" 24" height =" 24" viewBox =" 0 0 24 24" fill =" none" stroke =" currentColor" stroke-width =" 2" stroke-linecap =" round" stroke-linejoin =" round" class =" icon icon-tabler icons-tabler-outline icon-tabler-medal" ><path stroke =" none" d =" M0 0h24v24H0z" fill =" none" /><path d =" M12 4v3m-4 -3v6m8 -6v6" /><path d =" M12 18.5l-3 1.5l.5 -3.5l-2 -2l3 -.5l1.5 -3l1.5 3l3 .5l-2 2l.5 3.5z" /></svg >
240+ {% when "crypto" %}
241+ <svg xmlns =" http://www.w3.org/2000/svg" width =" 24" height =" 24" viewBox =" 0 0 24 24" fill =" none" stroke =" currentColor" stroke-width =" 2" stroke-linecap =" round" stroke-linejoin =" round" class =" icon icon-tabler icons-tabler-outline icon-tabler-coin-bitcoin" ><path stroke =" none" d =" M0 0h24v24H0z" fill =" none" /><path d =" M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" /><path d =" M9 8h4.09c1.055 0 1.91 .895 1.91 2s-.855 2 -1.91 2c1.055 0 1.91 .895 1.91 2s-.855 2 -1.91 2h-4.09" /><path d =" M10 12h4" /><path d =" M10 7v10v-9" /><path d =" M13 7v1" /><path d =" M13 16v1" /></svg >
242+ {% when "stock" %}
243+ <svg xmlns =" http://www.w3.org/2000/svg" width =" 24" height =" 24" viewBox =" 0 0 24 24" fill =" none" stroke =" currentColor" stroke-width =" 2" stroke-linecap =" round" stroke-linejoin =" round" class =" icon icon-tabler icons-tabler-outline icon-tabler-chart-line" ><path stroke =" none" d =" M0 0h24v24H0z" fill =" none" /><path d =" M4 19l16 0" /><path d =" M4 15l4 -6l4 2l4 -5l4 4" /></svg >
244+ {% endcase %}
245+ {{ symbol }}
246+ </span >
247+ </div >
248+ </div >
249+ {% endfor %}
250+ </div >
251+ {% endif %}
252+
253+ </div >
0 commit comments