lkt-item-crud 1.0.3 → 1.0.4

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.
@@ -1,16 +1,17 @@
1
- import { defineComponent as Q, useSlots as W, ref as u, computed as m, watch as B, resolveComponent as S, openBlock as r, createElementBlock as f, createElementVNode as V, toDisplayString as q, renderSlot as b, createCommentVNode as C, withDirectives as g, createVNode as I, withCtx as j, unref as O, vShow as D, createBlock as L } from "vue";
2
- import { httpCall as X } from "lkt-http-client";
3
- const Y = { class: "lkt-item-crud" }, Z = {
1
+ import { defineComponent as Y, useSlots as Z, ref as r, computed as p, watch as b, resolveComponent as g, openBlock as d, createElementBlock as m, createElementVNode as I, toDisplayString as N, renderSlot as C, createCommentVNode as D, withDirectives as _, createVNode as V, withCtx as x, unref as j, vShow as O, createBlock as q } from "vue";
2
+ import { httpCall as ee } from "lkt-http-client";
3
+ import { DataState as E } from "lkt-data-state";
4
+ const te = { class: "lkt-item-crud" }, ae = {
4
5
  key: 0,
5
6
  class: "lkt-item-crud_header"
6
- }, ee = { class: "lkt-item-crud_header-title" }, te = { class: "lkt-item-crud_header-slot" }, ae = { class: "lkt-item-crud-buttons" }, le = { key: 1 }, oe = { key: 1 }, ue = {
7
+ }, le = { class: "lkt-item-crud_header-title" }, ue = { class: "lkt-item-crud_header-slot" }, oe = { class: "lkt-item-crud-buttons" }, re = { key: 1 }, se = { key: 1 }, de = {
7
8
  key: 1,
8
9
  class: "lkt-item-crud_content"
9
- }, re = {
10
+ }, ne = {
10
11
  key: 0,
11
12
  class: "lkt-grid-1"
12
- }, se = { name: "LktItemCrud", inheritAttrs: !1 }, de = /* @__PURE__ */ Q({
13
- ...se,
13
+ }, ie = { name: "LktItemCrud", inheritAttrs: !1 }, ce = /* @__PURE__ */ Y({
14
+ ...ie,
14
15
  props: {
15
16
  modelValue: { type: Object, required: !1, default: () => ({}) },
16
17
  title: { type: String, default: "" },
@@ -33,141 +34,148 @@ const Y = { class: "lkt-item-crud" }, Z = {
33
34
  updateDisabled: { type: Boolean, default: !1 },
34
35
  dropDisabled: { type: Boolean, default: !1 }
35
36
  },
36
- emits: ["update:modelValue", "read", "create", "update", "drop", "perms", "error"],
37
- setup(o, { expose: w, emit: E }) {
38
- const e = o, _ = W(), s = E;
39
- let N = [];
40
- const a = u(!0), d = u(e.modelValue), R = u(N), i = u(!1), c = u(!1), v = u(!1), n = u(200), k = u(null), y = u(null), A = m(() => e.saveIsCreate ? e.createConfirm : e.updateConfirm), H = m(() => e.saveIsCreate ? e.createResource : e.updateResource), P = m(() => e.saveIsCreate ? e.createData : e.updateData), U = m(() => e.saveIsCreate ? e.createDisabled : e.updateDisabled), M = async () => (a.value = !0, n.value = -1, await X(e.readResource, e.readData).then((t) => {
41
- if (a.value = !1, !t.success) {
42
- c.value = !1, n.value = t.httpStatus, s("error", t.httpStatus);
37
+ emits: ["update:modelValue", "read", "create", "update", "drop", "perms", "error", "modified-data"],
38
+ setup(u, { expose: w, emit: A }) {
39
+ const t = u, R = Z(), s = A;
40
+ let H = [];
41
+ const a = r(!0), o = r(t.modelValue), B = r(H), i = r(!1), c = r(!1), v = r(!1), n = r(200), k = r(null), y = r(null), S = r(new E(JSON.parse(JSON.stringify(o.value)))), P = p(() => t.saveIsCreate ? t.createConfirm : t.updateConfirm), U = p(() => t.saveIsCreate ? t.createResource : t.updateResource), z = p(() => t.saveIsCreate ? t.createData : t.updateData), F = p(() => t.saveIsCreate ? t.createDisabled : t.updateDisabled), L = async () => (a.value = !0, n.value = -1, await ee(t.readResource, t.readData).then((e) => {
42
+ if (a.value = !1, !e.success) {
43
+ c.value = !1, n.value = e.httpStatus, s("error", e.httpStatus);
43
44
  return;
44
45
  }
45
- c.value = !0, d.value = t.data, R.value = t.perms, s("read", t);
46
- })), z = m(() => a.value ? !1 : e.title || !!_["post-title"]);
47
- B(() => e.modelValue, (t) => d.value = t), B(d, () => s("update:modelValue", d.value)), B(R, () => s("perms", R.value)), e.readResource && M();
48
- const F = (t, l) => {
46
+ c.value = !0, o.value = e.data, B.value = e.perms, S.value = new E(JSON.parse(JSON.stringify(o.value))), s("read", e);
47
+ })), G = p(() => a.value ? !1 : t.title || !!R["post-title"]);
48
+ b(() => t.modelValue, (e) => {
49
+ o.value = e, S.value.increment(JSON.parse(JSON.stringify(e)));
50
+ }, { deep: !0 }), b(o, (e) => {
51
+ s("update:modelValue", o.value), S.value.increment(JSON.parse(JSON.stringify(e)));
52
+ }, { deep: !0 }), b(B, () => s("perms", B.value));
53
+ const J = p(() => F.value ? !1 : S.value.changed());
54
+ b(J, (e) => s("modified-data", e)), t.readResource && L();
55
+ const K = (e, l) => {
49
56
  if (a.value = !1, n.value = l.httpStatus, !l.success) {
50
57
  v.value = !0, s("error", l.httpStatus);
51
58
  return;
52
59
  }
53
60
  v.value = !0, s("drop", l);
54
- }, G = (t, l) => {
61
+ }, Q = (e, l) => {
55
62
  if (a.value = !1, n.value = l.httpStatus, !l.success) {
56
63
  v.value = !0, s("error", l.httpStatus);
57
64
  return;
58
65
  }
59
66
  v.value = !0;
60
- let h = e.saveIsCreate ? "create" : "update";
67
+ let h = t.saveIsCreate ? "create" : "update";
61
68
  s(h, l);
62
- }, $ = () => {
69
+ }, M = () => {
63
70
  a.value = !0, n.value = -1;
64
- }, x = () => {
71
+ }, T = () => {
65
72
  a.value = !1;
66
73
  };
67
74
  return w({
68
75
  doDrop: () => {
69
76
  y.value && typeof y.value.click == "function" && y.value.click();
70
77
  },
71
- doRefresh: M,
78
+ doRefresh: L,
72
79
  doSave: () => {
73
80
  k.value && typeof k.value.click == "function" && k.value.click();
74
81
  }
75
- }), (t, l) => {
76
- const h = S("lkt-button"), J = S("lkt-field-switch"), T = S("lkt-http-info"), K = S("lkt-loader");
77
- return r(), f("article", Y, [
78
- z.value ? (r(), f("header", Z, [
79
- V("h1", ee, q(o.title), 1),
80
- V("div", te, [
81
- b(t.$slots, "post-title", {
82
- item: d.value,
82
+ }), (e, l) => {
83
+ const h = g("lkt-button"), W = g("lkt-field-switch"), $ = g("lkt-http-info"), X = g("lkt-loader");
84
+ return d(), m("article", te, [
85
+ G.value ? (d(), m("header", ae, [
86
+ I("h1", le, N(u.title), 1),
87
+ I("div", ue, [
88
+ C(e.$slots, "post-title", {
89
+ item: o.value,
83
90
  loading: a.value
84
91
  })
85
92
  ])
86
- ])) : C("", !0),
87
- g(V("div", ae, [
88
- g(I(h, {
89
- ref: (p) => y.value = p,
93
+ ])) : D("", !0),
94
+ _(I("div", oe, [
95
+ _(V(h, {
96
+ ref: (f) => y.value = f,
90
97
  palette: "danger",
91
- disabled: o.dropDisabled,
92
- "confirm-modal": o.dropConfirm,
93
- resource: o.dropResource,
94
- "resource-data": o.dropData,
95
- onLoading: $,
96
- onLoaded: x,
97
- onClick: F
98
+ disabled: u.dropDisabled,
99
+ "confirm-modal": u.dropConfirm,
100
+ resource: u.dropResource,
101
+ "resource-data": u.dropData,
102
+ onLoading: M,
103
+ onLoaded: T,
104
+ onClick: K
98
105
  }, {
99
- default: j(() => [
100
- O(_)["button-drop"] ? b(t.$slots, "button-drop", {
106
+ default: x(() => [
107
+ j(R)["button-drop"] ? C(e.$slots, "button-drop", {
101
108
  key: 0,
102
- item: d.value,
109
+ item: o.value,
103
110
  editMode: i.value
104
- }) : (r(), f("span", le, q(o.dropText), 1))
111
+ }) : (d(), m("span", re, N(u.dropText), 1))
105
112
  ]),
106
113
  _: 3
107
114
  }, 8, ["disabled", "confirm-modal", "resource", "resource-data"]), [
108
- [D, !a.value && i.value && c.value]
115
+ [O, !a.value && i.value && c.value]
109
116
  ]),
110
- g(I(h, {
111
- ref: (p) => k.value = p,
117
+ _(V(h, {
118
+ ref: (f) => k.value = f,
112
119
  palette: "success",
113
- disabled: U.value,
114
- "confirm-modal": A.value,
115
- resource: H.value,
116
- "resource-data": P.value,
117
- onLoading: $,
118
- onLoaded: x,
119
- onClick: G
120
+ disabled: !J.value,
121
+ "confirm-modal": P.value,
122
+ resource: U.value,
123
+ "resource-data": z.value,
124
+ onLoading: M,
125
+ onLoaded: T,
126
+ onClick: Q
120
127
  }, {
121
- default: j(() => [
122
- O(_)["button-save"] ? b(t.$slots, "button-save", {
128
+ default: x(() => [
129
+ j(R)["button-save"] ? C(e.$slots, "button-save", {
123
130
  key: 0,
124
- item: d.value,
131
+ item: o.value,
125
132
  editMode: i.value
126
- }) : (r(), f("span", oe, q(o.saveText), 1))
133
+ }) : (d(), m("span", se, N(u.saveText), 1))
127
134
  ]),
128
135
  _: 3
129
136
  }, 8, ["disabled", "confirm-modal", "resource", "resource-data"]), [
130
- [D, !a.value && i.value && c.value]
137
+ [O, !a.value && i.value && c.value]
131
138
  ]),
132
- g(I(J, {
139
+ _(V(W, {
133
140
  modelValue: i.value,
134
- "onUpdate:modelValue": l[0] || (l[0] = (p) => i.value = p),
135
- label: o.editModeText
141
+ "onUpdate:modelValue": l[0] || (l[0] = (f) => i.value = f),
142
+ label: u.editModeText
136
143
  }, null, 8, ["modelValue", "label"]), [
137
- [D, !a.value && c.value]
144
+ [O, !a.value && c.value]
138
145
  ])
139
146
  ], 512), [
140
- [D, c.value]
147
+ [O, c.value]
141
148
  ]),
142
- a.value ? C("", !0) : (r(), f("div", ue, [
143
- c.value ? (r(), f("div", re, [
144
- v.value ? (r(), L(T, {
149
+ a.value ? D("", !0) : (d(), m("div", de, [
150
+ c.value ? (d(), m("div", ne, [
151
+ v.value ? (d(), q($, {
145
152
  key: 0,
146
153
  code: n.value,
147
154
  quick: "",
148
155
  palette: n.value === 200 ? "success" : "danger",
149
156
  "can-close": "",
150
- onClose: l[1] || (l[1] = (p) => v.value = !1)
151
- }, null, 8, ["code", "palette"])) : C("", !0),
152
- b(t.$slots, "item", {
153
- item: d.value,
157
+ onClose: l[1] || (l[1] = (f) => v.value = !1)
158
+ }, null, 8, ["code", "palette"])) : D("", !0),
159
+ C(e.$slots, "item", {
160
+ item: o.value,
154
161
  loading: a.value,
155
162
  editMode: i.value
156
163
  })
157
- ])) : (r(), L(T, {
164
+ ])) : (d(), q($, {
158
165
  key: 1,
159
166
  code: n.value
160
167
  }, null, 8, ["code"]))
161
168
  ])),
162
- a.value ? (r(), L(K, { key: 2 })) : C("", !0)
169
+ a.value ? (d(), q(X, { key: 2 })) : D("", !0)
163
170
  ]);
164
171
  };
165
172
  }
166
- }), pe = {
167
- install: (o, w = {}) => {
168
- o.component("LktItemCrud", de);
173
+ });
174
+ const ye = {
175
+ install: (u, w = {}) => {
176
+ u.component("LktItemCrud", ce);
169
177
  }
170
178
  };
171
179
  export {
172
- pe as default
180
+ ye as default
173
181
  };
@@ -1 +1 @@
1
- (function(e,f){typeof exports=="object"&&typeof module<"u"?module.exports=f(require("vue"),require("lkt-http-client")):typeof define=="function"&&define.amd?define(["vue","lkt-http-client"],f):(e=typeof globalThis<"u"?globalThis:e||self,e.LktItemCrud=f(e.Vue,e.LktHttpClient))})(this,function(e,f){"use strict";const g={class:"lkt-item-crud"},_={key:0,class:"lkt-item-crud_header"},V={class:"lkt-item-crud_header-title"},w={class:"lkt-item-crud_header-slot"},L={class:"lkt-item-crud-buttons"},q={key:1},I={key:1},R={key:1,class:"lkt-item-crud_content"},E={key:0,class:"lkt-grid-1"},N={name:"LktItemCrud",inheritAttrs:!1},x=e.defineComponent({...N,props:{modelValue:{type:Object,required:!1,default:()=>({})},title:{type:String,default:""},editModeText:{type:String,default:"Edition Mode"},saveText:{type:String,default:"Save"},dropText:{type:String,default:"Delete"},readResource:{type:String,required:!0},createResource:{type:String,required:!1},updateResource:{type:String,required:!1},dropResource:{type:String,required:!1},readData:{type:Object,required:!1,default:()=>({})},createData:{type:Object,required:!1,default:()=>({})},updateData:{type:Object,required:!1,default:()=>({})},dropData:{type:Object,required:!1,default:()=>({})},saveIsCreate:{type:Boolean,default:!1},createConfirm:{type:String,default:""},updateConfirm:{type:String,default:""},dropConfirm:{type:String,default:""},createDisabled:{type:Boolean,default:!1},updateDisabled:{type:Boolean,default:!1},dropDisabled:{type:Boolean,default:!1}},emits:["update:modelValue","read","create","update","drop","perms","error"],setup(r,{expose:v,emit:M}){const t=r,y=e.useSlots(),s=M;let T=[];const o=e.ref(!0),d=e.ref(t.modelValue),S=e.ref(T),c=e.ref(!1),i=e.ref(!1),u=e.ref(!1),n=e.ref(200),m=e.ref(null),k=e.ref(null),$=e.computed(()=>t.saveIsCreate?t.createConfirm:t.updateConfirm),j=e.computed(()=>t.saveIsCreate?t.createResource:t.updateResource),O=e.computed(()=>t.saveIsCreate?t.createData:t.updateData),H=e.computed(()=>t.saveIsCreate?t.createDisabled:t.updateDisabled),C=async()=>(o.value=!0,n.value=-1,await f.httpCall(t.readResource,t.readData).then(a=>{if(o.value=!1,!a.success){i.value=!1,n.value=a.httpStatus,s("error",a.httpStatus);return}i.value=!0,d.value=a.data,S.value=a.perms,s("read",a)})),A=e.computed(()=>o.value?!1:t.title||!!y["post-title"]);e.watch(()=>t.modelValue,a=>d.value=a),e.watch(d,()=>s("update:modelValue",d.value)),e.watch(S,()=>s("perms",S.value)),t.readResource&&C();const P=(a,l)=>{if(o.value=!1,n.value=l.httpStatus,!l.success){u.value=!0,s("error",l.httpStatus);return}u.value=!0,s("drop",l)},U=(a,l)=>{if(o.value=!1,n.value=l.httpStatus,!l.success){u.value=!0,s("error",l.httpStatus);return}u.value=!0;let h=t.saveIsCreate?"create":"update";s(h,l)},D=()=>{o.value=!0,n.value=-1},B=()=>{o.value=!1};return v({doDrop:()=>{k.value&&typeof k.value.click=="function"&&k.value.click()},doRefresh:C,doSave:()=>{m.value&&typeof m.value.click=="function"&&m.value.click()}}),(a,l)=>{const h=e.resolveComponent("lkt-button"),z=e.resolveComponent("lkt-field-switch"),b=e.resolveComponent("lkt-http-info"),F=e.resolveComponent("lkt-loader");return e.openBlock(),e.createElementBlock("article",g,[A.value?(e.openBlock(),e.createElementBlock("header",_,[e.createElementVNode("h1",V,e.toDisplayString(r.title),1),e.createElementVNode("div",w,[e.renderSlot(a.$slots,"post-title",{item:d.value,loading:o.value})])])):e.createCommentVNode("",!0),e.withDirectives(e.createElementVNode("div",L,[e.withDirectives(e.createVNode(h,{ref:p=>k.value=p,palette:"danger",disabled:r.dropDisabled,"confirm-modal":r.dropConfirm,resource:r.dropResource,"resource-data":r.dropData,onLoading:D,onLoaded:B,onClick:P},{default:e.withCtx(()=>[e.unref(y)["button-drop"]?e.renderSlot(a.$slots,"button-drop",{key:0,item:d.value,editMode:c.value}):(e.openBlock(),e.createElementBlock("span",q,e.toDisplayString(r.dropText),1))]),_:3},8,["disabled","confirm-modal","resource","resource-data"]),[[e.vShow,!o.value&&c.value&&i.value]]),e.withDirectives(e.createVNode(h,{ref:p=>m.value=p,palette:"success",disabled:H.value,"confirm-modal":$.value,resource:j.value,"resource-data":O.value,onLoading:D,onLoaded:B,onClick:U},{default:e.withCtx(()=>[e.unref(y)["button-save"]?e.renderSlot(a.$slots,"button-save",{key:0,item:d.value,editMode:c.value}):(e.openBlock(),e.createElementBlock("span",I,e.toDisplayString(r.saveText),1))]),_:3},8,["disabled","confirm-modal","resource","resource-data"]),[[e.vShow,!o.value&&c.value&&i.value]]),e.withDirectives(e.createVNode(z,{modelValue:c.value,"onUpdate:modelValue":l[0]||(l[0]=p=>c.value=p),label:r.editModeText},null,8,["modelValue","label"]),[[e.vShow,!o.value&&i.value]])],512),[[e.vShow,i.value]]),o.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",R,[i.value?(e.openBlock(),e.createElementBlock("div",E,[u.value?(e.openBlock(),e.createBlock(b,{key:0,code:n.value,quick:"",palette:n.value===200?"success":"danger","can-close":"",onClose:l[1]||(l[1]=p=>u.value=!1)},null,8,["code","palette"])):e.createCommentVNode("",!0),e.renderSlot(a.$slots,"item",{item:d.value,loading:o.value,editMode:c.value})])):(e.openBlock(),e.createBlock(b,{key:1,code:n.value},null,8,["code"]))])),o.value?(e.openBlock(),e.createBlock(F,{key:2})):e.createCommentVNode("",!0)])}}});return{install:(r,v={})=>{r.component("LktItemCrud",x)}}});
1
+ (function(e,f){typeof exports=="object"&&typeof module<"u"?module.exports=f(require("vue"),require("lkt-http-client"),require("lkt-data-state")):typeof define=="function"&&define.amd?define(["vue","lkt-http-client","lkt-data-state"],f):(e=typeof globalThis<"u"?globalThis:e||self,e.LktItemCrud=f(e.Vue,e.LktHttpClient,e.lktDataState))})(this,function(e,f,C){"use strict";const V={class:"lkt-item-crud"},N={key:0,class:"lkt-item-crud_header"},q={class:"lkt-item-crud_header-title"},I={class:"lkt-item-crud_header-slot"},L={class:"lkt-item-crud-buttons"},O={key:1},R={key:1},E={key:1,class:"lkt-item-crud_content"},T={key:0,class:"lkt-grid-1"},x={name:"LktItemCrud",inheritAttrs:!1},J=e.defineComponent({...x,props:{modelValue:{type:Object,required:!1,default:()=>({})},title:{type:String,default:""},editModeText:{type:String,default:"Edition Mode"},saveText:{type:String,default:"Save"},dropText:{type:String,default:"Delete"},readResource:{type:String,required:!0},createResource:{type:String,required:!1},updateResource:{type:String,required:!1},dropResource:{type:String,required:!1},readData:{type:Object,required:!1,default:()=>({})},createData:{type:Object,required:!1,default:()=>({})},updateData:{type:Object,required:!1,default:()=>({})},dropData:{type:Object,required:!1,default:()=>({})},saveIsCreate:{type:Boolean,default:!1},createConfirm:{type:String,default:""},updateConfirm:{type:String,default:""},dropConfirm:{type:String,default:""},createDisabled:{type:Boolean,default:!1},updateDisabled:{type:Boolean,default:!1},dropDisabled:{type:Boolean,default:!1}},emits:["update:modelValue","read","create","update","drop","perms","error","modified-data"],setup(r,{expose:D,emit:M}){const a=r,y=e.useSlots(),d=M;let $=[];const l=e.ref(!0),s=e.ref(a.modelValue),v=e.ref($),i=e.ref(!1),c=e.ref(!1),u=e.ref(!1),n=e.ref(200),m=e.ref(null),k=e.ref(null),h=e.ref(new C.DataState(JSON.parse(JSON.stringify(s.value)))),j=e.computed(()=>a.saveIsCreate?a.createConfirm:a.updateConfirm),H=e.computed(()=>a.saveIsCreate?a.createResource:a.updateResource),A=e.computed(()=>a.saveIsCreate?a.createData:a.updateData),P=e.computed(()=>a.saveIsCreate?a.createDisabled:a.updateDisabled),g=async()=>(l.value=!0,n.value=-1,await f.httpCall(a.readResource,a.readData).then(t=>{if(l.value=!1,!t.success){c.value=!1,n.value=t.httpStatus,d("error",t.httpStatus);return}c.value=!0,s.value=t.data,v.value=t.perms,h.value=new C.DataState(JSON.parse(JSON.stringify(s.value))),d("read",t)})),U=e.computed(()=>l.value?!1:a.title||!!y["post-title"]);e.watch(()=>a.modelValue,t=>{s.value=t,h.value.increment(JSON.parse(JSON.stringify(t)))},{deep:!0}),e.watch(s,t=>{d("update:modelValue",s.value),h.value.increment(JSON.parse(JSON.stringify(t)))},{deep:!0}),e.watch(v,()=>d("perms",v.value));const B=e.computed(()=>P.value?!1:h.value.changed());e.watch(B,t=>d("modified-data",t)),a.readResource&&g();const z=(t,o)=>{if(l.value=!1,n.value=o.httpStatus,!o.success){u.value=!0,d("error",o.httpStatus);return}u.value=!0,d("drop",o)},F=(t,o)=>{if(l.value=!1,n.value=o.httpStatus,!o.success){u.value=!0,d("error",o.httpStatus);return}u.value=!0;let S=a.saveIsCreate?"create":"update";d(S,o)},b=()=>{l.value=!0,n.value=-1},_=()=>{l.value=!1};return D({doDrop:()=>{k.value&&typeof k.value.click=="function"&&k.value.click()},doRefresh:g,doSave:()=>{m.value&&typeof m.value.click=="function"&&m.value.click()}}),(t,o)=>{const S=e.resolveComponent("lkt-button"),G=e.resolveComponent("lkt-field-switch"),w=e.resolveComponent("lkt-http-info"),K=e.resolveComponent("lkt-loader");return e.openBlock(),e.createElementBlock("article",V,[U.value?(e.openBlock(),e.createElementBlock("header",N,[e.createElementVNode("h1",q,e.toDisplayString(r.title),1),e.createElementVNode("div",I,[e.renderSlot(t.$slots,"post-title",{item:s.value,loading:l.value})])])):e.createCommentVNode("",!0),e.withDirectives(e.createElementVNode("div",L,[e.withDirectives(e.createVNode(S,{ref:p=>k.value=p,palette:"danger",disabled:r.dropDisabled,"confirm-modal":r.dropConfirm,resource:r.dropResource,"resource-data":r.dropData,onLoading:b,onLoaded:_,onClick:z},{default:e.withCtx(()=>[e.unref(y)["button-drop"]?e.renderSlot(t.$slots,"button-drop",{key:0,item:s.value,editMode:i.value}):(e.openBlock(),e.createElementBlock("span",O,e.toDisplayString(r.dropText),1))]),_:3},8,["disabled","confirm-modal","resource","resource-data"]),[[e.vShow,!l.value&&i.value&&c.value]]),e.withDirectives(e.createVNode(S,{ref:p=>m.value=p,palette:"success",disabled:!B.value,"confirm-modal":j.value,resource:H.value,"resource-data":A.value,onLoading:b,onLoaded:_,onClick:F},{default:e.withCtx(()=>[e.unref(y)["button-save"]?e.renderSlot(t.$slots,"button-save",{key:0,item:s.value,editMode:i.value}):(e.openBlock(),e.createElementBlock("span",R,e.toDisplayString(r.saveText),1))]),_:3},8,["disabled","confirm-modal","resource","resource-data"]),[[e.vShow,!l.value&&i.value&&c.value]]),e.withDirectives(e.createVNode(G,{modelValue:i.value,"onUpdate:modelValue":o[0]||(o[0]=p=>i.value=p),label:r.editModeText},null,8,["modelValue","label"]),[[e.vShow,!l.value&&c.value]])],512),[[e.vShow,c.value]]),l.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",E,[c.value?(e.openBlock(),e.createElementBlock("div",T,[u.value?(e.openBlock(),e.createBlock(w,{key:0,code:n.value,quick:"",palette:n.value===200?"success":"danger","can-close":"",onClose:o[1]||(o[1]=p=>u.value=!1)},null,8,["code","palette"])):e.createCommentVNode("",!0),e.renderSlot(t.$slots,"item",{item:s.value,loading:l.value,editMode:i.value})])):(e.openBlock(),e.createBlock(w,{key:1,code:n.value},null,8,["code"]))])),l.value?(e.openBlock(),e.createBlock(K,{key:2})):e.createCommentVNode("",!0)])}}}),Q="";return{install:(r,D={})=>{r.component("LktItemCrud",J)}}});
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ .lkt-item-crud,.lkt-item-crud_content{display:flex;flex-direction:column;gap:15px}.lkt-item-crud-buttons{position:sticky;top:0;display:flex;align-items:center;gap:var(--gap)}.lkt-item-crud-buttons>:last-child{margin-left:auto}
@@ -1,4 +1,5 @@
1
1
  import { App } from "vue";
2
+ import "./../lkt-item-crud.css";
2
3
  declare const LktItemCrud: {
3
4
  install: (app: App, options?: {}) => void;
4
5
  };
@@ -93,11 +93,12 @@ declare const _default: {
93
93
  onRead?: ((...args: any[]) => any) | undefined;
94
94
  onCreate?: ((...args: any[]) => any) | undefined;
95
95
  onPerms?: ((...args: any[]) => any) | undefined;
96
+ "onModified-data"?: ((...args: any[]) => any) | undefined;
96
97
  }, {
97
98
  doDrop: () => void;
98
99
  doRefresh: () => Promise<void>;
99
100
  doSave: () => void;
100
- }, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("error" | "drop" | "update" | "update:modelValue" | "read" | "create" | "perms")[], import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps & Readonly<import("vue").ExtractPropTypes<{
101
+ }, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("error" | "drop" | "update" | "update:modelValue" | "read" | "create" | "perms" | "modified-data")[], import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps & Readonly<import("vue").ExtractPropTypes<{
101
102
  modelValue: {
102
103
  type: ObjectConstructor;
103
104
  required: false;
@@ -191,6 +192,7 @@ declare const _default: {
191
192
  onRead?: ((...args: any[]) => any) | undefined;
192
193
  onCreate?: ((...args: any[]) => any) | undefined;
193
194
  onPerms?: ((...args: any[]) => any) | undefined;
195
+ "onModified-data"?: ((...args: any[]) => any) | undefined;
194
196
  }, {
195
197
  title: string;
196
198
  modelValue: Record<string, any>;
@@ -309,6 +311,7 @@ declare const _default: {
309
311
  onRead?: ((...args: any[]) => any) | undefined;
310
312
  onCreate?: ((...args: any[]) => any) | undefined;
311
313
  onPerms?: ((...args: any[]) => any) | undefined;
314
+ "onModified-data"?: ((...args: any[]) => any) | undefined;
312
315
  }, {
313
316
  doDrop: () => void;
314
317
  doRefresh: () => Promise<void>;
@@ -428,11 +431,12 @@ declare const _default: {
428
431
  onRead?: ((...args: any[]) => any) | undefined;
429
432
  onCreate?: ((...args: any[]) => any) | undefined;
430
433
  onPerms?: ((...args: any[]) => any) | undefined;
434
+ "onModified-data"?: ((...args: any[]) => any) | undefined;
431
435
  }, {
432
436
  doDrop: () => void;
433
437
  doRefresh: () => Promise<void>;
434
438
  doSave: () => void;
435
- }, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("error" | "drop" | "update" | "update:modelValue" | "read" | "create" | "perms")[], "error" | "drop" | "update" | "update:modelValue" | "read" | "create" | "perms", {
439
+ }, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("error" | "drop" | "update" | "update:modelValue" | "read" | "create" | "perms" | "modified-data")[], "error" | "drop" | "update" | "update:modelValue" | "read" | "create" | "perms" | "modified-data", {
436
440
  title: string;
437
441
  modelValue: Record<string, any>;
438
442
  editModeText: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lkt-item-crud",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "",
5
5
  "main": "src/index.ts",
6
6
  "module": "src/index.ts",
@@ -60,6 +60,7 @@
60
60
  },
61
61
  "dependencies": {
62
62
  "lkt-button": "^1.0.14",
63
+ "lkt-data-state": "^1.0.9",
63
64
  "lkt-events": "^1.0.2",
64
65
  "lkt-field-switch": "^1.0.0",
65
66
  "lkt-http-client": "^1.0.12",
package/src/index.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import {App} from "vue";
2
2
  import {default as itemCrud} from "./lib-components/LktItemCrud.vue";
3
3
 
4
+ import "./../lkt-item-crud.css";
4
5
 
5
6
  const LktItemCrud = {
6
7
  install: (app: App, options = {}) => {
@@ -5,6 +5,7 @@ export default {name: "LktItemCrud", inheritAttrs: false}
5
5
  <script setup lang="ts">
6
6
  import {ref, watch, useSlots, computed} from "vue";
7
7
  import {httpCall, HTTPResponse} from "lkt-http-client";
8
+ import {DataState} from "lkt-data-state";
8
9
 
9
10
  const props = defineProps({
10
11
  modelValue: {type: Object, required: false, default: () => ({})},
@@ -36,7 +37,7 @@ const props = defineProps({
36
37
 
37
38
  const slots = useSlots();
38
39
 
39
- const emit = defineEmits(['update:modelValue', 'read', 'create', 'update', 'drop', 'perms', 'error']);
40
+ const emit = defineEmits(['update:modelValue', 'read', 'create', 'update', 'drop', 'perms', 'error', 'modified-data']);
40
41
 
41
42
  let basePerms: string[] = [];
42
43
 
@@ -50,6 +51,7 @@ const isLoading = ref(true),
50
51
  saveButton = ref(null),
51
52
  dropButton = ref(null);
52
53
 
54
+ const dataState = ref(new DataState(JSON.parse(JSON.stringify(item.value))));
53
55
 
54
56
  const saveConfirm = computed(() => {
55
57
  return props.saveIsCreate
@@ -86,6 +88,7 @@ const fetchItem = async () => {
86
88
  httpSuccessRead.value = true;
87
89
  item.value = r.data;
88
90
  perms.value = r.perms;
91
+ dataState.value = new DataState(JSON.parse(JSON.stringify(item.value)));
89
92
  emit('read', r);
90
93
  });
91
94
  }
@@ -96,10 +99,23 @@ const displayHeader = computed(() => {
96
99
  return props.title || !!slots['post-title'];
97
100
  })
98
101
 
99
- watch(() => props.modelValue, v => item.value = v);
100
- watch(item, () => emit('update:modelValue', item.value));
102
+ watch(() => props.modelValue, v => {
103
+ item.value = v;
104
+ dataState.value.increment(JSON.parse(JSON.stringify(v)));
105
+ }, {deep: true});
106
+ watch(item, (v) => {
107
+ emit('update:modelValue', item.value);
108
+ dataState.value.increment(JSON.parse(JSON.stringify(v)));
109
+ }, {deep: true});
101
110
  watch(perms, () => emit('perms', perms.value));
102
111
 
112
+ const ableToSave = computed(() => {
113
+ if (saveDisabled.value) return false;
114
+
115
+ return dataState.value.changed();
116
+ })
117
+ watch(ableToSave, (v) => emit('modified-data', v));
118
+
103
119
  // Fetch item
104
120
  if (props.readResource) fetchItem();
105
121
 
@@ -180,7 +196,7 @@ defineExpose({
180
196
  :ref="(el:any) => saveButton = el"
181
197
  v-show="!isLoading && editMode && httpSuccessRead"
182
198
  palette="success"
183
- v-bind:disabled="saveDisabled"
199
+ v-bind:disabled="!ableToSave"
184
200
  v-bind:confirm-modal="saveConfirm"
185
201
  v-bind:resource="saveResource"
186
202
  v-bind:resource-data="saveData"
@@ -198,7 +214,8 @@ defineExpose({
198
214
  <div class="lkt-item-crud_content" v-if="!isLoading">
199
215
  <div v-if="httpSuccessRead" class="lkt-grid-1">
200
216
  <lkt-http-info :code="httpStatus" v-if="showStoreMessage" quick
201
- :palette="httpStatus === 200 ? 'success' : 'danger'" can-close v-on:close="showStoreMessage = false"></lkt-http-info>
217
+ :palette="httpStatus === 200 ? 'success' : 'danger'" can-close
218
+ v-on:close="showStoreMessage = false"></lkt-http-info>
202
219
  <slot name="item" v-bind:item="item" v-bind:loading="isLoading" v-bind:edit-mode="editMode"></slot>
203
220
  </div>
204
221
  <lkt-http-info :code="httpStatus" v-else></lkt-http-info>