@opengis/admin 0.1.80 → 0.1.82

Sign up to get free protection for your applications and to get access to all the features.
Files changed (143) hide show
  1. package/README.md +29 -29
  2. package/config.js +4 -4
  3. package/dist/{IconChevronDown-DWLdkAUG.js → IconChevronDown-TOHGDzb9.js} +1 -1
  4. package/dist/{add-page-GDPnGgQK.js → add-page-DVsruEe8.js} +1 -1
  5. package/dist/{admin-interface-DOqhM3SD.js → admin-interface-CqPS5k9y.js} +363 -363
  6. package/dist/{admin-view-xnJ3u3oI.js → admin-view-DtZwCxNO.js} +4 -4
  7. package/dist/admin.js +1 -1
  8. package/dist/admin.umd.cjs +85 -85
  9. package/dist/assets/logo.svg +41 -41
  10. package/dist/card-page-DiSMqrtf.js +358 -0
  11. package/dist/{card-view-CuKF08UR.js → card-view-RC_RStl7.js} +1 -1
  12. package/dist/{edit-page-J0eDzIuJ.js → edit-page-B0syX8OD.js} +1 -1
  13. package/dist/{import-file-REG5YZVe.js → import-file-BihjtZo9.js} +8208 -8008
  14. package/dist/style.css +1 -1
  15. package/module/settings/card/admin.roles.table/access.hbs +27 -27
  16. package/module/settings/card/admin.roles.table/general_info.hbs +16 -16
  17. package/module/settings/card/admin.roles.table/index.yml +14 -14
  18. package/module/settings/card/admin.roles.table/users.hbs +27 -27
  19. package/module/settings/card/admin.routes.table/general_info.hbs +40 -40
  20. package/module/settings/card/admin.routes.table/index.yml +8 -8
  21. package/module/settings/card/admin.routes.table/users.hbs +33 -33
  22. package/module/settings/card/admin.users.table/general_info.hbs +25 -25
  23. package/module/settings/card/admin.users.table/index.yml +12 -12
  24. package/module/settings/card/admin.users.table/logs.hbs +30 -30
  25. package/module/settings/card/admin.users.table/user_roles.hbs +24 -24
  26. package/module/settings/cls/core.actions.json +17 -13
  27. package/module/settings/cls/core.scope.json +13 -13
  28. package/module/settings/cls/properties.site_status.json +13 -13
  29. package/module/settings/cls/properties.widget_status.json +13 -13
  30. package/module/settings/cls/users.user_type.json +13 -13
  31. package/module/settings/form/admin.access.form.json +36 -36
  32. package/module/settings/form/admin.custom_column.form.json +71 -71
  33. package/module/settings/form/admin.properties.form.json +15 -15
  34. package/module/settings/form/admin.roles.form.json +19 -19
  35. package/module/settings/form/admin.routes.form.json +25 -25
  36. package/module/settings/form/admin.user_properties.form.json +15 -15
  37. package/module/settings/form/admin.user_roles.form.json +21 -21
  38. package/module/settings/form/admin.users.form.json +153 -153
  39. package/module/settings/form/user.user_roles.form.json +13 -13
  40. package/module/settings/interface/admin.properties.json +4 -4
  41. package/module/settings/interface/admin.roles.json +4 -4
  42. package/module/settings/interface/admin.routes.json +4 -4
  43. package/module/settings/interface/admin.users.json +4 -4
  44. package/module/settings/menu.json +50 -50
  45. package/module/settings/select/core.roles.json +2 -2
  46. package/module/settings/select/core.routes.sql +1 -1
  47. package/module/settings/select/core.user_mentioned.sql +1 -1
  48. package/module/settings/select/core.user_uid.sql +1 -1
  49. package/module/settings/table/admin.access.table.json +83 -83
  50. package/module/settings/table/admin.custom_column.table.json +99 -99
  51. package/module/settings/table/admin.properties.table.json +39 -39
  52. package/module/settings/table/admin.roles.table.json +64 -64
  53. package/module/settings/table/admin.routes.table.json +68 -68
  54. package/module/settings/table/admin.user_properties.table.json +34 -34
  55. package/module/settings/table/admin.user_roles.table.json +72 -72
  56. package/module/settings/table/admin.users.table.json +121 -121
  57. package/package.json +82 -82
  58. package/plugin.js +29 -27
  59. package/server/helpers/controllers/badge.js +11 -11
  60. package/server/helpers/controllers/hb.js +2 -2
  61. package/server/helpers/controllers/map.js +2 -2
  62. package/server/helpers/controllers/mls.js +2 -2
  63. package/server/helpers/controllers/token.js +15 -15
  64. package/server/helpers/controllers/vue.js +2 -2
  65. package/server/helpers/index.mjs +17 -17
  66. package/server/plugins/access/funcs/getAdminAccess.js +15 -0
  67. package/server/plugins/access/index.mjs +6 -0
  68. package/server/plugins/adminHook.js +93 -93
  69. package/server/plugins/cron.js +10 -10
  70. package/server/plugins/docs.js +28 -28
  71. package/server/plugins/hook.js +223 -223
  72. package/server/plugins/vite.js +71 -71
  73. package/server/routes/access/controllers/access.group.js +33 -0
  74. package/server/routes/access/controllers/access.group.post.js +44 -0
  75. package/server/routes/access/index.mjs +63 -0
  76. package/server/routes/calendar/controllers/calendar.data.js +87 -87
  77. package/server/routes/calendar/index.mjs +7 -7
  78. package/server/routes/calendar/schema.js +21 -21
  79. package/server/routes/data/controllers/cardData.js +81 -94
  80. package/server/routes/data/controllers/cardTabData.js +49 -49
  81. package/server/routes/data/controllers/funcs/getFilterSQL/index.js +92 -92
  82. package/server/routes/data/controllers/funcs/getFilterSQL/util/formatValue.js +170 -170
  83. package/server/routes/data/controllers/funcs/getFilterSQL/util/getCustomQuery.js +13 -13
  84. package/server/routes/data/controllers/funcs/getFilterSQL/util/getFilterQuery.js +64 -64
  85. package/server/routes/data/controllers/funcs/getFilterSQL/util/getOptimizedQuery.js +12 -12
  86. package/server/routes/data/controllers/funcs/getFilterSQL/util/getTableSql.js +34 -34
  87. package/server/routes/data/controllers/tableData.js +20 -14
  88. package/server/routes/data/controllers/tableDataId.js +27 -27
  89. package/server/routes/data/controllers/tableFilter.js +63 -63
  90. package/server/routes/data/controllers/tokenInfo.js +10 -0
  91. package/server/routes/data/controllers/utils/assignTokens.js +30 -30
  92. package/server/routes/data/controllers/utils/getColumns.js +8 -8
  93. package/server/routes/data/index.mjs +17 -15
  94. package/server/routes/data/schema.js +54 -54
  95. package/server/routes/menu/controllers/getMenu.js +67 -67
  96. package/server/routes/menu/index.mjs +5 -5
  97. package/server/routes/notifications/controllers/readNotifications.js +27 -27
  98. package/server/routes/notifications/controllers/testEmail.js +35 -35
  99. package/server/routes/notifications/controllers/userNotifications.js +53 -53
  100. package/server/routes/notifications/funcs/addNotification.js +21 -21
  101. package/server/routes/notifications/funcs/sendNotification.js +105 -105
  102. package/server/routes/notifications/hook/onWidgetSet.js +57 -57
  103. package/server/routes/notifications/index.mjs +27 -27
  104. package/server/routes/notifications/schema.js +16 -16
  105. package/server/routes/properties/controllers/admin.properties.get.js +29 -29
  106. package/server/routes/properties/controllers/user.properties.get.js +30 -30
  107. package/server/routes/properties/controllers/user.properties.post.js +30 -30
  108. package/server/routes/properties/funcs/getSettings.js +56 -56
  109. package/server/routes/properties/funcs/setSettings.js +44 -44
  110. package/server/routes/properties/funcs/utils/dataInsert.js +26 -26
  111. package/server/routes/properties/index.mjs +14 -14
  112. package/server/routes/properties/schema.js +10 -10
  113. package/server/routes/root.mjs +3 -3
  114. package/server/routes/templates/controllers/getTemplate.js +26 -22
  115. package/server/routes/templates/index.mjs +16 -16
  116. package/server/routes/templates/schema.js +8 -8
  117. package/server/routes/user/controllers/user.cls.id.js +14 -14
  118. package/server/routes/user/controllers/user.cls.js +71 -71
  119. package/server/routes/user/controllers/user.cls.post.js +52 -52
  120. package/server/routes/user/controllers/user.info.js +17 -17
  121. package/server/routes/user/schema.js +14 -14
  122. package/server/routes/widget/controllers/utils/historyFormat.js +75 -75
  123. package/server/routes/widget/controllers/utils/obj2db.js +13 -13
  124. package/server/routes/widget/controllers/widget.del.js +41 -41
  125. package/server/routes/widget/controllers/widget.get.js +96 -96
  126. package/server/routes/widget/controllers/widget.set.js +76 -76
  127. package/server/routes/widget/index.mjs +11 -11
  128. package/server/routes/widget/schema.js +12 -12
  129. package/server/templates/cls/itree.recrzone_category.json +73 -73
  130. package/server/templates/cls/test.json +9 -9
  131. package/server/templates/form/admin.user_cls.data.form.json +49 -49
  132. package/server/templates/form/admin.user_group_rel.form.json +21 -21
  133. package/server/templates/form/cp_building.form.json +32 -32
  134. package/server/templates/form/form-user-pass.json +10 -10
  135. package/server/templates/form/form-user_group.json +39 -39
  136. package/server/templates/form/form-users.json +156 -156
  137. package/server/templates/form/user_group_access.form.json +22 -22
  138. package/server/templates/select/account_id.json +2 -2
  139. package/server/templates/table/gis.dataset.table.json +43 -43
  140. package/server/templates/table/management.user_group.table.json +112 -112
  141. package/server/templates/table/management.users.table.json +126 -126
  142. package/utils.js +29 -26
  143. package/dist/card-page-DhYFr0FI.js +0 -280
@@ -1,280 +0,0 @@
1
- import { g as V, h as z, _ as A, u as L, a as q } from "./import-file-REG5YZVe.js";
2
- import { computed as B, resolveComponent as R, openBlock as r, createElementBlock as s, createElementVNode as d, toDisplayString as H, createVNode as N, withCtx as E, createTextVNode as S, createBlock as T, createCommentVNode as u, normalizeClass as D, Fragment as C, renderList as j, resolveDynamicComponent as i } from "vue";
3
- const G = { class: "h-[76px] bg-white border rounded-xl flex items-center justify-between px-[20px] mb-[16px]" }, O = { class: "text-lg font-semibold md:text-xl text-stone-800 dark:text-neutral-200" }, F = { class: "flex items-center gap-[6px]" }, I = {
4
- __name: "admin-card-header",
5
- props: {
6
- title: {
7
- type: String
8
- },
9
- getRoute: {
10
- type: String,
11
- required: !0
12
- }
13
- },
14
- setup(n) {
15
- const c = n, a = V(), l = z(), t = () => {
16
- a.back();
17
- }, p = B(
18
- () => {
19
- var x;
20
- return `/edit?table=${c.getRoute}&id=${(x = l == null ? void 0 : l.params) == null ? void 0 : x.id}`;
21
- }
22
- );
23
- return (x, g) => {
24
- const k = R("router-link");
25
- return r(), s("div", G, [
26
- d("div", null, [
27
- d("button", {
28
- onClick: t,
29
- class: "text-sm h-[20px] text-blue-600 font-medium hover:border-b-2 hover:border-b-blue-500"
30
- }, " До таблиці "),
31
- d("h2", O, H(n.title), 1)
32
- ]),
33
- d("div", F, [
34
- N(k, {
35
- to: p.value,
36
- class: "inline-flex items-center px-3 py-2 text-sm font-medium text-white duration-300 bg-blue-600 border border-transparent rounded-lg gap-x-2 hover:bg-blue-700 hover:text-white"
37
- }, {
38
- default: E(() => g[0] || (g[0] = [
39
- S(" Редагувати ")
40
- ])),
41
- _: 1
42
- }, 8, ["to"])
43
- ])
44
- ]);
45
- };
46
- }
47
- }, P = {
48
- components: { AdminCardHeader: I },
49
- data() {
50
- return {
51
- objectData: null,
52
- component: ""
53
- };
54
- },
55
- computed: {
56
- getRoute() {
57
- const n = this.flattenMenu(L.value);
58
- n != null && n.length || this.$router.replace("/404");
59
- const c = n == null ? void 0 : n.find((a) => {
60
- var l, t;
61
- return (a == null ? void 0 : a.table) == ((t = (l = this.$route) == null ? void 0 : l.params) == null ? void 0 : t.table);
62
- });
63
- return c || this.$router.replace("/404"), c == null ? void 0 : c.path;
64
- },
65
- getTitle() {
66
- var n, c, a, l, t, p, x, g, k, e, f, M, o, w, _;
67
- if ((a = (c = (n = this.objectData) == null ? void 0 : n.rows) == null ? void 0 : c[0]) != null && a.name)
68
- return ((x = (p = (t = (l = this.objectData) == null ? void 0 : l.rows) == null ? void 0 : t[0]) == null ? void 0 : p.name) == null ? void 0 : x.length) < 35 ? (e = (k = (g = this.objectData) == null ? void 0 : g.rows) == null ? void 0 : k[0]) == null ? void 0 : e.name : ((w = (o = (M = (f = this.objectData) == null ? void 0 : f.rows) == null ? void 0 : M[0]) == null ? void 0 : o.name) == null ? void 0 : w.slice(0, 35)) + " ...";
69
- {
70
- const h = (_ = this.flattenMenu(L.value)) == null ? void 0 : _.find(
71
- (b) => {
72
- var y, v;
73
- return (b == null ? void 0 : b.table) === ((v = (y = this.$route) == null ? void 0 : y.params) == null ? void 0 : v.table);
74
- }
75
- );
76
- return h == null ? void 0 : h.ua;
77
- }
78
- }
79
- },
80
- async mounted() {
81
- await this.getObjectData(), await this.checkActiveComponent();
82
- },
83
- watch: {
84
- component(n) {
85
- this.$router.replace({ ...this.$route, query: { tab: n } });
86
- }
87
- },
88
- methods: {
89
- async getObjectData() {
90
- var a;
91
- const { table: n, id: c } = (a = this.$route) == null ? void 0 : a.params;
92
- (!n || !c) && this.$router.replace("/404");
93
- try {
94
- const { data: l } = await q.get(`/api/table-data/${n}/${c}`);
95
- this.objectData = l;
96
- } catch (l) {
97
- console.error(l);
98
- }
99
- },
100
- getColClass(n) {
101
- return `col-span-${n || 12}`;
102
- },
103
- getGridClass() {
104
- return "grid-cols-12";
105
- },
106
- checkActiveComponent() {
107
- var n, c, a, l, t, p, x, g, k;
108
- if ((c = (n = this.$route) == null ? void 0 : n.query) != null && c.tab)
109
- this.component = (l = (a = this.$route) == null ? void 0 : a.query) == null ? void 0 : l.tab;
110
- else {
111
- const e = (p = (t = this.objectData) == null ? void 0 : t.panels) == null ? void 0 : p.find(
112
- (f) => (f == null ? void 0 : f.type) === "tabs" || (f == null ? void 0 : f.type) === "vertical-tabs"
113
- );
114
- (x = e == null ? void 0 : e.items) != null && x.length && (this.component = ((g = e.items[0]) == null ? void 0 : g.component) || ((k = e.items[0]) == null ? void 0 : k.name));
115
- }
116
- },
117
- flattenMenu(n) {
118
- const c = [];
119
- return n.forEach((a) => {
120
- a.menu ? c.push(...this.flattenMenu(a.menu)) : c.push(a);
121
- }), c;
122
- }
123
- }
124
- }, $ = {
125
- style: { width: "calc(100vw - 260px)", height: "calc(100vh - 60px)" },
126
- class: "p-4 overflow-y-auto bg-gray-50"
127
- }, J = {
128
- key: 0,
129
- class: "bg-white border rounded-xl"
130
- }, K = { class: "p-[10px] pl-[20px] text-md font-[500]" }, Q = ["innerHTML"], U = { key: 1 }, W = {
131
- key: 0,
132
- class: "p-[10px] pl-[20px] text-md font-[500]"
133
- }, X = {
134
- key: 2,
135
- class: "p-[20px] border-t"
136
- }, Y = ["innerHTML"], Z = { class: "flex space-x-1 w-full bg-white border border-b-0 rounded-tr-xl rounded-tl-xl h-[60px] items-center pl-[20px]" }, m = ["onClick"], oo = {
137
- key: 0,
138
- class: "bg-white border border-t-0 rounded-bl-xl rounded-br-xl"
139
- }, eo = {
140
- key: 0,
141
- class: "p-[20px] border-t"
142
- }, to = {
143
- key: 1,
144
- class: "p-[20px] border-t"
145
- }, ro = ["innerHTML"], no = {
146
- key: 3,
147
- class: "flex"
148
- }, so = { class: "flex flex-col space-y-2 w-[200px] border rounded-xl mr-4 h-auto items-start pl-[10px] bg-white py-[20px]" }, co = ["onClick"], ao = { class: "flex-grow" }, lo = {
149
- key: 0,
150
- class: "h-full bg-white border rounded-xl"
151
- }, uo = {
152
- key: 0,
153
- class: "p-[20px]"
154
- }, po = {
155
- key: 1,
156
- class: "p-[20px] border-t"
157
- }, ho = ["innerHTML"];
158
- function bo(n, c, a, l, t, p) {
159
- var g, k;
160
- const x = R("AdminCardHeader");
161
- return r(), s("div", $, [
162
- ((g = t.objectData) == null ? void 0 : g.isHeader) !== !1 ? (r(), T(x, {
163
- key: 0,
164
- title: p.getTitle,
165
- "get-route": p.getRoute
166
- }, null, 8, ["title", "get-route"])) : u("", !0),
167
- d("div", {
168
- class: D(["grid gap-[20px]", p.getGridClass()])
169
- }, [
170
- (r(!0), s(C, null, j((k = t.objectData) == null ? void 0 : k.panels, (e, f) => {
171
- var M;
172
- return r(), s("div", {
173
- key: f,
174
- class: D(p.getColClass(e.col))
175
- }, [
176
- e != null && e.name ? (r(), s("div", J, [
177
- d("h2", K, H((e == null ? void 0 : e.title) || "Панель"), 1),
178
- d("div", {
179
- class: "p-[20px] border-t",
180
- innerHTML: (M = t.objectData) == null ? void 0 : M.data[e == null ? void 0 : e.name]
181
- }, null, 8, Q)
182
- ])) : e.type === "container" ? (r(), s("div", U, [
183
- (r(!0), s(C, null, j(e.items, (o, w) => {
184
- var _, h, b, y, v;
185
- return r(), s("div", {
186
- key: w,
187
- class: D([{ "mb-[20px]": e.items.length > 1 }, "bg-white border rounded-xl"])
188
- }, [
189
- o != null && o.title ? (r(), s("h2", W, H((o == null ? void 0 : o.title) || "Панель"), 1)) : u("", !0),
190
- o != null && o.component ? (r(), s("div", {
191
- key: 1,
192
- class: D(["p-[20px]", { "border-t": o == null ? void 0 : o.title }])
193
- }, [
194
- (r(), T(i(o.component), {
195
- geometry: (h = (_ = t.objectData) == null ? void 0 : _.rows[0]) == null ? void 0 : h.geom,
196
- zoom: 16,
197
- id: (y = (b = n.$route) == null ? void 0 : b.params) == null ? void 0 : y.id
198
- }, null, 8, ["geometry", "id"]))
199
- ], 2)) : u("", !0),
200
- o != null && o.name ? (r(), s("div", X, [
201
- d("div", {
202
- innerHTML: (v = t.objectData) == null ? void 0 : v.data[o == null ? void 0 : o.name]
203
- }, null, 8, Y)
204
- ])) : u("", !0)
205
- ], 2);
206
- }), 128))
207
- ])) : u("", !0),
208
- (e == null ? void 0 : e.type) === "tabs" ? (r(), s(C, { key: 2 }, [
209
- d("nav", Z, [
210
- (r(!0), s(C, null, j(e == null ? void 0 : e.items, (o) => (r(), s("button", {
211
- key: (o == null ? void 0 : o.name) || (o == null ? void 0 : o.component),
212
- onClick: (w) => t.component = (o == null ? void 0 : o.component) || (o == null ? void 0 : o.name),
213
- class: D(["px-2.5 h-[30px] py-1.5 relative inline-flex items-center gap-x-2 text-gray-500 hover:bg-gray-100 focus:bg-gray-100 hover:text-gray-800 text-sm whitespace-nowrap rounded-lg focus:outline-none", {
214
- " font-semibold after:absolute after:bottom-[-14px] after:left-2.5 after:right-2.5 after:z-10 after:h-0.5 after:bg-gray-800": t.component === (o == null ? void 0 : o.component) || t.component === (o == null ? void 0 : o.name),
215
- "": t.component !== (o == null ? void 0 : o.component) && t.component !== (o == null ? void 0 : o.name)
216
- }])
217
- }, H(o == null ? void 0 : o.title), 11, m))), 128))
218
- ]),
219
- (r(!0), s(C, null, j(e.items, (o, w) => {
220
- var _, h, b, y, v;
221
- return r(), s(C, { key: w }, [
222
- t.component === (o == null ? void 0 : o.component) || t.component === (o == null ? void 0 : o.name) ? (r(), s("div", oo, [
223
- o != null && o.component ? (r(), s("div", eo, [
224
- (r(), T(i(o.component), {
225
- geometry: (h = (_ = t.objectData) == null ? void 0 : _.rows[0]) == null ? void 0 : h.geom,
226
- zoom: 16,
227
- id: (y = (b = n.$route) == null ? void 0 : b.params) == null ? void 0 : y.id
228
- }, null, 8, ["geometry", "id"]))
229
- ])) : u("", !0),
230
- o != null && o.name ? (r(), s("div", to, [
231
- d("div", {
232
- innerHTML: (v = t.objectData) == null ? void 0 : v.data[o == null ? void 0 : o.name]
233
- }, null, 8, ro)
234
- ])) : u("", !0)
235
- ])) : u("", !0)
236
- ], 64);
237
- }), 128))
238
- ], 64)) : u("", !0),
239
- (e == null ? void 0 : e.type) === "vertical-tabs" ? (r(), s("div", no, [
240
- d("nav", so, [
241
- (r(!0), s(C, null, j(e == null ? void 0 : e.items, (o) => (r(), s("button", {
242
- key: (o == null ? void 0 : o.name) || (o == null ? void 0 : o.component),
243
- onClick: (w) => t.component = (o == null ? void 0 : o.component) || (o == null ? void 0 : o.name),
244
- class: D(["relative inline-flex items-center w-full py-1 text-sm border-transparent pe-4 gap-x-2 border-e-2 whitespace-nowrap hover:text-blue-600 focus:outline-none focus:text-blue-600", {
245
- "font-semibold after:absolute after:top-[0] after:right-[-1px] after:h-full text-blue-600 after:w-[2px] after:bg-blue-600 ": t.component === (o == null ? void 0 : o.component) || t.component === (o == null ? void 0 : o.name),
246
- "text-gray-500": t.component !== (o == null ? void 0 : o.component) && t.component !== (o == null ? void 0 : o.name)
247
- }])
248
- }, H(o == null ? void 0 : o.title), 11, co))), 128))
249
- ]),
250
- d("div", ao, [
251
- (r(!0), s(C, null, j(e.items, (o, w) => {
252
- var _, h, b, y, v;
253
- return r(), s(C, { key: w }, [
254
- t.component === (o == null ? void 0 : o.component) || t.component === (o == null ? void 0 : o.name) ? (r(), s("div", lo, [
255
- o != null && o.component ? (r(), s("div", uo, [
256
- (r(), T(i(o.component), {
257
- geometry: (h = (_ = t.objectData) == null ? void 0 : _.rows[0]) == null ? void 0 : h.geom,
258
- zoom: 16,
259
- id: (y = (b = n.$route) == null ? void 0 : b.params) == null ? void 0 : y.id
260
- }, null, 8, ["geometry", "id"]))
261
- ])) : u("", !0),
262
- o != null && o.name ? (r(), s("div", po, [
263
- d("div", {
264
- innerHTML: (v = t.objectData) == null ? void 0 : v.data[o == null ? void 0 : o.name]
265
- }, null, 8, ho)
266
- ])) : u("", !0)
267
- ])) : u("", !0)
268
- ], 64);
269
- }), 128))
270
- ])
271
- ])) : u("", !0)
272
- ], 2);
273
- }), 128))
274
- ], 2)
275
- ]);
276
- }
277
- const fo = /* @__PURE__ */ A(P, [["render", bo], ["__scopeId", "data-v-7bc72f0a"]]);
278
- export {
279
- fo as default
280
- };