cedro 0.1.30 → 0.1.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -16,25 +16,24 @@
16
16
  "ui-library",
17
17
  "widget-based"
18
18
  ],
19
- "version": "0.1.30",
19
+ "version": "0.1.32",
20
20
  "type": "module",
21
21
  "devDependencies": {
22
- "@types/node": "^20.4.4",
23
- "typescript": "^5.0.2",
24
22
  "@fontsource/roboto": "^5.0.5",
25
23
  "@oothkoo/seo-js": "1.0.5",
26
24
  "@types/color": "3.0.3",
25
+ "@types/node": "^20.4.4",
27
26
  "@types/react": "18.2.17",
28
27
  "color": "4.2.3",
29
28
  "glob": "^11.0.0",
30
29
  "material-icons": "1.13.12",
31
30
  "navigo": "8.11.1",
32
- "vite": "^5.0.8"
31
+ "typescript": "^5.0.2",
32
+ "vite": "^7.3.1"
33
33
  },
34
34
  "scripts": {
35
35
  "working": "vite",
36
36
  "working-build": "tsc && vite build",
37
37
  "working-preview": "vite preview"
38
- },
39
- "dependencies": {}
38
+ }
40
39
  }
@@ -104,11 +104,13 @@ export function createApplication(content: any): Application {
104
104
  }
105
105
  });
106
106
 
107
- appConnections.forEach((cb) => {
108
- newApp.subscribe(cb);
109
- });
107
+ if (window.appConnections) {
108
+ window.appConnections.forEach((cb) => {
109
+ newApp.subscribe(cb);
110
+ });
111
+ }
110
112
 
111
- appConnections = [];
113
+ window.appConnections = [];
112
114
 
113
115
  return newApp;
114
116
  }
@@ -1,7 +1,7 @@
1
1
  export const getAdaptedUrl = (url: string) => {
2
2
  const timestamp = new Date().getTime();
3
3
  const isProduction = process.env.NODE_ENV === "production";
4
- const pathDev = ".." + url + "?ts=" + timestamp;
4
+ const pathDev = `../../../../src${url}index.js?ts=${timestamp}`;
5
5
  const pathProduction = `../../assets${url}/index.js?ts=${timestamp}`;
6
6
  return isProduction ? pathProduction : pathDev;
7
7
  };
@@ -8,14 +8,14 @@ import { normalizeWidget } from "./widget.normalize";
8
8
  export type IconVariants = "Filled" | "Outlined" | "Round" | "Sharp" | "Two Tone";
9
9
  export type IconSizes = "small" | "medium" | "large" | "xlarge";
10
10
 
11
- const iconSizesMap = {
11
+ export const iconSizesMap = {
12
12
  small: "md-18",
13
13
  medium: "md-24",
14
14
  large: "md-36",
15
15
  xlarge: "md-48",
16
16
  };
17
17
 
18
- const iconPixelSizesMap = {
18
+ export const iconPixelSizesMap = {
19
19
  small: "18px",
20
20
  medium: "24px",
21
21
  large: "36px",
@@ -42,6 +42,20 @@ export class Icon extends Widget {
42
42
 
43
43
  this.setIconSize("medium");
44
44
 
45
+ this.updateStyle();
46
+
47
+ this.setIcon(icon);
48
+
49
+ this.init();
50
+ }
51
+
52
+ private updateStyle(): void {
53
+ //Borramos las clases anteriores si las hay.
54
+ this.deleteClass("material-icons");
55
+ this.deleteClass(
56
+ "material-icons-" + this.variant.toString().replace(" ", "-").toLowerCase()
57
+ );
58
+ //Agregamos las clases del estilo actual.
45
59
  if (this.variant === "Filled") {
46
60
  this.addClass("material-icons");
47
61
  } else {
@@ -49,10 +63,6 @@ export class Icon extends Widget {
49
63
  "material-icons-" + this.variant.toString().replace(" ", "-").toLowerCase()
50
64
  );
51
65
  }
52
-
53
- this.setIcon(icon);
54
-
55
- this.init();
56
66
  }
57
67
 
58
68
  public init(): void {
@@ -77,6 +87,7 @@ export class Icon extends Widget {
77
87
 
78
88
  public setVariant(variant: IconVariants = "Filled"): void {
79
89
  this.variant = variant;
90
+ this.updateStyle();
80
91
  }
81
92
 
82
93
  public setColor(color: Colors = "primary"): void {
@@ -0,0 +1,203 @@
1
+ import "./styles/icon.css";
2
+
3
+ import { connectWidgetCallback, getOnlyEventProps, Widget } from "./widget.ui";
4
+ import { WidgetAlignTypes, WidgetProps, WidgetTypes } from "./widget.types";
5
+ import { Scroll } from "./scroll.ui";
6
+ import { createIconViewItem, IconViewItem } from "./IconViewItem.ui";
7
+ import { IconSizes, IconVariants } from "./Icon.ui";
8
+ import { Colors } from "./colors.ui";
9
+ import { UID } from "../core/uid";
10
+ import { normalizeWidget } from "./widget.normalize";
11
+
12
+ export class IconView extends Widget {
13
+ container: Widget;
14
+ verticalScrollbar: Scroll;
15
+ items: Array<IconViewItem> = [];
16
+ itemWidth: number = 100;
17
+ variant: IconVariants = "Outlined";
18
+ color: Colors = "primary";
19
+ size: IconSizes = "medium";
20
+
21
+ constructor(id: string, parent: Widget | null = null) {
22
+ super(id, "div", parent);
23
+
24
+ this.setType(WidgetTypes.FILL);
25
+ this.setAlign(WidgetAlignTypes.VERTICAL);
26
+
27
+ this.container = new Widget(id + ".container", "div");
28
+ this.container.setType(WidgetTypes.FILL);
29
+
30
+ this.verticalScrollbar = new Scroll(id + ".VerticalScrollbar", this.container);
31
+
32
+ this.items = [];
33
+
34
+ this.addChild(this.container);
35
+
36
+ this.init();
37
+ }
38
+
39
+ public addItem(item: IconViewItem): void {
40
+ item.setWH(this.itemWidth, this.itemWidth);
41
+ this.items.push(item);
42
+ this.container.addChild(item);
43
+ }
44
+
45
+ public init(): void {
46
+ super.init();
47
+ }
48
+
49
+ private renderIcons(): void {
50
+ let currentLeft = 0;
51
+ let currentTop = 0;
52
+ const margin = 10;
53
+ const itemWidth = this.itemWidth + margin * 2;
54
+
55
+ let itemsByRow = Math.floor(this.getW() / itemWidth);
56
+ if (itemsByRow == 0) {
57
+ itemsByRow = 1;
58
+ }
59
+ const rows = Math.ceil(this.items.length / itemsByRow);
60
+ const rowsHeight: Array<number> = Array(rows).fill(0);
61
+
62
+ //Reseteamos las dimensiones de los items antes de calcular su tamanio.
63
+ for (const item of this.items) {
64
+ item.setH(item.getW());
65
+ }
66
+
67
+ //Calculamos el tamanio de cada fila.
68
+ for (let i = 0; i < rows; i++) {
69
+ for (let x = 0; x < this.items.length; x++) {
70
+ const item = this.items[x];
71
+ const isItemInRow = i * itemsByRow <= x && x < (i + 1) * itemsByRow;
72
+ if (isItemInRow) {
73
+ if (item.text.getBody().scrollHeight + item.icon.getH() > rowsHeight[i]) {
74
+ rowsHeight[i] = item.text.getBody().scrollHeight + item.icon.getH();
75
+ }
76
+ }
77
+ }
78
+ }
79
+
80
+ //Aplicamos las dimensiones a los items.
81
+ for (let i = 0; i < rows; i++) {
82
+ for (let x = 0; x < this.items.length; x++) {
83
+ const item = this.items[x];
84
+ const isItemInRow = i * itemsByRow <= x && x < (i + 1) * itemsByRow;
85
+ if (isItemInRow) {
86
+ item.setX(currentLeft + margin);
87
+ item.setY(currentTop + margin);
88
+ item.setH(rowsHeight[i]);
89
+
90
+ item.text.setHCentered(true);
91
+
92
+ item.render();
93
+ currentLeft += itemWidth;
94
+ if (currentLeft + itemWidth > this.container.getW()) {
95
+ currentLeft = 0;
96
+ currentTop += rowsHeight[i] + margin * 2;
97
+ }
98
+ }
99
+ }
100
+ }
101
+ }
102
+
103
+ public render(): void {
104
+ super.render();
105
+ this.renderIcons();
106
+ this.verticalScrollbar.render();
107
+ }
108
+
109
+ public setItemWidth(itemWidth: number): void {
110
+ this.itemWidth = itemWidth;
111
+ }
112
+
113
+ public setVariant(variant: IconVariants): void {
114
+ this.variant = variant;
115
+ for (const icon of this.items) {
116
+ icon.setVariant(variant);
117
+ }
118
+ }
119
+
120
+ public setColor(color: Colors): void {
121
+ this.color = color;
122
+ for (const icon of this.items) {
123
+ icon.setColor(color);
124
+ }
125
+ }
126
+
127
+ public setSize(size: IconSizes): void {
128
+ this.size = size;
129
+ for (const icon of this.items) {
130
+ icon.setIconSize(size);
131
+ }
132
+ }
133
+ }
134
+
135
+ export type wIconViewProps = WidgetProps & {
136
+ id?: string | null;
137
+ variant?: IconVariants | null;
138
+ color?: Colors | null;
139
+ size?: IconSizes | null;
140
+ itemWidth?: number | null;
141
+ children?: any;
142
+ };
143
+
144
+ export const WIconView = (props: wIconViewProps) => {
145
+ if (!props.id) {
146
+ props.id = "IconView." + UID();
147
+ }
148
+
149
+ connectWidgetCallback(props.id, getOnlyEventProps(props));
150
+
151
+ return normalizeWidget(
152
+ <div
153
+ id={props.id}
154
+ w-icon-view
155
+ w-variant={props.variant}
156
+ w-color={props.color}
157
+ w-size={props.size}
158
+ w-item-width={props.itemWidth}
159
+ >
160
+ {props.children}
161
+ </div>,
162
+ props
163
+ );
164
+ };
165
+
166
+ export function createIconView(id: string, content: any, parent: Widget | null = null): IconView {
167
+ const dataVariant = content.getAttribute("w-variant") || "Filled";
168
+ const dataColor = content.getAttribute("w-color") || "primary";
169
+ const dataSize = content.getAttribute("w-size") || "medium";
170
+ const dataItemWidth = content.getAttribute("w-item-width") || 100;
171
+
172
+ let newIconView = new IconView(id, parent);
173
+
174
+ content.childNodes.forEach((iconItem: HTMLElement, index: number) => {
175
+ if (iconItem.getAttribute("w-icon-view-item") !== null) {
176
+ const itemId = iconItem.getAttribute("id") || "icon-view-item." + index;
177
+
178
+ const newItem = createIconViewItem(itemId, iconItem, null);
179
+
180
+ if (itemId !== null) {
181
+ newIconView.addItem(newItem);
182
+ }
183
+ }
184
+ });
185
+
186
+ if (dataVariant) {
187
+ newIconView.setVariant(dataVariant);
188
+ }
189
+
190
+ if (dataColor) {
191
+ newIconView.setColor(dataColor);
192
+ }
193
+
194
+ if (dataSize) {
195
+ newIconView.setSize(dataSize);
196
+ }
197
+
198
+ if (dataItemWidth) {
199
+ newIconView.setItemWidth(parseInt(dataItemWidth));
200
+ }
201
+
202
+ return newIconView;
203
+ }
@@ -0,0 +1,169 @@
1
+ import "./styles/iconviewitem.css";
2
+ import { Colors } from "./colors.ui";
3
+ import { addNewWidget } from "./widget.collection";
4
+ import { connectWidgetCallback, getOnlyEventProps, Widget } from "./widget.ui";
5
+ import { UID } from "../core/uid";
6
+ import { WidgetAlignTypes, WidgetProps, WidgetTypes } from "./widget.types";
7
+ import { normalizeWidget } from "./widget.normalize";
8
+ import { Icon, iconPixelSizesMap, IconSizes, IconVariants } from "./Icon.ui";
9
+ import { Label } from "./label.ui";
10
+ import { Container } from "./container.ui";
11
+
12
+ export class IconViewItem extends Widget {
13
+ variant: IconVariants;
14
+ color: Colors | null = null;
15
+ iconSize: IconSizes = "medium";
16
+ container: Container;
17
+
18
+ icon: Icon;
19
+ text: Label;
20
+
21
+ constructor(
22
+ id: string,
23
+ icon: string,
24
+ text: string,
25
+ variant: IconVariants = "Filled",
26
+ parent: Widget | null = null
27
+ ) {
28
+ super(id, "span", parent);
29
+
30
+ this.variant = variant;
31
+ this.setType(WidgetTypes.CUSTOM);
32
+ this.setAlign(WidgetAlignTypes.VERTICAL);
33
+
34
+ this.container = new Container({ id: id + ".container", orientation: "vertical" });
35
+
36
+ this.icon = new Icon(this.id + ".icon", icon, variant, this.container);
37
+ this.icon.setIconSize(this.iconSize);
38
+
39
+ this.text = new Label(id + ".text", "h4", this.container);
40
+ this.text.setText(text);
41
+
42
+ this.container.addChild(this.icon);
43
+ this.container.addChild(this.text);
44
+
45
+ this.addClass("WUI-icon-view-item");
46
+
47
+ this.addChild(this.container);
48
+
49
+ this.init();
50
+ }
51
+
52
+ public render(): void {
53
+ super.render();
54
+ }
55
+
56
+ public setWH(w: number, h: number): void {
57
+ super.setWH(w, h);
58
+ }
59
+
60
+ public setW(w: number): void {
61
+ super.setWH(w, this.getH());
62
+ }
63
+
64
+ public setH(h: number): void {
65
+ super.setWH(this.getW(), h);
66
+
67
+ this.container.setH(h);
68
+ this.text.setH(h - this.icon.getH());
69
+ }
70
+
71
+ public init(): void {
72
+ super.init();
73
+ }
74
+
75
+ public setIconSize(size: IconSizes = "medium"): void {
76
+ this.icon.setIconSize(size);
77
+ }
78
+
79
+ public setIcon(icon: string): void {
80
+ this.icon.setIcon(icon);
81
+ }
82
+
83
+ public setVariant(variant: IconVariants = "Filled"): void {
84
+ this.variant = variant;
85
+ this.icon.setVariant(variant);
86
+ }
87
+
88
+ public setColor(color: Colors = "primary"): void {
89
+ this.icon.setColor(color);
90
+ }
91
+
92
+ public getVariant(): IconVariants {
93
+ return this.variant;
94
+ }
95
+
96
+ public getColor(): Colors {
97
+ return this.icon.getColor();
98
+ }
99
+
100
+ public getIcon(): string {
101
+ return this.icon.getIcon();
102
+ }
103
+
104
+ public getIconSize(): IconSizes {
105
+ return this.icon.getIconSize();
106
+ }
107
+
108
+ public getRequiredWidth(): number {
109
+ const sizeString = iconPixelSizesMap[this.iconSize];
110
+ const size = parseInt(sizeString.split("px")[0]);
111
+ return size;
112
+ }
113
+ }
114
+
115
+ export type wIconViewItemProps = WidgetProps & {
116
+ icon: string;
117
+ text: string;
118
+ variant?: IconVariants | null;
119
+ color?: Colors | null;
120
+ size?: IconSizes | null;
121
+ };
122
+
123
+ export const WIconViewItem = (props: wIconViewItemProps) => {
124
+ if (!props.id) {
125
+ props.id = "IconViewItem." + UID();
126
+ }
127
+
128
+ connectWidgetCallback(props.id, getOnlyEventProps(props));
129
+
130
+ return normalizeWidget(
131
+ <div
132
+ id={props.id}
133
+ w-icon-view-item
134
+ w-icon-name={props.icon}
135
+ w-icon-text={props.text}
136
+ w-variant={props.variant}
137
+ w-color={props.color}
138
+ w-size={props.size}
139
+ ></div>,
140
+ props
141
+ );
142
+ };
143
+
144
+ export function createIconViewItem(
145
+ id: string,
146
+ content: any,
147
+ parent: Widget | null = null
148
+ ): IconViewItem {
149
+ const dataIcon = content.getAttribute("w-icon-name");
150
+ const dataText = content.getAttribute("w-icon-text");
151
+ const dataVariant = content.getAttribute("w-variant") || "Filled";
152
+ const dataColor = content.getAttribute("w-color") || "primary";
153
+ const dataSize = content.getAttribute("w-size") || "medium";
154
+
155
+ let newIconViewItem = new IconViewItem(id, dataIcon, dataText, dataVariant, parent);
156
+
157
+ if (dataColor) {
158
+ newIconViewItem.setColor(dataColor);
159
+ }
160
+
161
+ if (dataSize) {
162
+ newIconViewItem.setIconSize(dataSize);
163
+ }
164
+
165
+ //Agregamos el widget para que puedan ser inicializados los eventos asociados
166
+ addNewWidget(id, newIconViewItem);
167
+
168
+ return newIconViewItem;
169
+ }
@@ -0,0 +1,29 @@
1
+ .WUI-icon-color-primary {
2
+ color: var(--palette-text-primary);
3
+ background-color: transparent;
4
+ }
5
+
6
+ .WUI-icon-color-secondary {
7
+ color: var(--palette-text-secondary);
8
+ background-color: transparent;
9
+ }
10
+
11
+ .WUI-icon-color-success {
12
+ color: var(--palette-success-text-main);
13
+ background-color: transparent;
14
+ }
15
+
16
+ .WUI-icon-color-error {
17
+ color: var(--palette-error-text-main);
18
+ background-color: transparent;
19
+ }
20
+
21
+ .WUI-icon-color-info {
22
+ color: var(--palette-info-text-main);
23
+ background-color: transparent;
24
+ }
25
+
26
+ .WUI-icon-color-warning {
27
+ color: var(--palette-warning-text-main);
28
+ background-color: transparent;
29
+ }
@@ -0,0 +1,4 @@
1
+ .WUI-icon-view-item {
2
+ text-align: center;
3
+ cursor: pointer;
4
+ }
@@ -27,6 +27,7 @@ import { createSelect } from "./select.ui";
27
27
  import { createDialog, Dialog } from "./dialog";
28
28
  import { createDataGrid, DataGrid } from "./datagrid.ui";
29
29
  import { WidgetAlignTypes, WidgetProps, WidgetTypes } from "./widget.types";
30
+ import { createIconView } from "./IconView.ui";
30
31
 
31
32
  export function createWidget(
32
33
  content: any,
@@ -115,6 +116,8 @@ export function createWidget(
115
116
  widget = createDialog(widgetProps.id, content, null);
116
117
  } else if (content.getAttribute("w-data-grid")) {
117
118
  widget = createDataGrid(widgetProps.id, content, parent);
119
+ } else if (content.getAttribute("w-icon-view")) {
120
+ widget = createIconView(widgetProps.id, content, parent);
118
121
  } else {
119
122
  widget = new Widget(widgetProps.id, content.tagName, parent);
120
123