@genexus/genexus-ide-ui 1.1.1 → 1.1.3

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.
Files changed (48) hide show
  1. package/dist/cjs/genexus-ide-ui.cjs.js +1 -1
  2. package/dist/cjs/gx-ide-file-item.cjs.entry.js +110 -0
  3. package/dist/cjs/gx-ide-file-item.cjs.entry.js.map +1 -0
  4. package/dist/cjs/gx-ide-file-uploader.cjs.entry.js +399 -0
  5. package/dist/cjs/gx-ide-file-uploader.cjs.entry.js.map +1 -0
  6. package/dist/cjs/loader.cjs.js +1 -1
  7. package/dist/collection/collection-manifest.json +2 -0
  8. package/dist/collection/components/file-uploader/file-item/file-item.css +97 -0
  9. package/dist/collection/components/file-uploader/file-item/file-item.js +246 -0
  10. package/dist/collection/components/file-uploader/file-item/file-item.js.map +1 -0
  11. package/dist/collection/components/file-uploader/file-uploader.css +678 -0
  12. package/dist/collection/components/file-uploader/file-uploader.js +750 -0
  13. package/dist/collection/components/file-uploader/file-uploader.js.map +1 -0
  14. package/dist/collection/components/file-uploader/gx-ide-assets/file-uploader/langs/file-uploader.lang.en.json +36 -0
  15. package/dist/collection/components/file-uploader/gx-ide-assets/file-uploader/langs/file-uploader.lang.ja.json +36 -0
  16. package/dist/collection/components/file-uploader/gx-ide-assets/file-uploader/langs/file-uploader.lang.zh.json +36 -0
  17. package/dist/collection/components/file-uploader/types.js +2 -0
  18. package/dist/collection/components/file-uploader/types.js.map +1 -0
  19. package/dist/collection/testing/locale.e2e.js +4 -1
  20. package/dist/collection/testing/locale.e2e.js.map +1 -1
  21. package/dist/components/file-item.js +130 -0
  22. package/dist/components/file-item.js.map +1 -0
  23. package/dist/components/gx-ide-file-item.d.ts +11 -0
  24. package/dist/components/gx-ide-file-item.js +8 -0
  25. package/dist/components/gx-ide-file-item.js.map +1 -0
  26. package/dist/components/gx-ide-file-uploader.d.ts +11 -0
  27. package/dist/components/gx-ide-file-uploader.js +438 -0
  28. package/dist/components/gx-ide-file-uploader.js.map +1 -0
  29. package/dist/esm/genexus-ide-ui.js +1 -1
  30. package/dist/esm/gx-ide-file-item.entry.js +106 -0
  31. package/dist/esm/gx-ide-file-item.entry.js.map +1 -0
  32. package/dist/esm/gx-ide-file-uploader.entry.js +395 -0
  33. package/dist/esm/gx-ide-file-uploader.entry.js.map +1 -0
  34. package/dist/esm/loader.js +1 -1
  35. package/dist/genexus-ide-ui/genexus-ide-ui.esm.js +1 -1
  36. package/dist/genexus-ide-ui/genexus-ide-ui.esm.js.map +1 -1
  37. package/dist/genexus-ide-ui/gx-ide-assets/file-uploader/langs/file-uploader.lang.en.json +36 -0
  38. package/dist/genexus-ide-ui/gx-ide-assets/file-uploader/langs/file-uploader.lang.ja.json +36 -0
  39. package/dist/genexus-ide-ui/gx-ide-assets/file-uploader/langs/file-uploader.lang.zh.json +36 -0
  40. package/dist/genexus-ide-ui/p-961cd6c2.entry.js +475 -0
  41. package/dist/genexus-ide-ui/p-961cd6c2.entry.js.map +1 -0
  42. package/dist/genexus-ide-ui/p-ef5dfd35.entry.js +157 -0
  43. package/dist/genexus-ide-ui/p-ef5dfd35.entry.js.map +1 -0
  44. package/dist/types/components/file-uploader/file-item/file-item.d.ts +31 -0
  45. package/dist/types/components/file-uploader/file-uploader.d.ts +51 -0
  46. package/dist/types/components/file-uploader/types.d.ts +31 -0
  47. package/dist/types/components.d.ts +247 -0
  48. package/package.json +1 -1
@@ -0,0 +1,157 @@
1
+ import { r as e, c as i, h as t } from "./p-25a9f1d7.js";
2
+
3
+ import { g as r } from "./p-6e4208d8.js";
4
+
5
+ import "./p-5ac47c69.js";
6
+
7
+ const s = ":host{display:block;inline-size:100%}.file-item{display:grid;grid-template-columns:auto 1fr auto;grid-template-rows:auto;gap:var(--mer-spacing--sm);align-items:center;border:var(--mer-border__width--sm) solid var(--mer-border__default);border-radius:var(--mer-border__radius--sm)}.file-item__icon{display:flex;align-items:center}.file-item__name{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;inline-size:100%;font-weight:var(--mer-font__weight--regular)}.file-item__name ch-edit{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;inline-size:100%;font-weight:var(--mer-font__weight--regular)}.file-item__name .label{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;inline-size:100%;font-weight:var(--mer-font__weight--regular)}.file-item__actions{display:flex;gap:var(--mer-spacing--xs)}.file-item__actions button:active,.file-item__actions button:focus,.file-item__actions button:hover{background-color:var(--mer-surface__hover)}.file-item__actions button:active{background-color:var(--mer-surface__pressed)}.file-item__progress-container{grid-column:1/-1;display:flex;flex-direction:column;gap:var(--mer-spacing--2xs);inline-size:100%;border:var(--mer-border__width--md) dashed var(--mer-border-color__dim);border-radius:var(--mer-border__radius--md);padding:var(--mer-spacing--sm)}.file-item__progress-header{display:flex;justify-content:space-between;align-items:center;gap:var(--mer-spacing--sm)}.file-item__uploading-text{font-style:italic;color:var(--mer-text__complementary);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;max-inline-size:calc(100% - var(--mer-spacing--2xl))}.file-item__progress-bar{inline-size:100%}.file-item__progress-bar progress{inline-size:100%;height:var(--mer-spacing--xs);border:none;border-radius:var(--mer-border__radius--sm);overflow:hidden}.file-item__progress-bar progress::-webkit-progress-bar{background-color:transparent}.file-item__progress-bar progress::-webkit-progress-value{background-color:var(--mer-accent__primary)}.file-item__progress-bar progress::-moz-progress-bar{background-color:var(--mer-accent__primary)}";
8
+
9
+ var o = undefined && undefined.__classPrivateFieldGet || function(e, i, t, r) {
10
+ if (t === "a" && !r) throw new TypeError("Private accessor was defined without a getter");
11
+ if (typeof i === "function" ? e !== i || !r : !i.has(e)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
12
+ return t === "m" ? r : t === "a" ? r.call(e) : r ? r.value : i.get(e);
13
+ };
14
+
15
+ var a, n, l, c, m;
16
+
17
+ const d = r({
18
+ category: "gemini-tools",
19
+ name: "file",
20
+ colorType: "primary"
21
+ });
22
+
23
+ const p = r({
24
+ category: "gemini-tools",
25
+ name: "edit",
26
+ colorType: "primary"
27
+ });
28
+
29
+ const h = r({
30
+ category: "gemini-tools",
31
+ name: "delete",
32
+ colorType: "primary"
33
+ });
34
+
35
+ const f = r({
36
+ category: "gemini-tools",
37
+ name: "close",
38
+ colorType: "primary"
39
+ });
40
+
41
+ const _ = [ "resets/box-sizing", "components/button", "components/icon", "components/edit", "utils/typography", "utils/spacing", "utils/form", "utils/layout", "utils/elevation" ];
42
+
43
+ const g = class {
44
+ constructor(t) {
45
+ e(this, t);
46
+ this.fileNameChange = i(this, "fileNameChange", 7);
47
+ this.fileDelete = i(this, "fileDelete", 7);
48
+ this.fileCancel = i(this, "fileCancel", 7);
49
+ a.set(this, (e => {
50
+ const i = e.detail;
51
+ if (i && i !== this.currentName) {
52
+ this.currentName = i;
53
+ this.fileNameChange.emit({
54
+ id: this.file.id,
55
+ name: i
56
+ });
57
+ }
58
+ }));
59
+ n.set(this, (() => {
60
+ this.isEditing = false;
61
+ }));
62
+ /** Handles file deletion */ l.set(this, (() => {
63
+ this.fileDelete.emit(this.file.id);
64
+ }));
65
+ /** Handles upload cancellation */ c.set(this, (e => {
66
+ e.preventDefault();
67
+ this.fileCancel.emit(this.file.id);
68
+ }));
69
+ /** Starts file name editing */ m.set(this, (() => {
70
+ if (this.editable) {
71
+ this.isEditing = true;
72
+ }
73
+ }));
74
+ this.file = undefined;
75
+ this.editable = false;
76
+ this.fileDeletedCallback = undefined;
77
+ this.fileDeletionErrorCallback = undefined;
78
+ this.isEditing = false;
79
+ this.currentName = undefined;
80
+ }
81
+ /** Updates current name when file prop changes */ handleFileChange(e) {
82
+ this.currentName = e.name;
83
+ }
84
+ componentWillLoad() {
85
+ this.currentName = this.file.name;
86
+ }
87
+ render() {
88
+ return t("div", {
89
+ class: "file-item"
90
+ }, t("ch-theme", {
91
+ model: _
92
+ }), t("div", {
93
+ class: "file-item__icon"
94
+ }, t("ch-image", {
95
+ src: d,
96
+ class: "icon-md"
97
+ })), t("div", {
98
+ class: "file-item__name"
99
+ }, this.isEditing ? t("ch-edit", {
100
+ value: this.currentName,
101
+ autoFocus: true,
102
+ onInput: o(this, a, "f"),
103
+ onBlur: o(this, n, "f"),
104
+ class: "input"
105
+ }) : t("label", {
106
+ class: "label"
107
+ }, this.currentName)), t("div", {
108
+ class: "file-item__actions"
109
+ }, !this.file.pending && this.editable && t("button", {
110
+ class: "button-tertiary button-icon-only",
111
+ type: "button",
112
+ onClick: o(this, m, "f")
113
+ }, t("ch-image", {
114
+ src: p,
115
+ class: "icon-md"
116
+ })), !this.file.pending && t("button", {
117
+ class: "button-tertiary button-icon-only",
118
+ type: "button",
119
+ onClick: o(this, l, "f"),
120
+ "aria-label": "Delete file"
121
+ }, t("ch-image", {
122
+ src: h,
123
+ class: "icon-md"
124
+ }))), this.file.pending && t("div", {
125
+ class: "file-item__progress-container"
126
+ }, t("div", {
127
+ class: "file-item__progress-header"
128
+ }, t("span", {
129
+ class: "file-item__uploading-text"
130
+ }, "Uploading ", this.currentName, "..."), t("button", {
131
+ class: "button-tertiary button-icon-only",
132
+ type: "button",
133
+ onClick: o(this, c, "f")
134
+ }, t("ch-image", {
135
+ src: f,
136
+ class: "icon-md"
137
+ }))), t("div", {
138
+ class: "file-item__progress-bar"
139
+ }, t("progress", {
140
+ class: "elevation-1",
141
+ value: this.file.progress,
142
+ max: "100"
143
+ }))));
144
+ }
145
+ static get watchers() {
146
+ return {
147
+ file: [ "handleFileChange" ]
148
+ };
149
+ }
150
+ };
151
+
152
+ a = new WeakMap, n = new WeakMap, l = new WeakMap, c = new WeakMap, m = new WeakMap;
153
+
154
+ g.style = s;
155
+
156
+ export { g as gx_ide_file_item };
157
+ //# sourceMappingURL=p-ef5dfd35.entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["fileItemCss","FILE_ICON","getIconPath","category","name","colorType","EDIT_ICON","DELETE_ICON","CANCEL_ICON","CSS_BUNDLES","FileItem","_FileItem_handleNameChange","set","this","event","newName","detail","currentName","fileNameChange","emit","id","file","_FileItem_handleBlur","isEditing","_FileItem_handleDelete","fileDelete","_FileItem_handleCancelClick","e","preventDefault","fileCancel","_FileItem_startEditing","editable","handleFileChange","newFile","componentWillLoad","render","h","class","model","src","value","autoFocus","onInput","__classPrivateFieldGet","onBlur","pending","type","onClick","progress","max"],"sources":["src/components/file-uploader/file-item/file-item.scss?tag=gx-ide-file-item&encapsulation=shadow","src/components/file-uploader/file-item/file-item.tsx"],"sourcesContent":["@import \"../../../global/gx-ide-mixins.scss\";\n\n:host {\n display: block;\n inline-size: 100%;\n}\n\n.file-item {\n display: grid;\n grid-template-columns: auto 1fr auto;\n grid-template-rows: auto;\n gap: var(--mer-spacing--sm);\n align-items: center;\n border: var(--mer-border__width--sm) solid var(--mer-border__default);\n border-radius: var(--mer-border__radius--sm);\n\n &__icon {\n display: flex;\n align-items: center;\n }\n\n &__name {\n @include ellipsis;\n inline-size: 100%;\n font-weight: var(--mer-font__weight--regular);\n\n ch-edit {\n @include ellipsis;\n inline-size: 100%;\n font-weight: var(--mer-font__weight--regular);\n }\n\n .label {\n @include ellipsis;\n inline-size: 100%;\n font-weight: var(--mer-font__weight--regular);\n }\n }\n\n &__actions {\n display: flex;\n gap: var(--mer-spacing--xs);\n\n button {\n &:active,\n &:focus,\n &:hover {\n background-color: var(--mer-surface__hover);\n }\n\n &:active {\n background-color: var(--mer-surface__pressed);\n }\n }\n }\n\n &__progress-container {\n grid-column: 1 / -1;\n display: flex;\n flex-direction: column;\n gap: var(--mer-spacing--2xs);\n inline-size: 100%;\n border: var(--mer-border__width--md) dashed var(--mer-border-color__dim);\n border-radius: var(--mer-border__radius--md);\n padding: var(--mer-spacing--sm);\n }\n\n &__progress-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: var(--mer-spacing--sm);\n }\n\n &__uploading-text {\n font-style: italic;\n color: var(--mer-text__complementary);\n @include ellipsis;\n max-inline-size: calc(100% - var(--mer-spacing--2xl));\n }\n\n &__progress-bar {\n inline-size: 100%;\n\n progress {\n inline-size: 100%;\n height: var(--mer-spacing--xs);\n border: none;\n border-radius: var(--mer-border__radius--sm);\n overflow: hidden;\n\n &::-webkit-progress-bar {\n background-color: transparent;\n }\n\n &::-webkit-progress-value {\n background-color: var(--mer-accent__primary);\n }\n\n &::-moz-progress-bar {\n background-color: var(--mer-accent__primary);\n }\n }\n }\n}\n","import {\n Component,\n h,\n Prop,\n State,\n Event,\n EventEmitter,\n Watch\n} from \"@stencil/core\";\nimport { getIconPath, MercuryBundles } from \"@genexus/mercury\";\nimport { ChEditCustomEvent } from \"@genexus/chameleon-controls-library\";\nimport { FileUploadState } from \"../types\";\n\nconst FILE_ICON = getIconPath({\n category: \"gemini-tools\",\n name: \"file\",\n colorType: \"primary\"\n});\n\nconst EDIT_ICON = getIconPath({\n category: \"gemini-tools\",\n name: \"edit\",\n colorType: \"primary\"\n});\n\nconst DELETE_ICON = getIconPath({\n category: \"gemini-tools\",\n name: \"delete\",\n colorType: \"primary\"\n});\n\nconst CANCEL_ICON = getIconPath({\n category: \"gemini-tools\",\n name: \"close\",\n colorType: \"primary\"\n});\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"components/button\",\n \"components/icon\",\n \"components/edit\",\n \"utils/typography\",\n \"utils/spacing\",\n \"utils/form\",\n \"utils/layout\",\n \"utils/elevation\"\n];\n\n@Component({\n tag: \"gx-ide-file-item\",\n styleUrl: \"file-item.scss\",\n shadow: true\n})\nexport class FileItem {\n /** File state containing upload information */\n @Prop() readonly file!: FileUploadState;\n\n /** Whether the file name can be edited */\n @Prop() readonly editable: boolean = false;\n\n /** Callback when a file is deleted */\n @Prop() readonly fileDeletedCallback?: (fileId: string) => Promise<void>;\n\n /** Callback when a file deletion error occurs */\n @Prop() readonly fileDeletionErrorCallback?: (data: {\n fileName: string;\n error: string;\n }) => Promise<void>;\n\n /** Updates current name when file prop changes */\n @Watch(\"file\")\n handleFileChange(newFile: FileUploadState) {\n this.currentName = newFile.name;\n }\n\n @State() isEditing: boolean = false;\n @State() currentName: string;\n\n /** Emitted when the file name is changed */\n @Event() fileNameChange: EventEmitter<{ id: string; name: string }>;\n\n /** Emitted when the file is deleted */\n @Event() fileDelete: EventEmitter<string>;\n\n /** Emitted when the file upload is cancelled */\n @Event() fileCancel: EventEmitter<string>;\n\n componentWillLoad() {\n this.currentName = this.file.name;\n }\n\n #handleNameChange = (event: ChEditCustomEvent<string> | InputEvent) => {\n const newName = (event as CustomEvent<string>).detail;\n\n if (newName && newName !== this.currentName) {\n this.currentName = newName;\n this.fileNameChange.emit({\n id: this.file.id,\n name: newName\n });\n }\n };\n\n #handleBlur = () => {\n this.isEditing = false;\n };\n\n /** Handles file deletion */\n #handleDelete = () => {\n this.fileDelete.emit(this.file.id);\n };\n\n /** Handles upload cancellation */\n #handleCancelClick = (e: MouseEvent) => {\n e.preventDefault();\n this.fileCancel.emit(this.file.id);\n };\n\n /** Starts file name editing */\n #startEditing = () => {\n if (this.editable) {\n this.isEditing = true;\n }\n };\n\n render() {\n return (\n <div class=\"file-item\">\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <div class=\"file-item__icon\">\n <ch-image src={FILE_ICON} class=\"icon-md\" />\n </div>\n\n <div class=\"file-item__name\">\n {this.isEditing ? (\n <ch-edit\n value={this.currentName}\n autoFocus={true}\n onInput={this.#handleNameChange}\n onBlur={this.#handleBlur}\n class=\"input\"\n />\n ) : (\n <label class=\"label\">{this.currentName}</label>\n )}\n </div>\n\n <div class=\"file-item__actions\">\n {!this.file.pending && this.editable && (\n <button\n class=\"button-tertiary button-icon-only\"\n type=\"button\"\n onClick={this.#startEditing}\n >\n <ch-image src={EDIT_ICON} class=\"icon-md\" />\n </button>\n )}\n {!this.file.pending && (\n <button\n class=\"button-tertiary button-icon-only\"\n type=\"button\"\n onClick={this.#handleDelete}\n aria-label=\"Delete file\"\n >\n <ch-image src={DELETE_ICON} class=\"icon-md\" />\n </button>\n )}\n </div>\n\n {this.file.pending && (\n <div class=\"file-item__progress-container\">\n <div class=\"file-item__progress-header\">\n <span class=\"file-item__uploading-text\">\n Uploading {this.currentName}...\n </span>\n <button\n class=\"button-tertiary button-icon-only\"\n type=\"button\"\n onClick={this.#handleCancelClick}\n >\n <ch-image src={CANCEL_ICON} class=\"icon-md\" />\n </button>\n </div>\n <div class=\"file-item__progress-bar\">\n <progress\n class=\"elevation-1\"\n value={this.file.progress}\n max=\"100\"\n />\n </div>\n </div>\n )}\n </div>\n );\n }\n}\n"],"mappings":";;;;;;AAAA,MAAMA,IAAc;;;;;;;;;;ACapB,MAAMC,IAAYC,EAAY;EAC5BC,UAAU;EACVC,MAAM;EACNC,WAAW;;;AAGb,MAAMC,IAAYJ,EAAY;EAC5BC,UAAU;EACVC,MAAM;EACNC,WAAW;;;AAGb,MAAME,IAAcL,EAAY;EAC9BC,UAAU;EACVC,MAAM;EACNC,WAAW;;;AAGb,MAAMG,IAAcN,EAAY;EAC9BC,UAAU;EACVC,MAAM;EACNC,WAAW;;;AAGb,MAAMI,IAA8B,EAClC,qBACA,qBACA,mBACA,mBACA,oBACA,iBACA,cACA,gBACA;;MAQWC,IAAQ;;;;;;IAsCnBC,EAAAC,IAAAC,OAAqBC;MACnB,MAAMC,IAAWD,EAA8BE;MAE/C,IAAID,KAAWA,MAAYF,KAAKI,aAAa;QAC3CJ,KAAKI,cAAcF;QACnBF,KAAKK,eAAeC,KAAK;UACvBC,IAAIP,KAAKQ,KAAKD;UACdhB,MAAMW;;;;IAKZO,EAAAV,IAAAC,OAAc;MACZA,KAAKU,YAAY;AAAK;oCAIxBC,EAAAZ,IAAAC,OAAgB;MACdA,KAAKY,WAAWN,KAAKN,KAAKQ,KAAKD;AAAG;0CAIpCM,EAAAd,IAAAC,OAAsBc;MACpBA,EAAEC;MACFf,KAAKgB,WAAWV,KAAKN,KAAKQ,KAAKD;AAAG;uCAIpCU,EAAAlB,IAAAC,OAAgB;MACd,IAAIA,KAAKkB,UAAU;QACjBlB,KAAKU,YAAY;;;;oBA/DgB;;;qBAiBP;;;sDAJ9B,gBAAAS,CAAiBC;IACfpB,KAAKI,cAAcgB,EAAQ7B;;EAe7B,iBAAA8B;IACErB,KAAKI,cAAcJ,KAAKQ,KAAKjB;;EAqC/B,MAAA+B;IACE,OACEC,EAAA;MAAKC,OAAM;OACTD,EAAA;MAAUE,OAAO7B;QACjB2B,EAAA;MAAKC,OAAM;OACTD,EAAA;MAAUG,KAAKtC;MAAWoC,OAAM;SAGlCD,EAAA;MAAKC,OAAM;OACRxB,KAAKU,YACJa,EAAA;MACEI,OAAO3B,KAAKI;MACZwB,WAAW;MACXC,SAASC,EAAA9B,MAAIF,GAAA;MACbiC,QAAQD,EAAA9B,MAAIS,GAAA;MACZe,OAAM;SAGRD,EAAA;MAAOC,OAAM;OAASxB,KAAKI,eAI/BmB,EAAA;MAAKC,OAAM;QACPxB,KAAKQ,KAAKwB,WAAWhC,KAAKkB,YAC1BK,EAAA;MACEC,OAAM;MACNS,MAAK;MACLC,SAASJ,EAAA9B,MAAIiB,GAAA;OAEbM,EAAA;MAAUG,KAAKjC;MAAW+B,OAAM;UAGlCxB,KAAKQ,KAAKwB,WACVT,EAAA;MACEC,OAAM;MACNS,MAAK;MACLC,SAASJ,EAAA9B,MAAIW,GAAA;MAAc,cAChB;OAEXY,EAAA;MAAUG,KAAKhC;MAAa8B,OAAM;UAKvCxB,KAAKQ,KAAKwB,WACTT,EAAA;MAAKC,OAAM;OACTD,EAAA;MAAKC,OAAM;OACTD,EAAA;MAAMC,OAAM;OAA2B,cAC1BxB,KAAKI,aAAW,QAE7BmB,EAAA;MACEC,OAAM;MACNS,MAAK;MACLC,SAASJ,EAAA9B,MAAIa,GAAA;OAEbU,EAAA;MAAUG,KAAK/B;MAAa6B,OAAM;UAGtCD,EAAA;MAAKC,OAAM;OACTD,EAAA;MACEC,OAAM;MACNG,OAAO3B,KAAKQ,KAAK2B;MACjBC,KAAI"}
@@ -0,0 +1,31 @@
1
+ import { EventEmitter } from "../../../stencil-public-runtime";
2
+ import { FileUploadState } from "../types";
3
+ export declare class FileItem {
4
+ #private;
5
+ /** File state containing upload information */
6
+ readonly file: FileUploadState;
7
+ /** Whether the file name can be edited */
8
+ readonly editable: boolean;
9
+ /** Callback when a file is deleted */
10
+ readonly fileDeletedCallback?: (fileId: string) => Promise<void>;
11
+ /** Callback when a file deletion error occurs */
12
+ readonly fileDeletionErrorCallback?: (data: {
13
+ fileName: string;
14
+ error: string;
15
+ }) => Promise<void>;
16
+ /** Updates current name when file prop changes */
17
+ handleFileChange(newFile: FileUploadState): void;
18
+ isEditing: boolean;
19
+ currentName: string;
20
+ /** Emitted when the file name is changed */
21
+ fileNameChange: EventEmitter<{
22
+ id: string;
23
+ name: string;
24
+ }>;
25
+ /** Emitted when the file is deleted */
26
+ fileDelete: EventEmitter<string>;
27
+ /** Emitted when the file upload is cancelled */
28
+ fileCancel: EventEmitter<string>;
29
+ componentWillLoad(): void;
30
+ render(): any;
31
+ }
@@ -0,0 +1,51 @@
1
+ import { UploadedFile, UploadResult } from "./types";
2
+ export declare class FileUploader {
3
+ #private;
4
+ el: HTMLGxIdeFileUploaderElement;
5
+ /** Allowed file types/extensions (e.g. ['.jpg', '.png', 'image/*', 'application/pdf']) */
6
+ readonly types?: string[];
7
+ /** Whether multiple files can be selected */
8
+ readonly multiple: boolean;
9
+ /** Whether file names can be edited */
10
+ readonly canEditName: boolean;
11
+ /** Label to display in the uploader dialog */
12
+ readonly label?: string;
13
+ /** Function to handle file upload */
14
+ readonly uploadFunction: (file: File, progressCallback: (progress: number) => void) => Promise<UploadResult>;
15
+ /** Function to cancel file upload */
16
+ readonly cancelUploadFunction?: (fileId: string) => Promise<void>;
17
+ /** Callback when a file is uploaded successfully */
18
+ readonly fileUploadedCallback?: (file: UploadedFile) => Promise<void>;
19
+ /** Callback when the dialog is canceled */
20
+ readonly dialogCanceledCallback?: () => Promise<void>;
21
+ /** Callback when the dialog is confirmed with files */
22
+ readonly dialogConfirmedCallback?: (files: UploadedFile[]) => Promise<void>;
23
+ /** Callback when upload is cancelled */
24
+ readonly uploadCancelledCallback?: (fileId: string) => Promise<void>;
25
+ /** Callback when file is renamed */
26
+ readonly fileRenamedCallback?: (data: {
27
+ fileId: string;
28
+ newName: string;
29
+ }) => Promise<void>;
30
+ /** Callback when a file validation error occurs */
31
+ readonly fileValidationErrorCallback?: (data: {
32
+ fileName: string;
33
+ error: string;
34
+ }) => Promise<void>;
35
+ /** Callback when a file deletion error occurs */
36
+ readonly fileDeletionErrorCallback?: (data: {
37
+ fileName: string;
38
+ error: string;
39
+ }) => Promise<void>;
40
+ /** Callback when a file is deleted */
41
+ readonly fileDeletedCallback?: (file: UploadedFile) => Promise<void>;
42
+ /** Callback before deleting a file to get confirmation */
43
+ readonly onBeforeDelete?: (file: UploadedFile) => Promise<boolean>;
44
+ private fileStates;
45
+ private isDragging;
46
+ /** Initializes component with locale strings */
47
+ componentWillLoad(): Promise<void>;
48
+ /** Clears the current file selection */
49
+ clear(): Promise<void>;
50
+ render(): any;
51
+ }
@@ -0,0 +1,31 @@
1
+ export interface FileUploadState {
2
+ id: string;
3
+ name: string;
4
+ file: File;
5
+ pending: boolean;
6
+ progress: number;
7
+ remoteId?: string;
8
+ error?: string;
9
+ isEditing?: boolean;
10
+ uploadPromise?: any;
11
+ }
12
+ export interface UploadedFile {
13
+ name: string;
14
+ originalName: string;
15
+ remoteId: string;
16
+ }
17
+ export interface FileItemProps {
18
+ file: FileUploadState;
19
+ canEdit?: boolean;
20
+ onNameChange?: (id: string, newName: string) => void;
21
+ onDelete?: (id: string) => void;
22
+ onEdit?: (id: string) => void;
23
+ onCancelUpload?: (id: string) => void;
24
+ }
25
+ export type UploadResult = {
26
+ success: boolean;
27
+ remoteId?: string;
28
+ errors?: {
29
+ [key: string]: string;
30
+ };
31
+ };
@@ -35,6 +35,7 @@ import { CancelCallback as CancelCallback5, ConfirmCallback as ConfirmCallback4,
35
35
  import { DirectorySelectorLabels, LabelPosition } from "./components/_helpers/directory-selector/directory-selector";
36
36
  import { ModuleServerData, ModuleServerType } from "./components/modules/types";
37
37
  import { CancelCallback as CancelCallback6, ConfirmCallback as ConfirmCallback5, SelectSourceCallback } from "./components/modules/edit-module-server/edit-module-server";
38
+ import { FileUploadState, UploadedFile, UploadResult } from "./components/file-uploader/types";
38
39
  import { CancelCallback as CancelCallback7, GamConfigData, RepairCallback, SaveCallback } from "./components/gam-installation-settings/gam-installation-settings";
39
40
  import { AddObjectsCallback as AddObjectsCallback1, AddReferencesCallback, CancelCallback as CancelCallback8, ExportCallback as ExportCallback1, ExportFileDirectoryCallback, KBPropertiesCallback, KBPropertyType, OptionsCallback as OptionsCallback1 } from "./components/kb-manager-export/types";
40
41
  import { CancelCallback as CancelCallback9, ImportCallback, LoadCallback as LoadCallback1, ObjectContextMenuCallback, OptionsCallback as OptionsCallback2 } from "./components/kb-manager-import/kb-manager-import";
@@ -99,6 +100,7 @@ export { CancelCallback as CancelCallback5, ConfirmCallback as ConfirmCallback4,
99
100
  export { DirectorySelectorLabels, LabelPosition } from "./components/_helpers/directory-selector/directory-selector";
100
101
  export { ModuleServerData, ModuleServerType } from "./components/modules/types";
101
102
  export { CancelCallback as CancelCallback6, ConfirmCallback as ConfirmCallback5, SelectSourceCallback } from "./components/modules/edit-module-server/edit-module-server";
103
+ export { FileUploadState, UploadedFile, UploadResult } from "./components/file-uploader/types";
102
104
  export { CancelCallback as CancelCallback7, GamConfigData, RepairCallback, SaveCallback } from "./components/gam-installation-settings/gam-installation-settings";
103
105
  export { AddObjectsCallback as AddObjectsCallback1, AddReferencesCallback, CancelCallback as CancelCallback8, ExportCallback as ExportCallback1, ExportFileDirectoryCallback, KBPropertiesCallback, KBPropertyType, OptionsCallback as OptionsCallback1 } from "./components/kb-manager-export/types";
104
106
  export { CancelCallback as CancelCallback9, ImportCallback, LoadCallback as LoadCallback1, ObjectContextMenuCallback, OptionsCallback as OptionsCallback2 } from "./components/kb-manager-import/kb-manager-import";
@@ -1019,6 +1021,107 @@ export namespace Components {
1019
1021
  */
1020
1022
  "value": EntityData | null | undefined;
1021
1023
  }
1024
+ interface GxIdeFileItem {
1025
+ /**
1026
+ * Whether the file name can be edited
1027
+ */
1028
+ "editable": boolean;
1029
+ /**
1030
+ * File state containing upload information
1031
+ */
1032
+ "file": FileUploadState;
1033
+ /**
1034
+ * Callback when a file is deleted
1035
+ */
1036
+ "fileDeletedCallback"?: (fileId: string) => Promise<void>;
1037
+ /**
1038
+ * Callback when a file deletion error occurs
1039
+ */
1040
+ "fileDeletionErrorCallback"?: (data: {
1041
+ fileName: string;
1042
+ error: string;
1043
+ }) => Promise<void>;
1044
+ }
1045
+ interface GxIdeFileUploader {
1046
+ /**
1047
+ * Whether file names can be edited
1048
+ */
1049
+ "canEditName": boolean;
1050
+ /**
1051
+ * Function to cancel file upload
1052
+ */
1053
+ "cancelUploadFunction"?: (fileId: string) => Promise<void>;
1054
+ /**
1055
+ * Clears the current file selection
1056
+ */
1057
+ "clear": () => Promise<void>;
1058
+ /**
1059
+ * Callback when the dialog is canceled
1060
+ */
1061
+ "dialogCanceledCallback"?: () => Promise<void>;
1062
+ /**
1063
+ * Callback when the dialog is confirmed with files
1064
+ */
1065
+ "dialogConfirmedCallback"?: (
1066
+ files: UploadedFile[]
1067
+ ) => Promise<void>;
1068
+ /**
1069
+ * Callback when a file is deleted
1070
+ */
1071
+ "fileDeletedCallback"?: (file: UploadedFile) => Promise<void>;
1072
+ /**
1073
+ * Callback when a file deletion error occurs
1074
+ */
1075
+ "fileDeletionErrorCallback"?: (data: {
1076
+ fileName: string;
1077
+ error: string;
1078
+ }) => Promise<void>;
1079
+ /**
1080
+ * Callback when file is renamed
1081
+ */
1082
+ "fileRenamedCallback"?: (data: {
1083
+ fileId: string;
1084
+ newName: string;
1085
+ }) => Promise<void>;
1086
+ /**
1087
+ * Callback when a file is uploaded successfully
1088
+ */
1089
+ "fileUploadedCallback"?: (file: UploadedFile) => Promise<void>;
1090
+ /**
1091
+ * Callback when a file validation error occurs
1092
+ */
1093
+ "fileValidationErrorCallback"?: (data: {
1094
+ fileName: string;
1095
+ error: string;
1096
+ }) => Promise<void>;
1097
+ /**
1098
+ * Label to display in the uploader dialog
1099
+ */
1100
+ "label"?: string;
1101
+ /**
1102
+ * Whether multiple files can be selected
1103
+ */
1104
+ "multiple": boolean;
1105
+ /**
1106
+ * Callback before deleting a file to get confirmation
1107
+ */
1108
+ "onBeforeDelete"?: (file: UploadedFile) => Promise<boolean>;
1109
+ /**
1110
+ * Allowed file types/extensions (e.g. ['.jpg', '.png', 'image/*', 'application/pdf'])
1111
+ */
1112
+ "types"?: string[];
1113
+ /**
1114
+ * Callback when upload is cancelled
1115
+ */
1116
+ "uploadCancelledCallback"?: (fileId: string) => Promise<void>;
1117
+ /**
1118
+ * Function to handle file upload
1119
+ */
1120
+ "uploadFunction": (
1121
+ file: File,
1122
+ progressCallback: (progress: number) => void
1123
+ ) => Promise<UploadResult>;
1124
+ }
1022
1125
  interface GxIdeGamInstallationSettings {
1023
1126
  /**
1024
1127
  * Determines 'Panels' checkbox activation, enabled only if an SD generator is in the KB. Otherwise, the checkbox is disabled.
@@ -2428,6 +2531,10 @@ export interface GxIdeEntitySelectorCustomEvent<T> extends CustomEvent<T> {
2428
2531
  detail: T;
2429
2532
  target: HTMLGxIdeEntitySelectorElement;
2430
2533
  }
2534
+ export interface GxIdeFileItemCustomEvent<T> extends CustomEvent<T> {
2535
+ detail: T;
2536
+ target: HTMLGxIdeFileItemElement;
2537
+ }
2431
2538
  export interface GxIdeKbManagerImportCustomEvent<T> extends CustomEvent<T> {
2432
2539
  detail: T;
2433
2540
  target: HTMLGxIdeKbManagerImportElement;
@@ -2817,6 +2924,31 @@ declare global {
2817
2924
  prototype: HTMLGxIdeEntitySelectorElement;
2818
2925
  new (): HTMLGxIdeEntitySelectorElement;
2819
2926
  };
2927
+ interface HTMLGxIdeFileItemElementEventMap {
2928
+ "fileNameChange": { id: string; name: string };
2929
+ "fileDelete": string;
2930
+ "fileCancel": string;
2931
+ }
2932
+ interface HTMLGxIdeFileItemElement extends Components.GxIdeFileItem, HTMLStencilElement {
2933
+ addEventListener<K extends keyof HTMLGxIdeFileItemElementEventMap>(type: K, listener: (this: HTMLGxIdeFileItemElement, ev: GxIdeFileItemCustomEvent<HTMLGxIdeFileItemElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
2934
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
2935
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
2936
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
2937
+ removeEventListener<K extends keyof HTMLGxIdeFileItemElementEventMap>(type: K, listener: (this: HTMLGxIdeFileItemElement, ev: GxIdeFileItemCustomEvent<HTMLGxIdeFileItemElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
2938
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
2939
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
2940
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
2941
+ }
2942
+ var HTMLGxIdeFileItemElement: {
2943
+ prototype: HTMLGxIdeFileItemElement;
2944
+ new (): HTMLGxIdeFileItemElement;
2945
+ };
2946
+ interface HTMLGxIdeFileUploaderElement extends Components.GxIdeFileUploader, HTMLStencilElement {
2947
+ }
2948
+ var HTMLGxIdeFileUploaderElement: {
2949
+ prototype: HTMLGxIdeFileUploaderElement;
2950
+ new (): HTMLGxIdeFileUploaderElement;
2951
+ };
2820
2952
  interface HTMLGxIdeGamInstallationSettingsElement extends Components.GxIdeGamInstallationSettings, HTMLStencilElement {
2821
2953
  }
2822
2954
  var HTMLGxIdeGamInstallationSettingsElement: {
@@ -3320,6 +3452,8 @@ declare global {
3320
3452
  "gx-ide-edit-module-server": HTMLGxIdeEditModuleServerElement;
3321
3453
  "gx-ide-empty-state": HTMLGxIdeEmptyStateElement;
3322
3454
  "gx-ide-entity-selector": HTMLGxIdeEntitySelectorElement;
3455
+ "gx-ide-file-item": HTMLGxIdeFileItemElement;
3456
+ "gx-ide-file-uploader": HTMLGxIdeFileUploaderElement;
3323
3457
  "gx-ide-gam-installation-settings": HTMLGxIdeGamInstallationSettingsElement;
3324
3458
  "gx-ide-kb-manager-export": HTMLGxIdeKbManagerExportElement;
3325
3459
  "gx-ide-kb-manager-import": HTMLGxIdeKbManagerImportElement;
@@ -4285,6 +4419,115 @@ declare namespace LocalJSX {
4285
4419
  */
4286
4420
  "value"?: EntityData | null | undefined;
4287
4421
  }
4422
+ interface GxIdeFileItem {
4423
+ /**
4424
+ * Whether the file name can be edited
4425
+ */
4426
+ "editable"?: boolean;
4427
+ /**
4428
+ * File state containing upload information
4429
+ */
4430
+ "file": FileUploadState;
4431
+ /**
4432
+ * Callback when a file is deleted
4433
+ */
4434
+ "fileDeletedCallback"?: (fileId: string) => Promise<void>;
4435
+ /**
4436
+ * Callback when a file deletion error occurs
4437
+ */
4438
+ "fileDeletionErrorCallback"?: (data: {
4439
+ fileName: string;
4440
+ error: string;
4441
+ }) => Promise<void>;
4442
+ /**
4443
+ * Emitted when the file upload is cancelled
4444
+ */
4445
+ "onFileCancel"?: (event: GxIdeFileItemCustomEvent<string>) => void;
4446
+ /**
4447
+ * Emitted when the file is deleted
4448
+ */
4449
+ "onFileDelete"?: (event: GxIdeFileItemCustomEvent<string>) => void;
4450
+ /**
4451
+ * Emitted when the file name is changed
4452
+ */
4453
+ "onFileNameChange"?: (event: GxIdeFileItemCustomEvent<{ id: string; name: string }>) => void;
4454
+ }
4455
+ interface GxIdeFileUploader {
4456
+ /**
4457
+ * Whether file names can be edited
4458
+ */
4459
+ "canEditName"?: boolean;
4460
+ /**
4461
+ * Function to cancel file upload
4462
+ */
4463
+ "cancelUploadFunction"?: (fileId: string) => Promise<void>;
4464
+ /**
4465
+ * Callback when the dialog is canceled
4466
+ */
4467
+ "dialogCanceledCallback"?: () => Promise<void>;
4468
+ /**
4469
+ * Callback when the dialog is confirmed with files
4470
+ */
4471
+ "dialogConfirmedCallback"?: (
4472
+ files: UploadedFile[]
4473
+ ) => Promise<void>;
4474
+ /**
4475
+ * Callback when a file is deleted
4476
+ */
4477
+ "fileDeletedCallback"?: (file: UploadedFile) => Promise<void>;
4478
+ /**
4479
+ * Callback when a file deletion error occurs
4480
+ */
4481
+ "fileDeletionErrorCallback"?: (data: {
4482
+ fileName: string;
4483
+ error: string;
4484
+ }) => Promise<void>;
4485
+ /**
4486
+ * Callback when file is renamed
4487
+ */
4488
+ "fileRenamedCallback"?: (data: {
4489
+ fileId: string;
4490
+ newName: string;
4491
+ }) => Promise<void>;
4492
+ /**
4493
+ * Callback when a file is uploaded successfully
4494
+ */
4495
+ "fileUploadedCallback"?: (file: UploadedFile) => Promise<void>;
4496
+ /**
4497
+ * Callback when a file validation error occurs
4498
+ */
4499
+ "fileValidationErrorCallback"?: (data: {
4500
+ fileName: string;
4501
+ error: string;
4502
+ }) => Promise<void>;
4503
+ /**
4504
+ * Label to display in the uploader dialog
4505
+ */
4506
+ "label"?: string;
4507
+ /**
4508
+ * Whether multiple files can be selected
4509
+ */
4510
+ "multiple"?: boolean;
4511
+ /**
4512
+ * Callback before deleting a file to get confirmation
4513
+ */
4514
+ "onBeforeDelete"?: (file: UploadedFile) => Promise<boolean>;
4515
+ /**
4516
+ * Allowed file types/extensions (e.g. ['.jpg', '.png', 'image/*', 'application/pdf'])
4517
+ */
4518
+ "types"?: string[];
4519
+ /**
4520
+ * Callback when upload is cancelled
4521
+ */
4522
+ "uploadCancelledCallback"?: (fileId: string) => Promise<void>;
4523
+ /**
4524
+ * Function to handle file upload
4525
+ */
4526
+ "uploadFunction": (
4527
+ file: File,
4528
+ progressCallback: (progress: number) => void
4529
+ ) => Promise<UploadResult>;
4530
+ }
4288
4531
  interface GxIdeGamInstallationSettings {
4289
4532
  /**
4290
4533
  * Determines 'Panels' checkbox activation, enabled only if an SD generator is in the KB. Otherwise, the checkbox is disabled.
@@ -5697,6 +5940,8 @@ declare namespace LocalJSX {
5697
5940
  "gx-ide-edit-module-server": GxIdeEditModuleServer;
5698
5941
  "gx-ide-empty-state": GxIdeEmptyState;
5699
5942
  "gx-ide-entity-selector": GxIdeEntitySelector;
5943
+ "gx-ide-file-item": GxIdeFileItem;
5944
+ "gx-ide-file-uploader": GxIdeFileUploader;
5700
5945
  "gx-ide-gam-installation-settings": GxIdeGamInstallationSettings;
5701
5946
  "gx-ide-kb-manager-export": GxIdeKbManagerExport;
5702
5947
  "gx-ide-kb-manager-import": GxIdeKbManagerImport;
@@ -5771,6 +6016,8 @@ declare module "@stencil/core" {
5771
6016
  "gx-ide-edit-module-server": LocalJSX.GxIdeEditModuleServer & JSXBase.HTMLAttributes<HTMLGxIdeEditModuleServerElement>;
5772
6017
  "gx-ide-empty-state": LocalJSX.GxIdeEmptyState & JSXBase.HTMLAttributes<HTMLGxIdeEmptyStateElement>;
5773
6018
  "gx-ide-entity-selector": LocalJSX.GxIdeEntitySelector & JSXBase.HTMLAttributes<HTMLGxIdeEntitySelectorElement>;
6019
+ "gx-ide-file-item": LocalJSX.GxIdeFileItem & JSXBase.HTMLAttributes<HTMLGxIdeFileItemElement>;
6020
+ "gx-ide-file-uploader": LocalJSX.GxIdeFileUploader & JSXBase.HTMLAttributes<HTMLGxIdeFileUploaderElement>;
5774
6021
  "gx-ide-gam-installation-settings": LocalJSX.GxIdeGamInstallationSettings & JSXBase.HTMLAttributes<HTMLGxIdeGamInstallationSettingsElement>;
5775
6022
  "gx-ide-kb-manager-export": LocalJSX.GxIdeKbManagerExport & JSXBase.HTMLAttributes<HTMLGxIdeKbManagerExportElement>;
5776
6023
  "gx-ide-kb-manager-import": LocalJSX.GxIdeKbManagerImport & JSXBase.HTMLAttributes<HTMLGxIdeKbManagerImportElement>;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@genexus/genexus-ide-ui",
3
3
  "license": "Apache-2.0",
4
- "version": "1.1.1",
4
+ "version": "1.1.3",
5
5
  "description": "GeneXus IDE UI components",
6
6
  "main": "dist/index.cjs.js",
7
7
  "module": "dist/index.js",